我正在分析Hadoop MapReduce作业中的大量文件,输入文件为。txt格式。我的映射器和reducer都是用Python编写的。
但是,我的mapper模块需要访问外部csv文件的内容,该文件基本上只是一个大表,用于查找映射器正在执行的转换的参考值。
到目前为止,我只是让映射器将文件从本地目录加载到内存中,使其作为Python变量可用。由于该文件非常大(数千行和列),因此需要相当长的时间才能加载(大约10秒,对我来说太长了)。问题是Hadoop似乎为每个新的输入文件重新执行mapper-script,或者它将大的输入文件分割成较小的文件,导致每次处理新的输入文件时,我的csv文件一次又一次不必要地加载到内存中。是否有一种方法让Hadoop只加载一次文件,并以某种方式使其"全局"可用?在google上搜索Hive、Pig、sqlite等名称时,会弹出一些提示,但我从来没有看到任何例子来验证这些名称是否真的适用于此目的。
基本上,我只需要某种数据库或字典在运行Hadoop工作时快速访问。参考表的格式不一定是CSV,我可以很灵活地将数据转换成不同的格式
是的,查看hadoop流命令行中的-files选项。这将获取一个已经加载到HDFS的文件,并在每个tasktracker节点上本地缓存一个副本,并对每个mapper和reducer任务的CWD进行软链接。
还有-archives选项,如果你想把jar文件和你的作业捆绑在一起。
您可能应该看看Sqoop。它将数据从数据库导入HDFS,以便您可以使用Map Reduce处理它。