【问题标题】:What is partition in Spark?Spark 中的分区是什么?
【发布时间】:2020-09-16 04:50:41
【问题描述】:

我想了解一下,Spark 中的分区是什么?

我的理解是,当我们从一个源读取并放入任何特定的Datatset 时,那么该数据集可以拆分为多个sub-Datasets,那些sub-Datasets 被称为分区及其 upto spark framework where and how它分布在集群中。对吗?

当我阅读一些在线文章时,我产生了疑问,其中说

在后台,这些RDDs or Datasets 存储在 不同的集群节点。分区基本上是一个逻辑块 大型分布式数据集

这句话打破了我的理解。根据上述声明,RDDs or Datasets 位于分区内。但我认为 RDD 本身就是一个分区(拆分后)。

谁能帮我解开这个疑惑?

这是我的代码 sn-p,我从 JSON 读取数据。

Dataset<Row> ds = spark.read().schema(Jsonreadystructure.SCHEMA)
                .json(JsonPath);

所以在阅读自身时,我如何将其拆分为多个分区?或任何其他方式?

【问题讨论】:

    标签: java apache-spark


    【解决方案1】:

    什么是分区?

    根据 spark 文档,spark 中的分区是一个原子块 存储在集群节点上的数据(数据的逻辑划分)。 分区是 Apache Spark 中的基本并行单元。 RDDs/Dataframe/Dataset 在 Apache Spark 是分区的集合。

    所以,当你这样做时

    Dataset<Row> ds = spark.read().schema(Jsonreadystructure.SCHEMA)
                    .json(JsonPath);
    

    spark 读取您的源 json 数据并创建一个(对作为分区的数据进行逻辑划分),然后在集群中并行处理这些分区。

    例如用外行的话... 如果您的任务是将 1 吨重的小麦 从一个地方移动到另一个地方,而您只有 1 个人力资源(类似于单个线程)来执行该任务。那么可以有一个这里有很多可能性。 1)您的资源可能无法一次移动如此巨大的重量。 (类似于你没有足够的 CPU 或 RAM) 2)如果它有能力(类似于高配置机器),那么它可能会花费大量时间并且可能会压力过大。 3)并且您的资源在进行负载转移时无法处理其间的任何其他进程。很快......

    如果你将 1 吨小麦 分成 1kg 小麦块(类似于数据上的逻辑分区)并雇用更多的人,然后让你的资源移动会怎样。 现在对他们来说更容易了,您可以添加更多的男性资源(类似于扩展集群),并且可以非常轻松快速地完成您的实际任务。

    与上述方法类似,spark 对数据进行逻辑划分,以便您可以优化地使用集群资源并行处理数据,并且可以更快地完成任务。

    注意:RDD/Dataset 和 Dataframe 只是数据逻辑分区的抽象。 还有我在示例中没有涉及的 RDD 和 Dataframe 中的其他概念(即弹性和不变性)

    如何将其拆分为多个分区?

    你可以使用 repartition API 来分割更多的分区

    spark.read().schema(Jsonreadystructure.SCHEMA)
                        .json(JsonPath).**repartition**(number)
    

    您可以使用 coalesce() api 来关闭分区。

    【讨论】:

    • 我们可以控制创建分区吗?我们如何指定特定 Dataset 所需的特定分区数?重新分区将是对现有分区的操作,但我们如何指定这些现有分区的计数?
    • 我们可以控制创建分区吗?是的..要计算现有分区的数量,您可以使用 df.rdd。 getNumPartitions
    猜你喜欢
    • 2019-11-13
    • 1970-01-01
    • 2017-04-05
    • 1970-01-01
    • 1970-01-01
    • 2020-02-24
    • 2010-12-21
    • 2010-12-07
    • 1970-01-01
    相关资源
    最近更新 更多