我想写一个MapReduce代码。我的代码有三个部分:数据准备、MapReduce和数据后处理。数据准备阶段的输出可以是2D阵列或列表。我的问题是,我应该如何向映射器提供第一阶段的输出?我应该将其导出到txt文件中并再次导入吗?如果是,我应该如何提供文件位置?使用url?如果没有,我可以直接向mapper提供列表或数组吗?我试着在网上找到一个类似的案例,但什么也找不到。
第一个作业生成一个文件。作业脚本应使用将文件复制到HDFS中
hadoop fs -copyFromLocal /your/local/folder /your/folder/in/hdfs
使用/your/folder/in/hdfs
作为MapReduce作业的输入文件夹。如果你的地图减少是基于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
因此,为了回答您的问题
- 我应该将其导出到txt文件中并再次导入吗?
- 是
- 如果是,我应该如何提供文件位置?
- 以上详细说明
- 使用url?
- 使用URL是一种选择,但上面的方法最适合您的情况
- 如果没有,我可以直接向mapper提供列表或数组吗?
- 请详细说明什么是"直接的"。如果您希望所有映射器都能看到同一个文件,那么您可以选择在命令行中使用
-files
选项。使用-files
使文件的行为类似于缓存文件
- 请详细说明什么是"直接的"。如果您希望所有映射器都能看到同一个文件,那么您可以选择在命令行中使用
好的,然后你可以将第一步的输出作为逗号分隔的字符串写入文件中,即你的列表。所以你的每个列表都将是文件中的一行,然后将文件从本地文件系统移动到hdfs。然后,您可以使用hdfs文件作为map reduce作业的输入来执行必要的操作。还是你们一次只得到一个列表作为第一个作业的输出?为了将文件从本地文件系统复制到hdfs,您可以使用hdfs文件系统的java API。检查此链接
现在,如果你的第一个作业的输出只是一个2D列表,那么我认为这不适合map reduce作业的输入,因为它在批量数据上效果最好。