输入Mapreduce程序的数据

时间:2013-12-17 17:19:30

标签: java hadoop mapreduce

我想写一个MapReduce代码。我的代码有三个部分:数据准备,MapReduce和数据后期处理。数据准备阶段的输出可以是2D阵列或列表。我的问题是我应该如何向第一阶段的输出提供映射器?我应该将其导出到txt文件并再次导入吗?如果是这样,我应该如何提供文件位置?使用网址?如果没有,我可以直接用映射或数组提供映射器吗?我试图在网上找到类似的案例,但我找不到任何东西。

2 个答案:

答案 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

所以回答你的问题

  • 我应该将其导出到txt文件并再次导入吗?
  • 如果是这样,我应该如何提供文件位置?
    • 上面详述
  • 使用网址?
    • 使用网址是一种选择,但上述选项最适合您的情况
  • 如果没有,我可以直接用映射或数组提供映射器吗?
    • 请详细说明什么是“直接”。如果您希望所有映射器能够看到相同的文件,那么您的选项将是在命令行中使用-files选项。使用-files使文件像缓存文件一样。