我是hadoop的新手并且正在运行一些示例以便更熟悉它。我运行了wordcount,当我去检查输出hadoop fs -cat outt
时,我得到了3个目录,而不是通常名为outt / part-00000的目录。这是我的目录:
-rw-r--r-- 1 hadoop supergroup 0 2014-07-11 20:13 outt/_SUCCESS
-rw-r--r-- 1 hadoop supergroup 15 2014-07-11 20:13 outt/part-r-00000
-rw-r--r-- 1 hadoop supergroup 0 2014-07-11 20:13 outt/part-r-00001
当我执行hadoop fs -cat outt/_SUCCESS
和hadoop fs -cat outt/part-r-00001
时,不会显示任何内容。但是,当我hadoop fs -cat outt/part-r-00000
时,我得到:record_count 1。
我的文件只是说“Hello World”所以我期待结果:Hello 1 World 1.
有谁知道如何获得正确的输出?
答案 0 :(得分:2)
1.)_ success和part-r-00000/1不是目录而是文件。目录更像是一组文件和其他目录
2。)如果所有节点和缩减器成功执行提交的作业并且结果集完整,则由hadoop自动创建_Success文件。
3.)如果您收到两个部分文件,则表示您的工作描述中有两个缩减器。检查代码以查找是否有job.setNumReduceTasks(2);
之类的语句。名为00000的部件是第一个减速器的输出,00001是第二个减速器的输出。 ' R'意味着输出来自reducer。如果看到' m'而不是' r'这意味着你没有减速器,而且工作只是地图工作。
答案 1 :(得分:1)
当您执行hadoop fs -cat outt/part-r-00000
并获取输出为:record_count 1
这意味着您可能正在计算输入文件中的行数。
读完一行后,您需要对该行进行标记,并将每个单词(标记)取出来。
以下是示例代码:
String line = value.toString();
StringTokenizer tokenizer = new StringTokenizer(line);
while (tokenizer.hasMoreTokens()) {
word.set(tokenizer.nextToken());
context.write(word, one);
}
您可以在此处找到完整代码:WordCount
在这里,您可以分割java API的方法而不是StringTokenizer
。