Hadoop Spark任务如何访问HDFS?
假设Hadoop Spark任务如何访问HDFS?,hadoop,apache-spark,hdfs,Hadoop,Apache Spark,Hdfs,假设 Spark应用程序的输入是HDFS上的1GB文本文件 HDFS块大小为16MB Spark群集有4个工作节点 在应用程序的第一阶段,我们通过sc.textFile(“hdfs://...)。由于块大小为16MB,此阶段将有64个任务(每个分区/块一个任务)。这些任务将被分派到集群节点。我的问题是: 每个单独的任务是否从HDFS获取自己的块,或者驱动程序是否在分派任务之前获取所有任务的数据,然后将数据发送到节点 如果每个任务自己从HDFS获取自己的块,它是向HDFS请求特定的块,还是获取
- Spark应用程序的输入是HDFS上的1GB文本文件
- HDFS块大小为16MB
- Spark群集有4个工作节点
sc.textFile(“hdfs://...)
。由于块大小为16MB,此阶段将有64个任务(每个分区/块一个任务)。这些任务将被分派到集群节点。我的问题是:
谢谢 一般来说,Spark访问HDFS的效率可能与您认为的一样高。Spark使用Hadoop的
文件系统对象访问HDFS中的数据
每个单独的任务是否从HDFS获取自己的块,或者驱动程序是否在分派任务之前获取所有任务的数据,然后将数据发送到节点
每个任务都从HDFS获取自己的块
如果每个任务自己从HDFS获取自己的块,它是向HDFS请求特定的块,还是获取整个文件然后处理自己的块
它拉动一个特定的块。它不会扫描整个文件以到达块
假设HDFS在其中一个节点(比如节点一)上没有文本文件的副本。当来自node one的任务第一次请求文件块时,HDFS是否在node one上复制文件?若不是,是否意味着每次任务从节点一请求文件块时,它都必须等待HDFS从其他节点获取数据
Spark将尝试根据RDD中分区的位置首选项分配任务。对于HadoopRDD
(从sc.textFile
获取),每个分区的位置首选项是具有块本地的数据节点集。如果任务不能在数据本地运行,它将在单独的节点上运行,并且块将从具有块的datanode流式传输到在块上执行的任务 一般来说,Spark访问HDFS的效率可能与您认为的一样高。Spark使用Hadoop的文件系统对象访问HDFS中的数据
每个单独的任务是否从HDFS获取自己的块,或者驱动程序是否在分派任务之前获取所有任务的数据,然后将数据发送到节点
每个任务都从HDFS获取自己的块
如果每个任务自己从HDFS获取自己的块,它是向HDFS请求特定的块,还是获取整个文件然后处理自己的块
它拉动一个特定的块。它不会扫描整个文件以到达块
假设HDFS在其中一个节点(比如节点一)上没有文本文件的副本。当来自node one的任务第一次请求文件块时,HDFS是否在node one上复制文件?若不是,是否意味着每次任务从节点一请求文件块时,它都必须等待HDFS从其他节点获取数据
Spark将尝试根据RDD中分区的位置首选项分配任务。对于HadoopRDD
(从sc.textFile
获取),每个分区的位置首选项是具有块本地的数据节点集。如果任务不能在数据本地运行,它将在单独的节点上运行,并且块将从具有块的datanode流式传输到在块上执行的任务 非常感谢您的回复。我有一个后续问题。HDFS或Spark是否为任务预取数据?例如,如果节点1将在3个连续块上运行3个任务,那么在获取第一个块时HDFS或Spark会预取这两个连续块吗?值得怀疑。当计算插槽可用时,任务将从队列中拉出。当作业开始时,它们不是完全预先确定的。在这种情况下,Spark在分配另一个任务之前不知道如何对其进行预取。@smz每个块都分配给相应的任务,并且在该任务运行时读取该块。这里没有数据预取。假设您有4个块,如果您的工作节点有4个内核,那么读取这4个块将并行进行。如果您的工作节点只有一个核心,那么读取这些块将按顺序进行,最终您的工作节点将运行4个任务。非常感谢您的回复。我有一个后续问题。HDFS或Spark是否为任务预取数据?例如,如果节点1将在3个连续块上运行3个任务,那么在获取第一个块时HDFS或Spark会预取这两个连续块吗?值得怀疑。当计算插槽可用时,任务将从队列中拉出。当作业开始时,它们不是完全预先确定的。在这种情况下,Spark在分配另一个任务之前不知道如何对其进行预取。@smz每个块都分配给相应的任务,并且在该任务运行时读取该块。这里没有数据预取。假设您有4个块,如果您的工作节点有4个内核,那么读取这4个块将并行进行。如果您的工作节点只有一个核心,那么读取这些块将按顺序进行,最终您的工作节点将运行4个任务。