hadoop - Spark 任务如何访问 HDFS?

标签 hadoop apache-spark hdfs

假设

  • Spark 应用程序的输入是 HDFS 上的 1GB 文本文件,
  • HDFS block 大小为 16MB,
  • Spark 集群有 4 个工作节点。

在应用的第一阶段,我们通过sc.textFile("hdfs://...")从HDFS读取文件。由于 block 大小为 16MB,此阶段将有 64 个任务(每个分区/ block 一个任务)。这些任务将被分派(dispatch)到集群节点。我的问题是:

  1. 是每个单独的任务从 HDFS 获取自己的 block ,还是驱动程序在分派(dispatch)任务之前获取所有任务的数据,然后将数据发送到节点?
  2. 如果每个任务自己从 HDFS 获取自己的 block ,它是向 HDFS 请求特定 block ,还是获取整个文件然后处理自己的 block ?
  3. 假设 HDFS 在其中一个节点(比如节点一)上没有文本文件的副本。 HDFS是否会在节点一的任务第一次请求文件 block 时在节点一上复制文件?如果不是,是否意味着每次任务从节点 1 请求文件 block 时,它都必须等待 HDFS 从其他节点获取数据?

谢谢!

最佳答案

总的来说,Spark 访问 HDFS 的效率可能和您认为的一样高。 Spark 使用 Hadoop 的 FileSystem 对象来访问 HDFS 中的数据。

Does each individual task fetch its own block from HDFS, or does the driver fetch the data for all tasks before dispatching them, and then sends data to the nodes?

每个任务从 HDFS 中获取自己的 block 。

If each task fetches its own block from HDFS by itself, does it ask HDFS for a specific block, or does it fetch the whole file and then processes its own block?

它拉取一个特定的 block 。它不会扫描整个文件以到达 block 。

Suppose that HDFS doesn't have a copy of the text file on one of the nodes, say node one. Does HDFS make a copy of the file on node one first time a task from node one asks for a block of the file? If not, does it mean that each time a task asks for a block of the file from node one, it has to wait for HDFS to fetch data from other nodes?

Spark 将尝试根据分区在 RDD 中的位置首选项来分配任务。对于 HadoopRDD(您从 sc.textFile 获得),每个分区的位置首选项是具有本地 block 的数据节点集。如果一个任务不能在数据本地运行,它将在一个单独的节点上运行,并且该 block 将从具有该 block 的数据节点流式传输到正在该 block 上执行的任务。

关于hadoop - Spark 任务如何访问 HDFS?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38284210/

相关文章:

scala - Spark 数据帧到嵌套映射

java - 在Spark Streaming中,是否可以将批量数据从kafka更新插入到Hive?

python - 如何使用python将模型存储到hdfs

hadoop - hadoop安装路径在节点之间是否应该相同

hadoop - 命令用法 :when to use hadoop fs and hdfs dfs

docker - 如何远程运行spark-submit?

mysql - Sqoop 导入 MySql 数据库失败

hadoop - 如何在我的Spark Streaming应用程序中移动文件

java - 错误原因 java.lang.IndexOutOfBoundsException : Index: 0, Size: 0

hadoop - 运行 Spark 作业时,YARN 不会基于公平份额抢占资源