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



我正在努力理解hadoop是如何工作的。假设我在hdfs上有10个目录,其中包含100个文件,我想用spark处理这些文件。

书中-Spark 的快速数据处理

这要求文件在集群中的所有节点上都可用本地模式的问题。在分布式模式下,您将希望使用Spark的addFile功能将文件复制到集群中的所有机器

我不能理解这一点,会在每个节点上创建文件的副本。我想要的是它应该读取该目录中的文件(如果该目录存在于该节点上)对不起,我有点困惑,如何在火花中处理上述情况。关于

您所指的部分在令人困惑的上下文中介绍了SparkContext::addFile。这是一个标题为"将数据加载到RDD中"的部分,但它立即偏离了这一目标,并引入了SparkContext::addFile作为将数据获取到Spark中的一种方法。在接下来的几页中,它介绍了一些将数据"放入RDD"的实际方法,如SparkContext::parallelizeSparkContext::textFile。这些解决了您对在节点之间拆分数据而不是将整个数据复制到所有节点的担忧。

SparkContext::addFile的一个实际生产用例是使某个库可以使用配置文件,而该库只能从磁盘上的文件进行配置。例如,当使用MaxMind的GeoIP Legacy 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。

addFile仅用于实验。它不是生产用的。在生产中,您只需打开一个由Hadoop理解的URI指定的文件。例如:

sc.textFile("s3n://bucket/file")

最新更新