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

时间:2014-04-21 19:53:20

标签: hadoop apache-spark

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

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

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

我无法理解这一点,会在每个节点上创建文件副本。 我想要的是它应该读取该目录中存在的文件(如果该节点上存在该目录) 对不起,我有点困惑,如何在spark中处理上述场景。 问候

2 个答案:

答案 0 :(得分:3)

The section you're referring to在令人困惑的情境中引入了SparkContext::addFile。这是标题为“#34;将数据加载到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

答案 1 :(得分:1)

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

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