我想写一个MapReduce代码。我的代码有三个部分:数据准备,MapReduce和数据后期处理。数据准备阶段的输出可以是2D阵列或列表。我的问题是我应该如何向第一阶段的输出提供映射器?我应该将其导出到txt文件并再次导入吗?如果是这样,我应该如何提供文件位置?使用网址?如果没有,我可以直接用映射或数组提供映射器吗?我试图在网上找到类似的案例,但我找不到任何东西。
答案 0 :(得分:1)
好的,你可以将第一步的输出写成一个文件,作为逗号分隔的字符串,即你的列表。所以你的每个列表都是文件中的新行,然后将文件从你的本地文件系统移动到hdfs。然后你可以使用hdfs文件作为map reduce工作的输入来做必要的事情。或者,您是否一次只获得一个列表作为第一份工作的输出?为了将文件从本地文件系统复制到hdfs,您可以使用java API for hdfs文件系统。 Check this link
现在,如果您的第一份工作的输出只是一个2D列表,那么我认为这不适合地图缩减工作,因为它最适合批量数据。
答案 1 :(得分:1)
您的第一份作业会生成一个文件。作业脚本应使用
将文件复制到HDFS中hadoop fs -copyFromLocal /your/local/folder /your/folder/in/hdfs
使用/your/folder/in/hdfs
作为MapReduce作业的输入文件夹。如果map reduce是基于java的,您可以将地图缩小作业称为
hadoop jar yourCode.jar yourDriverClass \
-files any_file_that_you_want_to_be_available_with_job.txt \
-libjars supporting_librarys_if_any.jar \
folder_containing_input_file \
folder_to_expect_output_files
请注意,上面的命令行假定您的驱动程序类使用arg [0]作为输入文件夹,而arg [1]作为输出文件夹
在这种情况下folder_containing_input_file
= /your/folder/in/hdfs
所以回答你的问题
-files
选项。使用-files
使文件像缓存文件一样。