本文不生產內容,只是以下內容的搬運工
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用戶登錄##
安裝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.xml 和 hdfs-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 ,那就是配置不成功,請仔細檢查之前步驟,或通過查看啟動日志排查原因。
一般情況下,若是 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 中的文件。
運行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
插件需要進一步的配置。
第一步:選擇 Window 菜單下的 Preference。
此時會彈出一個窗體,窗體的左側會多出 Hadoop Map/Reduce 選項,點擊此選項,選擇 Hadoop 的安裝目錄(如/usr/local/hadoop,Ubuntu不好選擇目錄,直接輸入就行)。
第二步:切換 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 隨意填寫。
最后的設置如下圖所示:
在 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 進行刷新(不會自動刷新,需要手動刷新),可以看到文件結構如下所示
選擇 Run As -> Run Configurations,在此處可以設置運行時的相關參數。切換到 “Arguments” 欄,在 Program arguments 處填寫 “input output” 就可以了。這里的input即為之前創建在hadoop上的input路徑。
至此,你就可以使用 Eclipse 方便的進行 MapReduce程序的開發了。