第一个Hadoop程序——WordCount
概述:
? 通過前面兩篇博客的學(xué)習(xí),我們學(xué)習(xí)了Hadoop的偽分布式部署和完全分布式部署。這一篇文章就來介紹一下Hadoop的第一個(gè)程序WordCount。以及在運(yùn)行代碼的過程中遇到的問題。
筆者開發(fā)環(huán)境:
? Linux: ? ? CentOS 6.6(Final) x64
? Windows: ? Win7 64位
??JDK: ? ? ? java version "1.7.0_75"
? ? ? ? ? ? ?OpenJDK Runtime Environment (rhel-2.5.4.0.el6_6-x86_64 u75-b13)
? ? ? ? ? ? ?OpenJDK 64-Bit Server VM (build 24.75-b04, mixed mode)
? SSH: ? ? ? OpenSSH_5.3p1, OpenSSL 1.0.1e-fips 11 Feb 2013
? Hadoop: ? ?hadoop-1.2.1
? Eclipse: ??Release 4.2.0
? 這邊使用Linux和Window兩個(gè)系統(tǒng)來開發(fā)的目的在于,我的Cygwin還沒安裝好。。。而Linux上的Hadoop安裝和部署很方便,又感覺Winows上Eclipse比Linux上的Eclipse用著舒服。
? 下面的代碼和一些遇到的問題,以及對(duì)于這上問題的解決方案。
主代碼(WordCount.java):
public class WordCount {public static class TokenizerMapperextends Mapper<Object, Text, Text, IntWritable> {private final static IntWritable one = new IntWritable(1);private Text word = new Text();public void map(Object key, Text value, Context context)throws IOException, InterruptedException {StringTokenizer itr = new StringTokenizer(value.toString());while (itr.hasMoreTokens()) {word.set(itr.nextToken());context.write(word, one);}}}public static class IntSumReducerextends Reducer<Text, IntWritable, Text, IntWritable> {private IntWritable result = new IntWritable();public void reduce(Text key, Iterable<IntWritable> values,Context context)throws IOException, InterruptedException {int sum = 0;for (IntWritable val : values) {sum += val.get();}result.set(sum);context.write(key, result);}}public static void main(String[] args) throws Exception {Configuration conf = new Configuration();String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();if (otherArgs.length != 2) {System.err.println("Usage: wordcount <in> <out>");System.exit(2);}Job job = new Job(conf, "word count");job.setJarByClass(WordCount1.class);job.setMapperClass(TokenizerMapper.class);job.setCombinerClass(IntSumReducer.class);job.setReducerClass(IntSumReducer.class);job.setOutputKeyClass(Text.class);job.setOutputValueClass(IntWritable.class);FileInputFormat.addInputPath(job, new Path(otherArgs[0]));FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));System.exit(job.waitForCompletion(true) ? 0 : 1);} }
運(yùn)行過程及說明:
1.將我們?cè)赪indows上開發(fā)的Java程序打成jar包,上傳到Linux上。
2.執(zhí)行命令java -jar wordcount1.jar /home/moon/coding/tmp/wordcount /home/moon/coding/tmp/wordres
?
3.正常運(yùn)行的情況下,會(huì)出現(xiàn)如下輸出:
?
4.進(jìn)行輸出目錄,查看結(jié)果:
??
5.輸出文件的結(jié)果信息:
??
遇到的問題:
1.各種ClassNotFound異常
? 這里對(duì)于ClassNotFound的異常比較好解決。只要導(dǎo)入一些相應(yīng)的jar包就可以了。我在Eclipse中導(dǎo)入的jar如下:
??
? 這些在你下載的Hadoop-x.x.x-bin的文件夾中都是有的。
2.Unable to load native-hadoop library for your platform
? 經(jīng)過一各種ClassNotFound異常的解決之后,出現(xiàn)了上面的這個(gè)異常。這個(gè)異常不是缺少jar包引起的。而是我們的系統(tǒng)環(huán)境沒有把我們的jar和之前部署的Hadoop目錄結(jié)合起來,只要在系統(tǒng)中配置一下hadoop的本地庫的實(shí)際路徑即可。如下:? Hadoop本地庫的實(shí)際路徑:$HADOOP_HOME/lib/native/Linux-amd64-64/
? 解決方法一:
? 在啟動(dòng)JVM時(shí),在java命令中添加java.library.path屬性即可,如下:
? -Djava.library.path=$HADOOP_HOME/lib/native/Linux-amd64-64/
? 解決方法二:
? 使用LD_LIBRARY_PATH系統(tǒng)變量也能解決此問題,如下:
??export HADOOP_HOME = /home/moon/hadoop-1.2.1
? export LD_LIBRARY_PATH=$HADOOP_HOME/lib/native/Linux-amd64-64/
總結(jié)
以上是生活随笔為你收集整理的第一个Hadoop程序——WordCount的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hadoop的学习前奏(二)——Hado
- 下一篇: Java字符编码的转化问题