我试图了解hadoop是如何工作的。假设我在hdfs上有10个目录,它包含100个我想用spark处理的文件。
在书中-使用Spark进行快速数据处理
,这要求文件在集群中的所有节点上都可用,这并不是很多。
本地模式的问题。在分布式模式下,您将需要使用Spark的
addFile功能可将文件复制到群集中的所有计算机。
我不明白这一点,将在每个节点上触发创建文件的副本。
我想要的是它应该读取该目录中存在的文件(如果该节点上存在该目录)
抱歉,我有点困惑,如何处理上述情况。
问候
最佳答案
The section you're referring to在一个混乱的上下文中引入了SparkContext::addFile
。这是标题为“将数据加载到RDD中”的部分,但是它立即偏离了该目标,并更普遍地引入SparkContext::addFile
作为将数据获取到Spark中的一种方式。在接下来的几页中,它介绍了一些将数据“放入RDD”的实际方法,例如SparkContext::parallelize
和SparkContext::textFile
。这些解决了您对在节点之间拆分数据而不是将整个数据复制到所有节点的担忧。SparkContext::addFile
的实际生产用例是使配置文件可用于某些只能从磁盘上的文件进行配置的库。例如,当使用MaxMind的GeoIP Legacy API时,您可以配置查找对象以用于像这样的分布式 map (作为某些类的字段):
@transient lazy val geoIp = new LookupService("GeoIP.dat", LookupService.GEOIP_MEMORY_CACHE | LookupService.GEOIP_CHECK_CACHE)
在 map 功能之外,您需要像下面这样使GeoIP.dat可用:
sc.addFile("/path/to/GeoIP.dat")
然后,Spark将使其在所有节点上的当前工作目录中可用。
因此,与Daniel Darabos的回答相反,出于实验原因,除了
SparkContext::addFile
之外,还有一些原因。另外,我在文档中找不到任何会使人相信该功能尚未投入生产的信息。但是,我同意,除非用于交互式Spark REPL中的实验,否则它不是用来加载要处理的数据的,因为它不会创建RDD。