我正在分析Hadoop MapReduce作业中的大量文件,输入文件采用.txt格式。我的mapper和reducer都是用Python编写的。
但是,我的mapper模块需要访问外部csv文件的内容,这个文件基本上只是一个大表,用于查找映射器正在执行的转换的参考值。
到目前为止,我只是让映射器将文件从本地目录加载到内存中,以使其可用作Python变量。由于文件非常大(几千行和几列),因此加载需要相对较长的时间(大约10秒,对我来说太长了)。问题是Hadoop似乎为每个新的输入文件重新执行mapper-script,或者它将大的输入文件拆分成较小的输入文件,导致我的csv文件在每次新的输入时不必要地一次又一次地加载到内存中 - 文件已处理。
有没有办法让Hadoop只加载一次文件并以某种方式让它“全局”可用?谷歌搜索Hive,猪,sqlite这样的名字时突然出现,但我从未见过任何例子来检查这些是否真的对这个目的有用。
基本上,我只需要在运行Hadoop作业时快速访问某种数据库或字典。我的参考表的格式不一定是CSV,我可以非常灵活地将数据转换为不同的格式。
答案 0 :(得分:0)
是的,请查看您的hadoop流命令行的-files option。这将把你加载到HDFS中的文件和在每个tasktracker节点上本地缓存它的一个副本,并为每个mapper和reducer任务的CWD建立一个软链接。
如果你有要与你的工作捆绑的罐子,还有-archives选项。
答案 1 :(得分:0)
你应该看看Sqoop。它将数据从数据库导入HDFS,以便您可以使用Map Reduce处理它。