目前配置eclipse插件主要有兩個(gè)版本,一個(gè)是在windows下重新編譯配置,另一個(gè)是在linux在重新配置編譯。
環(huán)境:
Ubuntu 12.04 64bit 3.2.0-29-generic
eclipse-jee-luna-R-linux-gtk-x86_64.tar.gz
Apache Ant(TM) version 1.8.2
JDK Version 1.7.0_67
安裝前準(zhǔn)備:
Ant、jdk、eclipse、Apache hadoop 2.2.0安裝包都準(zhǔn)備好
eclipse插件源代碼準(zhǔn)備好(https://github.com/winghc/hadoop2x-eclipse-plugin)
在集群上把Apache hadoop 2.2.0部署好
進(jìn)行插件編譯:
將Apache hadoop 2.2.0的安裝包和eclipse拷至任意目錄,如/home/hadoop/Downloads/hadoop-2.2.0和/home/hadoop/Downloads/eclipse. 切記:整個(gè)路徑中不能出現(xiàn)任何空格,否則ant編譯過(guò)程會(huì)報(bào)錯(cuò)!
進(jìn)入插件目錄進(jìn)行編譯,如插件放在/home/hadoop/Downloads/hadoop2x-eclipse-plugin
$ cd /home/hadoop/Downloads/hadoop2x-eclipse-plugin/src/contrib/eclipse-plugin
$ ant jar -Dversion=2.2.0 -Declipse.home=/home/hadoop/Downloads/eclipse -Dhadoop.home=/home/hadoop/Downloads/hadoop-2.2.0
注意:其中-Declipse.home和-Dhadoop.home需要指定eclipse的安裝目錄和hadoop安裝文件的存放目錄,切記:這兩個(gè)目錄的全路徑中都不能存在空格
接下來(lái)就是漫長(zhǎng)的等待了,主要慢的是target:ivy-download,ivy-resolve-common這兩步。
最后生成的插件在:
hadoop2x-eclipse-plugin/build/contrib/eclipse-plugin/hadoop-eclipse-plugin-2.2.0.jar
接下來(lái)進(jìn)行插件的安裝與配置
將hadoop-eclipse-plugin-2.2.0.jar拷貝到eclipse的plugins目錄下,啟動(dòng)eclipse
進(jìn)入Window-->Preference配置根目錄:
進(jìn)入Window-->Open Perspective-->other-->Map/Reduce打開(kāi)Map/Reduce窗口
打開(kāi)Map/Reduce View,右鍵,選擇New hadoop location
配置location
注意:MR Master和DFS Master配置必須和mapred-site.xml和core-site.xml等配置文件一致
打開(kāi)Project Explorer,查看HDFS文件系統(tǒng):
新建Mapreduce項(xiàng)目
創(chuàng)建MapReduce程序
編寫(xiě)WordCount程序測(cè)試插件使用:
在MapReduce工程下新建WordCount.java程序,代碼如下:
import java.io.IOException;
import java.util.*;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.conf.*;
import org.apache.hadoop.io.*;
import org.apache.hadoop.mapred.*;
import org.apache.hadoop.util.*;
public class WordCount {
public static class Map extends MapReduceBase implements Mapper<LongWritable, Text, Text, IntWritable> {
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
public void map(LongWritable key, Text value, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException {
String line = value.toString();
StringTokenizer tokenizer = new StringTokenizer(line);
while (tokenizer.hasMoreTokens()) {
word.set(tokenizer.nextToken());
output.collect(word, one);
}
}
}
public static class Reduce extends MapReduceBase implements Reducer<Text, IntWritable, Text, IntWritable> {
public void reduce(Text key, Iterator<IntWritable> values, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException {
int sum = 0;
while (values.hasNext()) {
sum += values.next().get();
}
output.collect(key, new IntWritable(sum));
}
}
public static void main(String[] args) throws Exception {
JobConf conf = new JobConf(WordCount.class);
conf.setJobName("wordcount");
conf.setOutputKeyClass(Text.class);
conf.setOutputValueClass(IntWritable.class);
conf.setMapperClass(Map.class);
conf.setReducerClass(Reduce.class);
conf.setInputFormat(TextInputFormat.class);
conf.setOutputFormat(TextOutputFormat.class);
FileInputFormat.setInputPaths(conf, new Path(args[0]));
FileOutputFormat.setOutputPath(conf, new Path(args[1]));
JobClient.runJob(conf);
}
}
配置運(yùn)行時(shí)參數(shù):右鍵-->Run as-->Run Confiugrations
將程序放在hadoop集群上運(yùn)行:右鍵-->Runas -->Run on Hadoop,最終的輸出結(jié)果會(huì)在HDFS相應(yīng)的文件夾下顯示。至此,Linux下hadoop-2.2.0 eclipse插件配置完成。
配置過(guò)程中出先的問(wèn)題:
在eclipse中無(wú)法向文件HDFS文件系統(tǒng)寫(xiě)入的問(wèn)題,這將直接導(dǎo)致eclipse下編寫(xiě)的程序不能在hadoop上運(yùn)行。
網(wǎng)上的解決方案有三個(gè):
a. 取消hadoop hdfs的用戶(hù)權(quán)限檢查。打開(kāi)conf/hdfs-site.xml,找到dfs.permissions屬性,將其修改為false(默認(rèn)為true).[我當(dāng)初的配置文件中寫(xiě)成了dfs.permission,雖然這個(gè)值修改成了false,但依舊無(wú)效,從而導(dǎo)致這個(gè)環(huán)境配置不成功,淚奔了]
b. 修改hadoop location參數(shù),在advanced parameter選項(xiàng)卡中,找到hadoop.job.ugi選項(xiàng),將此選項(xiàng)改為啟動(dòng)hadoop的用戶(hù)名即可(注意,第一次設(shè)置的時(shí)候可能沒(méi)有hadoop.job.ugi參數(shù),在報(bào)錯(cuò)后去看就有了)[其實(shí)我怎么也沒(méi)找到這個(gè)選項(xiàng)]
c. 因?yàn)閑clipse使用hadoop插件提交作業(yè)是,會(huì)默認(rèn)以DrWho身份去將作業(yè)寫(xiě)入hdfs文件系統(tǒng)中,對(duì)應(yīng)的也是HDFS上的/usr/hadoop,由于DrWho用戶(hù)對(duì)hadoop目錄并沒(méi)有寫(xiě)入權(quán)限,所以導(dǎo)致異常發(fā)生。解決方法為:放開(kāi)hadoop目錄的權(quán)限,命令如下:$hadoop
fs -chmod 777
[當(dāng)初配置的時(shí)候,只放開(kāi)了幾個(gè)目錄的權(quán)限,從而到導(dǎo)致作業(yè)無(wú)法提交寫(xiě)入到HDFS中,哭死了...]
另外,eclipse插件的使用可能跟eclipse版本有關(guān)系,我使用的是eclipse-jee-luna-R-linux-gtk-x86_64.tar.gz版本的eclipse,在ubuntu 12.04 64bit下是可以使用的
環(huán)境:
Windows 7 64bit 專(zhuān)業(yè)版
eclipse-standard-luna-R-win32-x86_64
Apache Ant(TM) version 1.9.4
JDK Version 1.7.0_67
安裝前準(zhǔn)備:
Ant、jdk、eclipse、Apache hadoop 2.2.0安裝包都準(zhǔn)備好
eclipse插件源代碼準(zhǔn)備好(https://github.com/winghc/hadoop2x-eclipse-plugin)
在集群上把Apache hadoop 2.2.0部署好
進(jìn)行插件編譯:
將Apache hadoop 2.2.0的安裝包和eclipse拷至任意目錄,如E:hadoop-2.2.0和E:eclipse. 切記:整個(gè)路徑中不能出現(xiàn)任何空格,否則ant編譯過(guò)程會(huì)報(bào)錯(cuò)!
進(jìn)入插件目錄進(jìn)行編譯,如插件放在E:hadoop2x-eclipse-plugin
$ cd hadoop2x-eclipse-plugin/src/contrib/eclipse-plugin
$ ant jar -Dversion=2.2.0 -Declipse.home=E:eclipse -Dhadoop.home=E:hadoop-2.2.0
注意:其中-Declipse.home和-Dhadoop.home需要指定eclipse的安裝目錄和hadoop安裝文件的存放目錄,切記:這兩個(gè)目錄的全路徑中都不能存在空格
接下來(lái)就是漫長(zhǎng)的等待了,主要慢的是target:ivy-download,ivy-resolve-common這兩步。
最后生成的插件在:
hadoop2x-eclipse-plugin/build/contrib/eclipse-plugin/hadoop-eclipse-plugin-2.2.0.jar
配置window 7中hadoop環(huán)境變量:
在Window7中設(shè)置%HADOOP_HOME%,并把%HADOOP_HOME%in加入PATH環(huán)境變量[這一步如果不做的話(huà),hadoop程序運(yùn)行的過(guò)程中會(huì)出現(xiàn)空指針異常,從而到時(shí)程序運(yùn)行失敗]
另外還需要下載一個(gè)插件https://github.com/srccodes/hadoop-common-2.2.0-bin,解壓后把下載的bin目錄覆蓋%HADOOP_HOME%in目錄下的文件
注意,這兩步是必須的,否則將導(dǎo)致各種奇葩錯(cuò)誤
接下來(lái)的步驟與Linux版本配置方案中的4、5步驟相同
配置過(guò)程中出現(xiàn)的問(wèn)題:
在使用ant編譯eclipse插件的時(shí)候,會(huì)出現(xiàn)一堆警告,如
[javac] E:hadoop-2.2.0sharehadoophdfshadoop-hdfs-2.2.0.jar(org/apache/h
adoop/hdfs/DistributedFileSystem.class): 警告: 無(wú)法找到類(lèi)型 'LimitedPrivate' 的
注釋方法 'value()'
[javac] E:hadoop-2.2.0sharehadoopcommonhadoop-common-2.2.0.jar(org/apac
he/hadoop/fs/FileSystem.class): 警告: 無(wú)法找到類(lèi)型 'LimitedPrivate' 的注釋方法 '
value()'
[javac] E:hadoop-2.2.0sharehadoopcommonhadoop-common-2.2.0.jar(org/apac
he/hadoop/fs/FileSystem.class): 警告: 無(wú)法找到類(lèi)型 'LimitedPrivate' 的注釋方法 '
value()'
[javac] E:hadoop-2.2.0sharehadoopcommonhadoop-common-2.2.0.jar(org/apac
he/hadoop/fs/FileSystem.class): 警告: 無(wú)法找到類(lèi)型 'LimitedPrivate' 的注釋方法 '
value()'
[javac] E:hadoop-2.2.0sharehadoopcommonhadoop-common-2.2.0.jar(org/apac
he/hadoop/fs/FSDataInputStream.class): 警告: 無(wú)法找到類(lèi)型 'LimitedPrivate' 的注
釋方法 'value()'
[javac] E:hadoop-2.2.0sharehadoopcommonhadoop-common-2.2.0.jar(org/apac
he/hadoop/fs/FSDataOutputStream.class): 警告: 無(wú)法找到類(lèi)型 'LimitedPrivate' 的注
釋方法 'value()'
[javac] 注: 某些輸入文件使用或覆蓋了已過(guò)時(shí)的 API。
[javac] 注: 有關(guān)詳細(xì)信息, 請(qǐng)使用 -Xlint:deprecation 重新編譯。
[javac] 注: 某些輸入文件使用了未經(jīng)檢查或不安全的操作。
[javac] 注: 有關(guān)詳細(xì)信息, 請(qǐng)使用 -Xlint:unchecked 重新編譯。
[javac] 7 個(gè)警告
但最終還是會(huì)編譯成功的,這些警告不用去管
插件的安裝成功與否與eclipse版本有關(guān)系,我以前使用的是windows下64bit j2ee版本的eclipse,將其與插件一個(gè)通過(guò)ant編譯后發(fā)現(xiàn)eclipse無(wú)法識(shí)別插件。
另外在下載eclipse插件的源代碼中有一個(gè)已經(jīng)編譯好的eclipse插件,該插件是不能使用的,放在eclipse中使用的話(huà)會(huì)報(bào)classNotDefException