Hadoop Spark(Mapr)-AddFile它是如何工作的

Hadoop Spark(Mapr)-AddFile它是如何工作的,hadoop,apache-spark,Hadoop,Apache Spark,我试图理解hadoop是如何工作的。假设我在hdfs上有10个目录,它包含100个我想用spark处理的文件 书中-使用Spark进行快速数据处理 这要求该文件在集群中的所有节点上都可用,这并不是一个很大的问题 本地模式的问题。在分布式模式下,您需要使用Spark的 addFile功能可将文件复制到群集中的所有计算机 我无法理解这一点,将spark在每个节点上创建文件副本。 我想要的是,如果该目录存在于该节点上,它应该读取该目录中的文件 对不起,我有点困惑,如何在spark中处理上述场景。 ad

我试图理解hadoop是如何工作的。假设我在hdfs上有10个目录,它包含100个我想用spark处理的文件

书中-使用Spark进行快速数据处理

这要求该文件在集群中的所有节点上都可用,这并不是一个很大的问题 本地模式的问题。在分布式模式下,您需要使用Spark的 addFile功能可将文件复制到群集中的所有计算机

我无法理解这一点,将spark在每个节点上创建文件副本。 我想要的是,如果该目录存在于该节点上,它应该读取该目录中的文件 对不起,我有点困惑,如何在spark中处理上述场景。 addFile仅用于实验。它不是用于生产的。在生产环境中,您只需打开一个由Hadoop理解的URI指定的文件。例如:

sc.textFile("s3n://bucket/file")
addFile仅用于实验。它不是用于生产的。在生产环境中,您只需打开一个由Hadoop理解的URI指定的文件。例如:

sc.textFile("s3n://bucket/file")
在混乱的上下文中介绍SparkContext::addFile。这是一个标题为“将数据加载到RDD中”的部分,但它立即偏离了这一目标,更一般地介绍了SparkContext::addFile,作为将数据加载到Spark中的一种方法。在接下来的几页中,它介绍了一些将数据导入RDD的实际方法,如SparkContext::parallelize和SparkContext::textFile。这些解决了在节点之间拆分数据而不是将整个数据复制到所有节点的问题

SparkContext::addFile的一个实际生产用例是使配置文件可用于某些只能从磁盘上的文件进行配置的库。例如,当使用MaxMind的GeoIP遗留API时,您可以将查找对象配置为在分布式地图中使用,如以下所示,作为某个类上的字段:

@transient lazy val geoIp = new LookupService("GeoIP.dat", LookupService.GEOIP_MEMORY_CACHE | LookupService.GEOIP_CHECK_CACHE)
在地图功能之外,您需要使GeoIP.dat可用,如下所示:

sc.addFile("/path/to/GeoIP.dat")
Spark将使其在所有节点上的当前工作目录中可用

因此,与Daniel Darabos的答案相比,使用SparkContext::addFile除了实验之外还有一些原因。此外,我在文档中找不到任何信息,这些信息会让人认为该功能还没有准备好生产。但是,我同意,除非是为了在交互式Spark REPL中进行实验,否则您不想使用它来加载要处理的数据,因为它不会创建RDD。

在混乱的上下文中引入SparkContext::addFile。这是一个标题为“将数据加载到RDD中”的部分,但它立即偏离了这一目标,更一般地介绍了SparkContext::addFile,作为将数据加载到Spark中的一种方法。在接下来的几页中,它介绍了一些将数据导入RDD的实际方法,如SparkContext::parallelize和SparkContext::textFile。这些解决了在节点之间拆分数据而不是将整个数据复制到所有节点的问题

SparkContext::addFile的一个实际生产用例是使配置文件可用于某些只能从磁盘上的文件进行配置的库。例如,当使用MaxMind的GeoIP遗留API时,您可以将查找对象配置为在分布式地图中使用,如以下所示,作为某个类上的字段:

@transient lazy val geoIp = new LookupService("GeoIP.dat", LookupService.GEOIP_MEMORY_CACHE | LookupService.GEOIP_CHECK_CACHE)
在地图功能之外,您需要使GeoIP.dat可用,如下所示:

sc.addFile("/path/to/GeoIP.dat")
Spark将使其在所有节点上的当前工作目录中可用


因此,与Daniel Darabos的答案相比,使用SparkContext::addFile除了实验之外还有一些原因。此外,我在文档中找不到任何信息,这些信息会让人认为该功能还没有准备好生产。但是,我同意,除非用于交互式Spark REPL中的实验,否则您不想使用它来加载要处理的数据,因为它不会创建RDD。

您好,谢谢您的回答。我的问题是-这个文件是否会被复制到集群中的每个节点,比如说如果它是一个小文件否,如果您使用sc.textFile打开它,Spark将使用Hadoop文件API获取拆分块的数量,并将每个拆分作为一个分区打开。因此,集群中的一台机器将读取文件的每个部分。如果是一个小文件,可能只有一个分区。addFile和textFile做的事情不一样,它们用于不同的用例。@davideanastasia同意。在您希望运行外部应用程序的情况下,您将需要addFile。sc.addFilehdfs://sparkmaster:9000/programyouwanttorun.sh;你好,谢谢你的回答。我的问题是-这个文件是否会被复制到集群中的每个节点,比如说如果它是一个小文件否,如果您使用sc.textFile打开它,Spark将使用Hadoop文件API获取拆分块的数量,并将每个拆分作为一个分区打开。所以ea
文件的ch部分将由集群中的一台机器读取。如果是一个小文件,可能只有一个分区。addFile和textFile做的事情不一样,它们用于不同的用例。@davideanastasia同意。在您希望运行外部应用程序的情况下,您将需要addFile。sc.addFilehdfs://sparkmaster:9000/programyouwanttorun.sh;我猜如果没有提供路径,就找不到该文件。我猜如果没有提供路径,就找不到该文件。