Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hadoop Spark任务如何访问HDFS?_Hadoop_Apache Spark_Hdfs - Fatal编程技术网

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个任务(每个分区/块一个任务)。这些任务将被分派到集群节点。我的问题是:

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

  • 谢谢

    一般来说,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个任务。