2、上传到hadoop集群上(集群中的任何一台都行),运行
#wordcounrt.jar是刚刚从eclipse打包上传到linux的jar包 #com.cnblogs._52mm.WordCountDriver是驱动类的全名 #hdfs的/wordcount/input目录下是需要统计单词的文本 #程序输出结果保存在hdfs的/wordcount/output目录下(该目录必须不存在,由hadoop程序自己创建) hadoop jar wordcount.jar com.cnblogs._52mm.WordCountDriver /wordcount/input /wordcount/output3、也可用yarn的web界面查看作业信息
ps:在这里可以看到作业的详细信息,失败还是成功一目了然
报错解决 Error: java.io.IOException: Unable to initialize any output collector at org.apache.hadoop.mapred.MapTask.createSortingCollector(MapTask.java:412) at org.apache.hadoop.mapred.MapTask.access$100(MapTask.java:81) at org.apache.hadoop.mapred.MapTask$NewOutputCollector.<init>(MapTask.java:695) at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:767) at org.apache.hadoop.mapred.MapTask.run(MapTask.java:341) at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:163) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:415) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1692) at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158)该错误是由于编写代码时impor了错误的包导致的(我错在Text包导错了),仔细检查一下,改正后重新打jar包上传。
Output directory hdfs://mini1:9000/wordcount/output already exists显然,该错误是由于reduce的输出目录必须是不存在才行,不能自己在hdfs上手动创建输出目录。
总结map函数和reduce函数的输入输出类型要用hadoop提供的基本类型(可优化网络序列化传输)
LongWritable类型相当于java的Long类型,IntWritable类型相当于java的Integer类型,Text类型相当于java的String类型
reduce函数的输入类型等于map函数的输出类型
Job对象控制整个作业的执行。
job对象的setJarByClass()方法传递一个类,hadoop利用这个类来找到相应的jar文件
运行作业前,输出目录不应该存在,否则hadoop会报错(为了防止覆盖了之前该目录下已有的数据)
setOutputKeyClass()和setOutputValueClass()控制map和reduce函数的输出类型,这两个函数的输出类型一般相同,如果不同,则通过setMapOutputKeyClass()和setMapOutputValueClass()来设置map函数的输出类型。
输入数据的类型默认是TextInputFormat(文本),可通过InputFormat类来改变。
Job中的waitForCompletion()方法提交作业并等待执行完成,传入true作为参数则会将作业的详细信息打印出来。作业执行成功返回true,执行失败返回false。