聲明:作者原創,轉載注明出處。
作者:帥氣陳吃蘋果
一、環境准備
1、JDK安裝與配置
2、Eclipse下載
下載解壓即可,下載地址:https://pan.baidu.com/s/1i51UsVN
3、Hadoop下載與配置
下載解壓即可,下載地址:https://pan.baidu.com/s/1i57ZXqt
配置環境變量:
在系統變量中新建變量:HADOOP_HOME,值:E:\Hadoop\hadoop-2.6.5
在Path系統變量中添加Hadoop的/bin路徑,值:E:\Hadoop\hadoop-2.6.5\bin
4、正常的集群狀態
確保集群處於啟動狀態,並且windows本地機器與集群中的master可以互相ping通,並且可以進行SSH連接;
在 C:\Windows\System32\drivers\etc\hosts文件中,追加Hadoop集群master節點的IP地址和主機名映射,如下:
192.168.29.188 vnet
5、Eclipse-Hadoop插件下載
下載地址:https://pan.baidu.com/s/1o7791VG
下載后將插件放在Eclipse安裝目錄的plugins目錄下,重啟Eclipse即可。
6、Eclipse的Map/Reduce視圖設置
1)重啟Eclipse后,在左側欄可以看到此視圖:
[圖片上傳失敗...(image-e97b85-1513346897411)]
打開Window--->Perspective--->Open Perspective--->Other...,選擇Map/Reduce。若沒有看到此選項,在確保插件放入plugins目錄后已經重啟的情況下,猜測可能是Eclipse或插件的版本問題導致,需重新下載相匹配的版本。

2)打開Window--->Preferences--->Hadoop Map/Reduce,配置Hadoop的安裝目錄。

二、WordCount項目實戰
1、Hadoop Location的創建與配置
在Eclipse底部欄中選擇Map/Reduce Locations視圖,右鍵選擇New Hadoop Locations,如下圖:

具體配置如下:

點擊finish,若沒有報錯,則表示連接成功,在Eclipse左側的DFS Locations中可以看到HDFS文件系統的目錄結構和文件內容;
若遇到 An internal error occurred during: "Map/Reduce location status updater". java.lang.NullPointerExcept
的問題,則表示當前HDFS文件系統為空,只需在HDFS文件系統上創建文件,刷新DFS Locations后即可看到文件系統內容;
2、創建輸入文件及目錄
在master節點上創建輸入文件,並上傳到HDFS對應的輸入目錄中,如下:
//然后輸入單詞計數的文件內容,保存
vi input.txt
//將Linux本地文件系統的文件上傳到HDFS上
hdfs dfs -put input.txt /user/root/input/
input.txt
hello world
hello hadoop
bye
bye hadoop
3、創建Map/Reduce項目
File--->New--->Project--->Map/Reduce Project,填入項目名稱,還需要選擇Hadoop Library的路徑,這里選擇“Use default Hadoop”即可,就是我們之前在Eclipse中配置的Hadoop。
WordCount.java代碼:
package com.wecon.sqchen;
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 {
System.setProperty("hadoop.home.dir","E:/Hadoop/hadoop-2.6.5" );
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);
}
}
右鍵打開Run AS ---> Run Configurations,配置Arguments,即程序中指定的文件輸入目錄和輸出目錄,如下:

配置好后,Run AS---> Java Application,若無報錯,則表示程序執行成功,在Eclipse左側的
DFS Locations刷新后,可以看到輸出目錄和輸出文件,如下:
[圖片上傳失敗...(image-40998c-1513346897411)]
4、解決遇到的問題
1)java.io.IOException: Could not locate executable null\bin\winutils.exe in the Hadoop binaries.
解決方式:
在main方法中、job提交之前,指定本地Hadoop的安裝路徑,即添加下列代碼:
System.setProperty("hadoop.home.dir","E:/Hadoop/hadoop-2.6.5" );
2)(null) entry in command string: null chmod 0700 E:\tmp\hadoop-Administrator\mapred\staging \Administr
解決方式:
參考鏈接:https://ask.hellobi.com/blog/jack/5063
鏈接中所需文件下載地址:https://pan.baidu.com/s/1i4Z4aVV
3)org.apache.hadoop.security.AccessControlException: Permission denied: user=Administrator, access=WRITE, inode="/user/root":root:supergroup:drwxr-xr-x
解決方式:
這是本地用戶執行Application時,HDFS上的用戶權限問題;
參考鏈接:http://blog.csdn.net/Camu7s/article/details/50231625
采用第三種方法,在master節點機器上執行下列命令:
adduser Administrator
groupadd supergroup
usermod -a -G supergroup Administrator
4)org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://vnet:9000/user/root/output already exists
解決方式:
這是因為該項目的輸出目錄在HDFS中已經存在,而輸出目錄是在程序運行過程中創建的,不允許提前存在,所以只需刪除HDFS上的對應output目錄即可。
5)
log4j:WARN No appenders could be found for logger (org.apache.hadoop.metrics2.lib.
MutableMetricsFactory).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
解決方式:
在項目的src目錄下,New--->Other--->General--->File,創建文件“log4j.properties”,文件內容如下:
log4j.rootLogger=WARN, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
5、參考鏈接:
http://blog.csdn.net/bd_ai_iot/article/details/78287379
http://blog.csdn.net/songchunhong/article/details/47046701
http://blog.chinaunix.net/uid-20577907-id-3613584.html
http://blog.csdn.net/jediael_lu/article/details/38705371
最后,歡迎指正。喜歡的話,點個贊唄,請你吃蘋果。