centos 搭建僞分佈式hadoop

Hadoop僞分佈式配置

Hadoop 能夠在單節點上以僞分佈式的方式運行,Hadoop 進程以分離的 Java 進程來運行,節點既做爲 NameNode 也做爲 DataNode,同時,讀取的是 HDFS 中的文件。java

在設置 Hadoop 僞分佈式配置前,咱們還須要設置 HADOOP 環境變量,執行以下命令在 ~/.bashrc 中設置:node

vi ~/.bashrc

此次咱們選擇用 gedit 而不是 vim 來編輯。gedit 是文本編輯器,相似於 Windows 中的記事本,會比較方便。保存後記得關掉整個 gedit 程序,不然會佔用終端。在文件最後面增長以下內容:apache

# Hadoop Environment Variables
export JAVA_HOME=/usr/local/java
export HADOOP_HOME=/usr/local/hadoop
export HADOOP_INSTALL=$HADOOP_HOME
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin:$JAVA_HOME/bin

保存後,不要忘記執行以下命令使配置生效:vim

source ~/.bashrc

這些變量在啓動 Hadoop 進程時須要用到,不設置的話可能會報錯(這些變量也能夠經過修改 ./etc/hadoop/hadoop-env.sh 實現)。bash

Hadoop 的配置文件位於 /usr/local/hadoop/etc/hadoop/ 中,僞分佈式須要修改2個配置文件 core-site.xml 和 hdfs-site.xml 。Hadoop的配置文件是 xml 格式,每一個配置以聲明 property 的 name 和 value 的方式來實現。服務器

修改配置文件 core-site.xml (經過 gedit 編輯會比較方便: vi ./etc/hadoop/core-site.xml),將當中的框架

<configuration>
</configuration>
  1. XML修改成下面配置:
<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>
  1. XML

一樣的,修改配置文件 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>
  1. XML

配置完成後,執行 NameNode 的格式化:分佈式

./bin/hdfs namenode -format

成功的話,會看到 「successfully formatted」 和 「Exitting with status 0」 的提示,oop

若爲 「Exitting with status 1」 則是出錯。

執行NameNode格式化

接着開啓 NaneNode 和 DataNode 守護進程:

./sbin/start-dfs.sh

若出現以下 SSH 的提示 「Are you sure you want to continue connecting」,輸入 yes 便可。

首次啓動Hadoop時的SSH提示

首次啓動Hadoop時的SSH提示

啓動時可能會有 WARN 提示 「WARN util.NativeCodeLoader…」 如前面提到的,這個提示不會影響正常使用。

若出現JAVA_HOME 環境變量問題。配置以下:

進入$HADOOP_HOME/etc/hadoop目錄,配置 hadoop-env.sh,yarn-env.sh等。

涉及的配置文件以下:

1)配置hadoop-env.sh

# The java implementation to use.
#export JAVA_HOME=${JAVA_HOME}
export JAVA_HOME=/usr/lib/jdk1.6.0_45


2)配置yarn-env.sh

#export JAVA_HOME=/home/y/libexec/jdk1.6.0/
export JAVA_HOME=/usr/lib/jdk1.6.0_45

啓動完成後,能夠經過命令 jps 來判斷是否成功啓動,若成功啓動則會列出以下進程: 「NameNode」、」DataNode」和SecondaryNameNode(若是 SecondaryNameNode 沒有啓動,請運行 sbin/stop-dfs.sh 關閉進程,而後再次嘗試啓動嘗試)。若是沒有 NameNode 或 DataNode ,那就是配置不成功,請仔細檢查以前步驟,或經過查看啓動日誌排查緣由。

經過jps查看啓動的Hadoop進程

經過查看啓動日誌分析啓動失敗緣由

有時 Hadoop 沒法正確啓動,如 NameNode 進程沒有順利啓動,這時能夠查看啓動日誌來排查緣由,注意幾點:

  • 啓動時會提示形如 「dblab: starting namenode, logging to /usr/local/hadoop/logs/hadoop-hadoop-namenode-dblab.out」,其中 dblab 對應你的主機名,但啓動的日誌信息是記錄在 /usr/local/hadoop/logs/hadoop-hadoop-namenode-dblab.log 中,因此應該查看這個後綴爲 .log 的文件;
  • 每一次的啓動日誌都是追加在日誌文件以後,因此得拉到最後面看,看下記錄的時間就知道了。
  • 通常出錯的提示在最後面,也就是寫着 Fatal、Error 或者 Java Exception 的地方。
  • 能夠在網上搜索一下出錯信息,看可否找到一些相關的解決方法。

成功啓動後,能夠訪問 Web 界面 http://localhost:50070 查看 NameNode 和 Datanode 信息,

還能夠在線查看 HDFS 中的文件。

Hadopp的Web界面

運行Hadoop僞分佈式實例

上面的單機模式,grep 例子讀取的是本地數據,僞分佈式讀取的則是 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

複製完成後,能夠經過以下命令查看 HDFS 中的文件列表:

./bin/hdfs dfs -ls input

僞分佈式運行 MapReduce 做業的方式跟單機模式相同,區別在於僞分佈式讀取的是HDFS中的文件(能夠將單機步驟中建立的本地 input 文件夾,輸出結果 output 文件夾都刪掉來驗證這一點)。

./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep input output 'dfs[a-z.]+'

查看運行結果的命令(查看的是位於 HDFS 中的輸出結果):

