在eclipse上跑hadoop的helloworld


關於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就完成了~當初做的時候沒仔細看,出了一些不該出的小錯誤,浪費很多時間~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM