我正在努力理解,Spark中的分区是什么?
我的理解是,当我们从一个源读取并放置到任何特定的Datatset
中时,该数据集可以被拆分为多个sub-Datasets
,这些sub-Datasets
被称为分区及其在集群中的分布位置和方式。这是正确的吗?
当我读到一些网上文章时,我产生了怀疑,上面写着
在引擎盖下,这些
RDDs or Datasets
存储在不同的集群节点。分区基本上是大型分布式数据集
这句话打破了我的底线。如上所述,RDDs or Datasets
位于分区内。但我认为RDD本身就是一个分区(在拆分之后(。
有人能帮我澄清这个疑问吗?
这是我的代码片段,我在其中读取JSON。
Dataset<Row> ds = spark.read().schema(Jsonreadystructure.SCHEMA)
.json(JsonPath);
所以,在阅读它本身的时候,我如何将其拆分为多重分区?或者有其他办法吗?
什么是分区?
根据spark文档,spark中的分区是存储在集群中某个节点上的数据(数据的逻辑划分(。分区是Apache Spark中的基本并行单元。中的RDD/Dataframe/DatasetApache Spark是分区的集合。
所以,当你做时
Dataset<Row> ds = spark.read().schema(Jsonreadystructure.SCHEMA)
.json(JsonPath);
spark读取源json数据并创建一个(分区数据的逻辑划分(,然后在集群中并行处理这些分区。
例如,用外行的话来说。。。如果你有一项任务要把1吨小麦从一个地方移到另一个地方,而你只有1个人的资源(类似于一个线程(来完成这项任务。所以这里有很多可能性。1( 你的资源可能无法一次移动这么大的重量。(类似于你没有足够的CPU或RAM(2( 如果它有能力(类似于high-conf机器(,那么它可能会花费大量时间,并且可能会压力过大。3( 当您的资源进行负载传输时,它无法处理介于两者之间的任何其他进程。很快。。。。。
如果你把1吨小麦分成1公斤小麦块(类似于数据上的逻辑分区(,雇佣更多的人,然后要求你的资源转移,该怎么办。现在,这对他们来说要容易得多,你可以添加更多的人力资源(类似于扩大集群(,并且可以非常容易和快速地完成你的实际任务。
类似于上面的方法,spark对数据进行了逻辑划分,这样您就可以优化地使用集群资源并行处理数据,并且可以更快地完成任务。
注意:RDD/Dataset和Dataframe只是数据逻辑分区的抽象。RDD和Dataframe中还有其他我在示例中没有涉及的概念(即弹性和不变性(
如何将其拆分为多个分区
您可以使用API重新分区来进一步拆分分区
spark.read().schema(Jsonreadystructure.SCHEMA)
.json(JsonPath).**repartition**(number)
您可以使用coalize((api来降低分区。