關於hadoop的用處什么我就不說了,在這里記錄下在eclipse上第一次跑hadoop遇到的問題吧~
hadoop的安裝我就不說啦,網上教程一大堆~我直接用的公司的Linux上的hadoop。
eclipse用的是mars,JDK1.8,win7,hadoop是公司的Linux上的hadoop 1.2.1,關聯的JDK是1.7.
首先下載hadoop關聯eclipse的插件hadoop-eclipse-plugin-1.2.1。最好下載相同版本的,不然容易出問題(我就是典型)。把插件放到eclipse安裝目錄的plugins下(hadoop-eclipse-plugin-2.2.0放到dropins目錄下是可以的,但是1.2.1是不行的),重啟eclipse,在eclipse的頁面上出現這個東東~
接下來配置hadoop,點擊圖上的大象,在eclipse下面出現這個。點擊右邊藍色小象,進入hadoop的配置頁面。
關於配置的詳細信息在圖上都標注出來了。Linux的命令這在這里就不說了,連Linux推薦用secureCRT。
點擊finish,等待完成。完成后,在eclipse的左邊,project explorer下面會出現DFS location。成功的話會把hadoop的文件加載出來,相當於hadoop fs -ls這個命令出現的結果。這里如果出現連接失敗,檢查一下是不是地址或端口寫錯了,可以在cmd中telnet端口看是不是可以連通,telnet 192.168.0.201 49000。如果出現提示“你的電腦一個軟件阻止訪問”,那么可能就是hadoop-eclipse的插件版本不對了~
都OK得那么就可以寫helloworld了。
package com.qldhlbs.hadoop.helloworld; import java.io.IOException; import java.util.StringTokenizer; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.Mapper; import org.apache.hadoop.mapreduce.Reducer; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.input.TextInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat; public class WordCount { public static class WordCountMap extends Mapper<LongWritable, Text, Text, IntWritable> { private final IntWritable one = new IntWritable(1); private Text word = new Text(); public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { String line = value.toString(); StringTokenizer token = new StringTokenizer(line); while (token.hasMoreTokens()) { word.set(token.nextToken()); context.write(word, one); } } } public static class WordCountReduce extends Reducer<Text, IntWritable, Text, IntWritable> { public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { int sum = 0; for (IntWritable val : values) { sum += val.get(); } context.write(key, new IntWritable(sum)); } } public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); Job job = new Job(conf); job.setJarByClass(WordCount.class); job.setJobName("wordcount"); job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); job.setMapperClass(WordCountMap.class); job.setReducerClass(WordCountReduce.class); job.setInputFormatClass(TextInputFormat.class); job.setOutputFormatClass(TextOutputFormat.class); FileInputFormat.addInputPath(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); job.waitForCompletion(true); } }
主意要導入的包。其中hadoop包和Jackson包在下載的hadoop文件里面都有,幾個commons包也要導入,不然會報錯,其中commons-cli-1.3.1.jar是一個處理命令的工具。比如main方法輸入的string[]需要解析。你可以預先定義好參數的規則,然后就可以調用CLI來解析。上面的代碼不到這個包會報錯。
接下來在hadoop中創建文件。命令hadoop fs -mkdir /user/qldhlbs/input創建文件夾。這些hadoop命令和Linux的差不多~后面的/user/qldhlbs/input是創建的文件夾目錄。在eclipse上右鍵DFS location刷新或者重連,就會看到在user目錄下出現qldhlbs/input目錄。把要count的文件放到input中去,可以用簡單的方法,就是右鍵創建的input,選擇upload file to DFS。不出意外的話會提醒沒有權限,那么就賦予權限。命令 hadoop fs -chmod 777 /user/qldhlbs/input。其中777是讀寫執行權限(因為它對應的二進制是4,2,1),/user/qldhlbs/input是給予權限的目錄。在eclipse刷新一下就可以上傳文件了~上傳成功后再input目錄下可以看到你上傳的文件。
接下來右鍵run configurations,配置參數。hdfs://192.168.0.201:49000/user/qldhlbs/input hdfs://192.168.0.201:49000/user/qldhlbs/output,它會自動幫你建output目錄,如果自己創建會報錯,文件已存在。點擊apply,run。參數地址不要寫錯了,原來我寫錯了找了半天錯誤沒找到~zzZ。這里會提示qldhlbs這個目錄沒有權限,和前面一樣賦予全縣就行了。如果用1.2.1這個版本不出意外的話還會提示一個tmp/hadoop-Administrator/xxxx沒有權限的錯誤,改一下hadoop-core-1.2.1.jar文件的源碼就行了,反編譯一下這個jar,在fs包下的fileUtil類中的checkReturnValue方法,把里面的內容注釋掉就行了。
把改了的文件重新打包成jar放到工程中,跑一下就可以了。運行成功會在output下面出現兩個文件。
到這兒hadoop的helloworld就完成了~當初做的時候沒仔細看,出了一些不該出的小錯誤,浪費很多時間~