Ubuntu Hadoop2.7下使用Eclipse編譯運行MapReduce程序

本文不生產內容,只是以下內容的搬運工
http://www.cnblogs.com/kinglau/p/3794433.html
http://www.powerxing.com/install-hadoop/
http://www.powerxing.com/hadoop-build-project-using-eclipse/

環境#

本文基于Ubuntu 14.04 64bit, Hadoop2.7

Hadoop偽分布式安裝配置#

創建Hadoop用戶##

首先創建Hadoop用戶組

sudo addgroup hadoop

然后創建Hadoop用戶

sudo adduser -ingroup hadoop hadoop

這會提示輸入hadoop用戶的密碼。

接下來為hadoop用戶添加權限

sudo gedit /etc/sudoers
hadoop-user-priviledge.png

用新創建的Hadoop用戶登錄##

安裝SSH##

sudo apt-get install openssh-server

安裝完成后,啟動服務

sudo /etc/init.d/ssh start

設置免登陸密碼,生成私鑰和公鑰

ssh-keygen -t rsa -P ""

此時會再/home/hadoop/.ssh下生成兩個文件,id_rsa和id_rsa.pub,前者為私鑰,后者為公鑰。

下面我們將公鑰追加到authorized_keys中,它用戶保存所有允許以當前用戶身份登錄到ssh客戶端用戶的公鑰內容。

cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

登錄ssh

ssh localhost

退出

exit

安裝JAVA環境##

從官網http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html,選擇Linux x64下載到本地jdk-8u73-linux-x64.gz
然后解壓

tar -zxvf jdk-8u73-linux-x64.gz

我們這里想把JAVA安裝到/usr/local/java,因此把解壓出的文件移動到這里

sudo mv jdk1.8.0_71 /usr/local/jdk1.8.0_71

安裝Hadoop##

首先,從官網下載Hadoop 2.7
http://mirror.bit.edu.cn/apache/hadoop/common/

然后加壓

tar -zxvf hadoop-2.7.0.tar.gz

本實驗中我們想把hadoop安裝在/usr/local下面,因此把解壓出來的文件夾移動到/usr/local/hadoop

sudo mv hadoop-2.7.0 /usr/local/hadoop

配置##

配置環境變量###

首先我們需要知道上一步中JAVA的安裝路徑,上一步我們安裝到了/usr/local/jdk1.8.0_71。
打開 ~/.bashrc

sudo gedit ~/.bashrc

該命令會打開該文件的編輯窗口,在文件末尾追加下面內容,然后保存,關閉編輯窗口。

#HADOOP VARIABLES START
export JAVA_HOME=/usr/local/jdk1.8.0_71
export HADOOP_INSTALL=/usr/local/hadoop
export PATH=$PATH:$HADOOP_INSTALL/bin
export PATH=$PATH:$HADOOP_INSTALL/sbin
export HADOOP_MAPRED_HOME=$HADOOP_INSTALL
export HADOOP_COMMON_HOME=$HADOOP_INSTALL
export HADOOP_HDFS_HOME=$HADOOP_INSTALL
export YARN_HOME=$HADOOP_INSTALL
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_INSTALL/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_INSTALL/lib"
#HADOOP VARIABLES END

執行下面命,使添加的環境變量生效:

source ~/.bashrc

配置hadoop-env###

打開hadoop-env.sh

 sudo gedit /usr/local/hadoop/etc/hadoop/hadoop-env.sh

找到JAVA_HOME變量,修改此變量如下

export JAVA_HOME=/usr/local/jdk1.8.0_71  

WordCount單機模式測試#

至此,我們的單機模式已經安裝完成。通過hadoop自帶的WordCount實例驗證是否安裝成功。

cd /usr/local/hadoop
mkdir input
cp README.txt input
bin/hadoop jar share/hadoop/mapreduce/sources/hadoop-mapreduce-examples-2.4.0-sources.jar org.apache.hadoop.examples.WordCount input output

然后查看結果

cat output/*

偽分布式環境配置##

Hadoop 可以在單節點上以偽分布式的方式運行,Hadoop 進程以分離的 Java 進程來運行,節點既作為 NameNode 也作為 DataNode,同時,讀取的是 HDFS 中的文件。
Hadoop 的配置文件位于 /usr/local/hadoop/etc/hadoop/ 中,偽分布式需要修改2個配置文件 core-site.xmlhdfs-site.xml 。Hadoop的配置文件是 xml 格式,每個配置以聲明 property 的 name 和 value 的方式來實現。
修改配置文件 core-site.xml (通過 gedit 編輯會比較方便: gedit ./etc/hadoop/core-site.xml
),將當中的

<configuration>
</configuration>

修改為

<configuration>
        <property>
             <name>hadoop.tmp.dir</name>
             <value>file:/usr/local/hadoop/tmp</value>
             <description>Abase for other temporary directories.</description>
        </property>
        <property>
             <name>fs.defaultFS</name>
             <value>hdfs://localhost:9000</value>
        </property>
</configuration>

同樣的,修改配置文件 hdfs-site.xml

<configuration>
        <property>
             <name>dfs.replication</name>
             <value>1</value>
        </property>
        <property>
             <name>dfs.namenode.name.dir</name>
             <value>file:/usr/local/hadoop/tmp/dfs/name</value>
        </property>
        <property>
             <name>dfs.datanode.data.dir</name>
             <value>file:/usr/local/hadoop/tmp/dfs/data</value>
        </property>
</configuration>

配置完成后,執行 NameNode 的格式化

./bin/hdfs namenode -format

成功的話,會看到 “successfully formatted” 和 “Exitting with status 0″ 的提示,若為 “Exitting with status 1″ 則是出錯。

接著開啟 NameNode 和 DataNode 守護進程。

./sbin/start-dfs.sh

啟動時可能會出現如下 WARN 提示:WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable WARN 提示可以忽略,并不會影響正常使用。

啟動完成后,可以通過命令 jps來判斷是否成功啟動,若成功啟動則會列出如下進程:“NameNode”、”DataNode” 和 “SecondaryNameNode”
(如果 SecondaryNameNode 沒有啟動,請運行 sbin/stop-dfs.sh 關閉進程,然后再次嘗試啟動嘗試)。
如果沒有 NameNode 或 DataNode ,那就是配置不成功,請仔細檢查之前步驟,或通過查看啟動日志排查原因。


install-hadoop-16-jps.png

一般情況下,若是 DataNode 沒有啟動,可嘗試如下的

./sbin/stop-dfs.sh   # 關閉
rm -r ./tmp 刪除 tmp 文件,注意這會刪除 HDFS 中原有的所有數據
./bin/hdfs namenode -format 重新格式化 NameNode
./sbin/start-dfs.sh  # 重啟

成功啟動后,可以訪問 Web 界面 http://localhost:50070 查看 NameNode 和 Datanode 信息,還可以在線查看 HDFS 中的文件。

install-hadoop-17-web-ui.png

運行Hadoop偽分布式實例##

上面的單機模式,WordCount讀取的是本地數據,偽分布式讀取的則是 HDFS 上的數據。要使用 HDFS,首先需要在 HDFS 中創建用戶目錄:

./bin/hdfs dfs -mkdir -p /user/hadoop

接著將 ./etc/hadoop 中的 xml 文件作為輸入文件復制到分布式文件系統中,即將 /usr/local/hadoop/etc/hadoop 復制到分布式文件系統中的 /user/hadoop/input 中。我們使用的是 hadoop 用戶,并且已創建相應的用戶目錄 /user/hadoop ,因此在命令中就可以使用相對路徑如 input,其對應的絕對路徑就是 /user/hadoop/input:

./bin/hdfs dfs -mkdir input
./bin/hdfs dfs -put ./etc/hadoop/*.xml input

復制完成后,可以通過如下命令查看文件列表:

./bin/hdfs dfs -ls input

偽分布式運行 MapReduce 作業的方式跟單機模式相同,區別在于偽分布式讀取的是HDFS中的文件

./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar input output

安裝配置Eclipse#

安裝Hadoop Eclipse Plugin##

下載地址 hadoop2x-eclipse-plugin
(備用下載地址:http://pan.baidu.com/s/1i4ikIoP

下載后,將 release 中的 hadoop-eclipse-kepler-plugin-2.6.0.jar復制到 Eclipse 安裝目錄的 plugins 文件夾中,重啟 Eclipse。

配置Hadoop Eclipse Plugin##

在繼續配置前請確保已經開啟了 Hadoop。即通過jps可以看到NameNode,DataNode,SecondaryNameNode都已在運行。

啟動 Eclipse 后就可以在左側的Project Explorer中看到 DFS Locations

hadoop-build-project-using-eclipse-03.png

插件需要進一步的配置。
第一步:選擇 Window 菜單下的 Preference。
此時會彈出一個窗體,窗體的左側會多出 Hadoop Map/Reduce 選項,點擊此選項,選擇 Hadoop 的安裝目錄(如/usr/local/hadoop,Ubuntu不好選擇目錄,直接輸入就行)。


hadoop-build-project-using-eclipse-05.png

第二步:切換 Map/Reduce 開發視圖
選擇 Window 菜單下選擇 Open Perspective -> Other,彈出一個窗體,從中選擇 Map/Reduce 選項即可進行切換。

第三步:建立與 Hadoop 集群的連接
點擊 Eclipse軟件右下角的 Map/Reduce Locations 面板,在面板中單擊右鍵,選擇 New Hadoop Location

在彈出來的 General 選項面板中,General 的設置要與 Hadoop 的配置一致。一般兩個 Host 值是一樣的,如果是偽分布式,填寫 localhost 即可。
設置 fs.defaultFS 為 hdfs://localhost:9000,則 DFS Master 的 Port 要改為 9000。Map/Reduce(V2) Master 的 Port 用默認的即可,Location Name 隨意填寫。

最后的設置如下圖所示:


hadoop-build-project-using-eclipse-08.png

在 Eclipse 中創建 MapReduce 項目##

點擊 File 菜單,選擇 New -> Project…:
選擇 Map/Reduce Project,點擊 Next。
填寫 Project name 為 WordCount 即可,點擊 Finish 就創建好了項目。

接著右鍵點擊剛創建的 WordCount 項目,選擇 New -> Class
需要填寫兩個地方:在 Package 處填寫 org.apache.hadoop.examples;在 Name 處填寫 WordCount。

創建 Class 完成后,在 Project 的 src 中就能看到 WordCount.java 這個文件。將如下 WordCount 的代碼復制到該文件

package org.apache.hadoop.examples;
 
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.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.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;
 
public class WordCount {
 
  public static class TokenizerMapper 
       extends 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 IntSumReducer 
       extends 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(WordCount.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);
  }
}

通過 Eclipse 運行 MapReduce##

在運行 MapReduce 程序前,還需要執行一項重要操作(也就是上面提到的通過復制配置文件解決參數設置問題):將 /usr/local/hadoop/etc/hadoop 中將有修改過的配置文件(如偽分布式需要 core-site.xml 和 hdfs-site.xml),以及 log4j.properties 復制到 WordCount 項目下的 src 文件夾(~/workspace/WordCount/src)中:

cp /usr/local/hadoop/etc/hadoop/core-site.xml ~/workspace/WordCount/src
cp /usr/local/hadoop/etc/hadoop/hdfs-site.xml ~/workspace/WordCount/src
cp /usr/local/hadoop/etc/hadoop/log4j.properties ~/workspace/WordCount/src

復制完成后,務必右鍵點擊 WordCount 選擇 refresh 進行刷新(不會自動刷新,需要手動刷新),可以看到文件結構如下所示

hadoop-build-project-using-eclipse-17.png

選擇 Run As -> Run Configurations,在此處可以設置運行時的相關參數。切換到 “Arguments” 欄,在 Program arguments 處填寫 “input output” 就可以了。這里的input即為之前創建在hadoop上的input路徑。

hadoop-build-project-using-eclipse-17.png

至此,你就可以使用 Eclipse 方便的進行 MapReduce程序的開發了。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,882評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,208評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,746評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,666評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,477評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,960評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,047評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,200評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,726評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,617評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,807評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,327評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,049評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,425評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,674評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,432評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,769評論 2 372

推薦閱讀更多精彩內容

  • 首先,我們在使用前先看看HDFS是什麼?這將有助于我們是以后的運維使用和故障排除思路的獲得。 HDFS采用mast...
    W_Bousquet閱讀 4,217評論 0 2
  • 踮起腳尖夠生活的人,永遠在力所能及的范圍內,給自己最好的人生體驗。只有見到最好的,才知道人是為什么而努力,并不僅僅...
    阿葵哦閱讀 1,422評論 0 0
  • 把大家寫的都看了一遍,感覺都寫得很好,遲遲不知道怎么下手…… 元能力包括同理心,自我認知,自我控制,自我激勵,人際...
    Fineyoga智慧閱讀 338評論 0 3
  • 下了江蕙的初登場演唱會,居然看得眼濕濕的,特別是舞臺上播放她從小就出來登場以及對父母的感恩與遺憾,配上《風吹的愿望...
    justwind閱讀 1,080評論 0 1