./bin/hdfs dfs -cat output/*

結果以下,注意到剛纔咱們已經更改了配置文件,因此運行結果不一樣。

Hadoop僞分佈式運行grep的結果

咱們也能夠將運行結果取回到本地:

rm -r ./output # 先刪除本地的 output 文件夾(若是存在)
./bin/hdfs dfs -get output ./output # 將 HDFS 上的 output 文件夾拷貝到本機
cat ./output/*

Hadoop 運行程序時,輸出目錄不能存在,不然會提示錯誤 「org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://localhost:9000/user/hadoop/output already exists」 ,所以若要再次執行,須要執行以下命令刪除 output 文件夾:

./bin/hdfs dfs -rm -r output # 刪除 output 文件夾

運行程序時,輸出目錄不能存在

運行 Hadoop 程序時,爲了防止覆蓋結果,程序指定的輸出目錄(如 output)不能存在,不然會提示錯誤,所以運行前須要先刪除輸出目錄。在實際開發應用程序時,可考慮在程序中加上以下代碼,能在每次運行時自動刪除輸出目錄,避免繁瑣的命令行操做:

Configuration conf = new Configuration();
Job job = new Job(conf);

/* 刪除輸出目錄 */
Path outputPath = new Path(args[1]);
outputPath.getFileSystem(conf).delete(outputPath, true);

Java

若要關閉 Hadoop,則運行

./sbin/stop-dfs.sh

注意下次啓動 hadoop 時,無需進行 NameNode 的初始化,只須要運行 ./sbin/start-dfs.sh 就能夠!

啓動YARN

(僞分佈式不啓動 YARN 也能夠,通常不會影響程序執行)

有的讀者可能會疑惑,怎麼啓動 Hadoop 後,見不到書上所說的 JobTracker 和 TaskTracker,這是由於新版的 Hadoop 使用了新的 MapReduce 框架(MapReduce V2,也稱爲 YARN,Yet Another Resource Negotiator)。

YARN 是從 MapReduce 中分離出來的,負責資源管理與任務調度。YARN 運行於 MapReduce 之上,提供了高可用性、高擴展性,YARN 的更多介紹在此不展開,有興趣的可查閱相關資料。

上述經過 ./sbin/start-dfs.sh 啓動 Hadoop,僅僅是啓動了 MapReduce 環境,咱們能夠啓動 YARN ,讓 YARN 來負責資源管理與任務調度。

首先修改配置文件 mapred-site.xml,這邊須要先進行重命名:

mv ./etc/hadoop/mapred-site.xml.template ./etc/hadoop/mapred-site.xml

而後再進行編輯,一樣使用 gedit 編輯會比較方便些 gedit ./etc/hadoop/mapred-site.xml :

<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>

接着修改配置文件 yarn-site.xml

 
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>

而後就能夠啓動 YARN 了(須要先執行過 ./sbin/start-dfs.sh):

./sbin/start-yarn.sh $ 啓動YARN
./sbin/mr-jobhistory-daemon.sh start historyserver # 開啓歷史服務器,才能在Web中查看任務運行狀況

開啓後經過 jps 查看,能夠看到多了 NodeManager 和 ResourceManager 兩個後臺進程,以下圖所示。

開啓YARN

啓動 YARN 以後,運行實例的方法仍是同樣的,僅僅是資源管理方式、任務調度不一樣。觀察日誌信息能夠發現,不啓用 YARN 時,是 「mapred.LocalJobRunner」 在跑任務,啓用 YARN 以後,是 「mapred.YARNRunner」 在跑任務。

啓動 YARN 有個好處是能夠經過 Web 界面查看任務的運行狀況:http://localhost:8088/cluster,以下圖所示。

開啓YARN後能夠查看任務運行信息

但 YARN 主要是爲集羣提供更好的資源管理與任務調度,然而這在單機上體現不出價值,反而會使程序跑得稍慢些。所以在單機上是否開啓 YARN 就看實際狀況了。

不啓動 YARN 需重命名 mapred-site.xml

若是不想啓動 YARN,務必把配置文件 mapred-site.xml 重命名,改爲 mapred-site.xml.template,須要用時改回來就行。不然在該配置文件存在,而未開啓 YARN 的狀況下,運行程序會提示 「Retrying connect to server: 0.0.0.0/0.0.0.0:8032」 的錯誤,這也是爲什麼該配置文件初始文件名爲 mapred-site.xml.template。

一樣的,關閉 YARN 的腳本以下:

./sbin/stop-yarn.sh
./sbin/mr-jobhistory-daemon.sh stop historyserver

自此,你已經掌握 Hadoop 的配置和基本使用了。

附加教程: 配置PATH環境變量

在這裏額外講一下 PATH 這個環境變量(可執行 echo $PATH 查看,當中包含了多個目錄)。例如咱們在主文件夾 ~ 中執行 ls 這個命令時,實際執行的是 /bin/ls 這個程序,而不是 ~/ls 這個程序。系統是根據 PATH 這個環境變量中包含的目錄位置,逐一進行查找,直至在這些目錄位置下找到匹配的程序(若沒有匹配的則提示該命令不存在)。

上面的教程中,咱們都是先進入到 /usr/local/hadoop 目錄中,再執行 ./sbin/hadoop,實際上等同於運行 /usr/local/hadoop/sbin/hadoop。咱們能夠將 Hadoop 命令的相關目錄加入到 PATH 環境變量中,這樣就能夠直接經過 start-dfs.sh 開啓 Hadoop,也能夠直接經過 hdfs 訪問 HDFS 的內容,方便平時的操做。

在前面咱們設置 HADOOP 環境變量時,咱們已經順便設置了 PATH 變量(即 「export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin」),那麼之後咱們在任意目錄中均可以直接經過執行 start-dfs.sh 來啓動 Hadoop 或者執行 hdfs dfs -ls input 查看 HDFS 文件了,讀者不妨如今就執行 hdfs dfs -ls input 試試看。

相關文章
相關標籤/搜索