addfile它是如何工作的

fv2wmkja  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(358)

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

wixjitnu

wixjitnu1#

addFile 只是为了实验。它不是用于生产的。在生产环境中,您只需打开一个由hadoop理解的uri指定的文件。例如:

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

gopyfrb32#

你指的那部分介绍 SparkContext::addFile 在一个混乱的背景下。这是一个标题为“将数据加载到rdd”的部分,但它立即偏离了这个目标并引入了 SparkContext::addFile 一般来说,这是一种将数据输入spark的方法。在接下来的几页中,它将介绍一些将数据“导入rdd”的实际方法,例如 SparkContext::parallelize 以及 SparkContext::textFile . 这些解决了在节点之间拆分数据而不是将整个数据复制到所有节点的问题。
一个真实的生产用例 SparkContext::addFile 使一个配置文件对某些只能从磁盘上的文件进行配置的库可用。例如,当使用maxmind的geoip legacy api时,可以将lookup对象配置为在分布式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。

相关问题