【问题标题】:Spark RDD partitions vs. Hadoop SplitsSpark RDD 分区与 Hadoop 拆分
【发布时间】:2017-02-17 14:09:59
【问题描述】:

我很难理解 RDD 分区和 HDFS 输入拆分之间的区别。所以基本上当你提交一个 Spark 应用程序时:

当 Spark 应用程序想要从 HDFS 读取数据时,HDFS 上的该文件将具有输入拆分(假设每个拆分为 64 mb,并且这些输入拆分中的每一个都存在于不同的数据节点上)。

现在假设 Spark 应用程序想要使用 (sc.textFile(PATH_IN_HDFS)) 从 HDFS 加载该文件。该文件约为 256 mb,有 4 个输入拆分,其中 2 个拆分位于数据节点 1 上,另外 2 个拆分位于数据节点 2 上。

现在,当 Spark 将这 256 mb 加载到它的 RDD 抽象中时,它会将每个输入拆分 (64mb) 加载到 4 个单独的 RDD 中(您将在数据节点 1 中拥有 2 个具有 64mb 数据的 RDD 和另外两个 RDD数据节点 2) 上的 64mb 数据。或者 RDD 会在 Hadoop 上进一步划分这些输入拆分吗?那么这些分区将如何重新分配呢? 我不明白RDD分区和HDFS输入拆分之间是否存在关联?

【问题讨论】:

    标签: hadoop apache-spark hdfs


    【解决方案1】:

    我对 Spark 还很陌生,但拆分与 MapReduce 作业密切相关。 Spark 以分布式方式将数据加载到内存中,哪些机器将加载数据可能取决于数据的位置(阅读:在某种程度上取决于数据块的位置,这非常接近拆分的想法)。 Sparks APIs 允许你从 RDD 的角度思考,不再分裂。 您将在 RDD 上工作,如何将数据分布到 RDD 中不再是程序员的问题。 Spark 下的整个数据集称为 RDD。

    【讨论】:

    • 那么分区在 RDD 中是如何工作的呢?就像你说的“你在火花下的整个数据集,被称为 RDD”。那么RDD如何对从HDFS获取的全部数据进行分区呢?
    • 每个节点都加载它的部分。 Spark 将与 YARN 对话,YARN 将分配请求的资源。数据局部性始终是最好的,但并不总是得到保证。在此级别上,您正在处理数据块并没有拆分。文件的块被加载到具有由 YARN 分配的容器的数据节点中,希望这些节点与保存数据的节点相同。
    • 因此 Spark 将与 YARN 对话以分配请求的资源,以对 HDFS 中的指定数据集运行 Spark 转换和操作。我不认为你在回答我的问题,当 Spark 应用程序被发送到执行程序(HDFS 中的数据节点)并且来自 HDFS 输入拆分的数据被放入 RDD 抽象时,RDD 是否进一步分区它从 HDFS 拆分获得的全部数据?
    • 您的数据存储在运行为 Spark 作业分配的容器的数据节点的内存中。每个节点都在这个数据分区上工作。也许您想知道从 datanode 读取的数据是如何在计算节点之间分布的。 Spark 将为集群的每个分区运行一个任务。通常,Spark 会尝试根据您的集群自动设置分区数。不过,您也可以手动设置。
    • 也许这会对你有所帮助:spark programming guide
    【解决方案2】:

    希望以下答案对您有所帮助。

    当 Spark 从 HDFS 读取文件时,它会为单个输入拆分创建单个分区。

    如果您有一个 30GB 的文本文件存储在 HDFS 上,那么使用默认的 HDFS 块大小设置 (128MB) 它将存储在 235 个块中,这意味着您从该文件中读取的 RDD 将具有 235 个分区。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-24
      • 1970-01-01
      • 2019-06-16
      • 1970-01-01
      • 2020-09-18
      • 2016-01-04
      • 1970-01-01
      相关资源
      最近更新 更多