首页 > 代码库 > hadoop-初学者写map-reduce程序中容易出现的问题 3
hadoop-初学者写map-reduce程序中容易出现的问题 3
1.写hadoop的map-reduce程序之前所必须知道的基础知识:
1)hadoop map-reduce的自带的数据类型:
Hadoop提供了如下内容的数据类型,这些数据类型都实现了WritableComparable接口,以便用这些类型定义的数据可以被序列化进行网络传输和文件存储,以及进行大小比较。(如果是自定义的key,value的数据类型,必须也要写其大小比较的方法)
BooleanWritable:标准布尔型数值
ByteWritable:单字节数值
DoubleWritable:双字节数
FloatWritable:浮点数
IntWritable:整型数
LongWritable:长整型数
Text:使用UTF8格式存储的文本
NullWritable:当<key,value>中的key或value为空时使用
2)hadoop的 map -combiner - reduce 之间的输入输出数据类型的关系:
一个Map/Reduce 作业的输入和输出类型如下所示: (input) <k1, v1> -> map -> <k2, v2> -> combine -> <k2, v2> -> reduce -> <k3, v3> (output) |
特别注意:combine的输入输出和map的输出完全一样
2.在写第一个hadoop程序中出现的问题:
1)由以上map-reduce的输入输出数据类型关系可以看出:
在hadoop中,只要定义了map和reduce的输出类型,那么整个hadoop的运行流程中的数据类型基本都确定了
hadoop程序在job中配置输出类型
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(Text.class); //combine的输入输出一定是<Text,Text,Text,Text>,reduce的输入一定是<Text,Text>
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(NullWritable.class);
2)以上job中的配置一定要与程序中mapper、combiner和reducer中定义的数据类型一致:
如果job中是以上配置,那么mapper,combiner和reducer的定义一定要是下面这样:
mapper:
public static class MyMapper extends Mapper<Object, Text, Text1, Text1>
combiner:
public static class MyCombiner extends Reducer<Text1,Text1,Text1,Text1>
reducer:
public static class MyReducer extends Reducer<Text1,Text1,Text,NullWritable>
注意:以上标红的地方类型必须完全一致(实际程序中应是Text类型,这里为了表明对应关系用Text)
3.调试map-reduce程序中,发现在eclipse中写map-reduce程序中经常程序会莫名其妙的终止,但是在eclipse中的console中却没有任何错误的提示——因为hadoop的很多输出时输出到log或系统的标准输出流中,如果想要看程序到底在哪里出现了问题,必须要在命令行中运行,才会显示所有的错误,如何在命令行中配置编译hadoop map-reduce程序的环境请看上一篇hadoop——在命令行下编译并运行map-reduce程序
4.调试程序中,每次编译好生成.class和.jar后,都要输入命令,运行完还得输入查询结果的命令,下一次运行还要清除上次放在hdfs中的文件,因此可以将整个程序执行过程通过写bash脚本来完成
具体的bash脚本如下:
#!/bin/bash
rm -f *.class *.jar && #删除当前目录下上次生成的jar包和.class文件
javac Hw2Part1.java &&#重新编译map-reduce程序
jar cfm Hw2Part1.jar WordCount-manifest.txt Hw2Part1*.class &&#生成jar包
hdfs dfs -rm -f -r hw2/output hw2/example-input.txt#删除hdfs中上次的输入输出文件
hdfs dfs -put ./example-input.txt hw2/&&;#将选择的输入文件放到hdfs中
hadoop jar ./Hw2Part1.jar hw2/example-input.txt hw2/output &&#执行map-reduce程序
hdfs dfs -cat ‘hw2/output/part-*‘#查看map-reduce的输出
注意:在bash脚本中&&表示上条命令正确执行完后才会继续执行下条指令值得注意的是:hadoop程序的输入可以是目录也可以是某个具体的文件,如果输入是目录就会顺序读取该目录下所有的文件,如果输入是文件,那么就只会读取这一个指定的文件
5。每次调试运行以上脚本后,就可以看到程序执行中具体哪个地方有问题,如果程序执行正确会直接在控制台上输出运行的结果
转:http://blog.csdn.net/guoqingpei/article/details/45620153
hadoop-初学者写map-reduce程序中容易出现的问题 3
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。