spark任务如何访问hdfs?

44u64gxh  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(535)

假设
spark应用程序的输入是hdfs上的1gb文本文件,
hdfs块大小为16mb,
spark集群有4个工作节点。
在应用程序的第一阶段,我们通过 sc.textFile("hdfs://...") . 由于块大小为16mb,因此此阶段将有64个任务(每个分区/块一个任务)。这些任务将被分派到集群节点。我的问题是:
是每个单独的任务从hdfs获取自己的块,还是驱动程序在分派任务之前获取所有任务的数据,然后将数据发送到节点?
如果每个任务自己从hdfs中提取自己的块,它是向hdfs请求特定的块,还是提取整个文件然后处理自己的块?
假设hdfs在其中一个节点(比如node one)上没有文本文件的副本。当node one的任务第一次请求文件块时,hdfs是否在node one上复制文件?如果不是,是否意味着每次任务从节点1请求文件块时,它都必须等待hdfs从其他节点获取数据?
谢谢!

qxgroojn

qxgroojn1#

一般来说,spark对hdfs的访问可能和您认为的一样高效。spark使用hadoop的 FileSystem 对象来访问hdfs中的数据。
是每个单独的任务从hdfs获取自己的块,还是驱动程序在分派任务之前获取所有任务的数据,然后将数据发送到节点?
每个任务从hdfs获取自己的块。
如果每个任务自己从hdfs中提取自己的块,它是向hdfs请求特定的块,还是提取整个文件然后处理自己的块?
它拉一个特定的块。它不会扫描整个文件以到达块。
假设hdfs在其中一个节点(比如node one)上没有文本文件的副本。当node one的任务第一次请求文件块时,hdfs是否在node one上复制文件?如果不是,是否意味着每次任务从节点1请求文件块时,它都必须等待hdfs从其他节点获取数据?
spark将尝试根据rdd中分区的位置首选项来分配任务。如果是 HadoopRDD (你从 sc.textFile ),每个分区的位置首选项是具有本地块的数据节点集。如果任务不能在数据的本地运行,它将在单独的节点上运行,并且该块将从具有该块的datanode流式传输到正在该块上执行的任务。

相关问题