Mapreduce程序的输入数据



我想写一个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作业的输入,因为它在批量数据上效果最好。

相关内容

  • 没有找到相关文章

最新更新