我想了解 Spark 中的分区是什么?
我的理解是,当我们从源读取数据并将其放入任何特定的位置Datatset时,该数据集可以分为多个sub-Datasets,这些sub-Datasets称为分区,它取决于 Spark 框架在集群中的位置和分布方式。这是对的吗 ?
当我看到一些网上文章时,我产生了疑问,其中说
在底层,它们
RDDs or Datasets存储在不同集群节点上的分区中。分区基本上是大型分布式数据集的逻辑块
这句话打破了我的理解。根据上述陈述,RDDs or Datasets位于分区内。但我认为 RDD 本身就是一个分区(分割后)。
谁能帮我消除这个疑问?
这是我的代码片段,我正在从 JSON 中读取数据。
Dataset<Row> ds = spark.read().schema(Jsonreadystructure.SCHEMA)
.json(JsonPath);
Run Code Online (Sandbox Code Playgroud)
那么,在阅读本身时,如何将其拆分为多个分区?或者还有其他办法吗?
什么是分区?
根据 Spark 文档,Spark 中的分区是存储在集群中节点上的原子数据块(数据的逻辑划分)。分区是 Apache Spark 中并行性的基本单位。Apache Spark 中的 RDD/Dataframe/Dataset 是分区的集合。
所以,当你这样做时
Dataset<Row> ds = spark.read().schema(Jsonreadystructure.SCHEMA)
.json(JsonPath);
Run Code Online (Sandbox Code Playgroud)
Spark 读取源 json 数据并创建一个(分区数据的逻辑划分),然后在集群中并行处理这些分区。
例如,用外行人的话说...如果您有一项任务将1 吨小麦负载从一个地方移动到另一个地方,并且您只有 1 个人力资源(类似于单个线程)来完成该任务。所以可以有这里有很多可能性。1)您的资源可能无法一次移动如此巨大的重量。(类似于您没有足够的CPU或RAM)2)如果它有能力(类似于高配置机器)那么它可能会花费大量时间并且可能会造成压力。3)并且您的资源在进行负载转移时无法处理其间的任何其他进程。等等.....
如果你把1 吨小麦分成 1 公斤小麦块(类似于数据上的逻辑分区)并雇用更多的人,然后要求你的资源移动,会怎么样?现在对他们来说要容易得多,您可以添加更多的人员资源(类似于扩展集群),并且可以非常轻松快速地完成您的实际任务。
与上述方法类似,spark 对数据进行逻辑划分,以便您可以最佳地使用集群资源并行处理数据,并可以更快地完成任务。
注意:RDD/Dataset 和 Dataframe 只是数据逻辑分区的抽象。RDD 和 Dataframe 中还有其他概念,我在示例中没有介绍(即弹性和不变性)
我怎样才能把它分成多个分区?
您可以使用重新分区API来分割更多分区
spark.read().schema(Jsonreadystructure.SCHEMA)
.json(JsonPath).**repartition**(number)
Run Code Online (Sandbox Code Playgroud)
你可以使用coalesce () api来关闭分区。