hadoop集群搭建


hadoop 版本選定

Apache hadoop官網上的版本目前列舉如下:

  • 1.1.X - current stable version, 1.1 release
  • 1.2.X - current beta version, 1.2 release
  • 2.X.X - current alpha version
  • 0.23.X - simmilar to 2.X.X but missing NN HA.
  • 0.22.X - does not include security
  • 0.20.203.X - old legacy stable version
  • 0.20.X - old legacy version

所以選定的版本是1.2.x的具體是 hadoop-1.2.1/ 

 
下載地址:http://apache.etoak.com/hadoop/common/
 

環境說明

 

一共使用了三台機器,說明如下:

IP 用途
192.168.1.99 Master,NameNode,JobTracker
192.168.1.98

Slave1,DataNode,TaskTracker

192.168.1.97

Slave2, DataNode,TaskTracker

192.168.1.96

Slave3, DataNode,TaskTracker

 

安裝JDK

 

安裝略

在/etc/profile文件最后加上如下:

export JAVA_HOME=/usr/share/jdk1.6.0_14
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

 

使修改升效:source /etc/profile

 

創建用戶及組

創建用戶hadoop 及組 hadoop

mkdir /home/hadoop

groupadd hadoop

useradd  hadoop –d /home/hadoop –g hadoop

chmod –R 744 /home/hadoop

chgrp –R hadoop /home/hadoop

 

SSH配置

三台機器已經安裝好了SSH,需要配置ssh無密碼公鑰認證登錄.

在master主機上生成密鑰與公鑰。命令為 ssh-keygen –t rsa 一路回車,注意,在提示輸入加密短語的時候,一定不能輸入字符。會在~.ssh下生成id_rsa和id_rsa.pub文件,將id_rsa.pub文件傳到slave機器上,追加到 ~.ssh/authorized_keys 文件里,如果authorized_keys文件沒有,可以手動創建。

authorized_keys權限為744就行了。

 

安裝hadoop

 

hadoop有兩種安裝方式,一種是rpm包的安裝,使用rpm –ivh hadoop.rpm就行了。

另外一種是使用gz.tar包解壓安裝。本文使用這種安裝方式。

 

解壓:tar –zxvf hadoop-1.2.1.tar.gz

為了方便,使用hadoop命令或者start-all.sh等命令,修改Master上/etc/profile 新增以下內容:

export HADOOP_HOME=/usr/hadoop

export PATH=$PATH :$HADOOP_HOME/bin

 

hadoop-1.2.1.tar.gz 解壓后目錄是hadoop-1.2.1,將這個目錄移到/usr目錄下,然后建立一個軟鏈接

ln –s /usr/hadoop-1.2.1 /usr/hadoop

這樣方便以后升級

 

集群配置

配置文件:conf/core-site.xml

<configuration>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/usr/hadoop_dir/tmp</value>
    </property>

        <!-- file system properties -->
    <property>
        <name>fs.default.name</name>
        <value>hdfs://192.168.2.99:49000</value>
    </property>
    <property>
        <name>fs.checkpoint.dir</name>
        <value>/usr/hadoop_dir/dfs/namesecondary</value>
    </property>
</configuration>

 

1)fs.default.name是NameNode的URI。hdfs://主機名:端口/
2)hadoop.tmp.dir :Hadoop的默認臨時路徑,這個最好配置,如果在新增節點或者其他情況下莫名其妙的DataNode啟動不了,就刪除此文件中的tmp目錄即可。不過如果刪除了NameNode機器的此目錄,那么就需要重新執行NameNode格式化的命令。

 

配置文件:conf/mapred-site.xml

<configuration>
        <property>
                <name>mapred.job.tracker</name>
                <value>192.168.2.99:49001</value>
        </property>
        <property>
                <name>mapred.local.dir</name>
                <value>/usr/hadoop_dir/var</value>
        </property>
        <property>
                <name>mapreduce.jobhistory.intermediate-done-dir</name>
                <value>/usr/hadoop_dir/mr-history/tmp</value>
        </property>
        <property>
                <name>mapreduce.jobhistory.done-dir</name>
                <value>/usr/hadoop_dir/mr-history/done</value>
        </property>
</configuration>

 

 

配置文件:conf/hdfs-site.xml

<configuration>
    <property>
        <name>dfs.name.dir</name>        
        <value>/usr/hadoop_dir/namenode1,/usr/hadoop_dir/namenode2</value>
        <description>name node dir</description>
    </property>
    <property>
        <name>dfs.data.dir</name>        
        <value>/usr/hadoop_dir/datanode1,/usr/hadoop_dir/datanode2</value>
        <description></description>
    </property>
    <property>
        <name>dfs.permissions</name>
        <value>false</value>
    </property>
</configuration>

 

1)   dfs.name.dir是NameNode持久存儲名字空間及事務日志的本地文件系統路徑。 當這個值是一個逗號分割的目錄列表時,nametable數據將會被復制到所有目錄中做冗余備份。
2)   dfs.data.dir是DataNode存放塊數據的本地文件系統路徑,逗號分割的列表。 當這個值是逗號分割的目錄列表時,數據將被存儲在所有目錄下,通常分布在不同設備上。
3)dfs.replication是數據需要備份的數量,默認是3,如果此數大於集群的機器數會出錯。

注意:此處的name1、name2、data1、data2目錄不能預先創建,hadoop格式化時會自動創建,如果預先創建反而會有問題。

 

配置masters和slaves主從結點

配置conf/masters和conf/slaves來設置主從結點,注意最好使用主機名,並且保證機器之間通過主機名可以互相訪問,每個主機名一行。

vi masters:
輸入:

node1

vi slaves:

輸入:
node2
node3

配置結束,把配置好的hadoop文件夾拷貝到其他集群的機器中,並且保證上面的配置對於其他機器而言正確,例如:如果其他機器的Java安裝路徑不一樣,要修改conf/hadoop-env.sh

 

hadoop啟動

先格式化一個新的分布式文件系統,運行命令/bin/hadoop namenode -format

 

13/06/04 11:44:03 INFO namenode.NameNode: STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG:   host = node1/127.0.0.2
STARTUP_MSG:   args = [-format]
STARTUP_MSG:   version = 1.1.2
STARTUP_MSG:   build = https://svn.apache.org/repos/asf/hadoop/common/branches/branch-1.1 -r 1440782; compiled by 'hortonfo' on Thu Jan 31 02:03:24 UTC 2013
************************************************************/
Re-format filesystem in /home/hadoop/hadoop_home/name1 ? (Y or N) y
Format aborted in /home/hadoop/hadoop_home/name1
13/06/04 11:44:07 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at node1/127.0.0.2
************************************************************/

查看輸出保證分布式文件系統格式化成功
執行完后可以到master機器上看到/home/hadoop//name1和/home/hadoop//name2兩個目錄。在主節點master上面啟動hadoop,主節點會啟動所有從節點的hadoop。

 

啟動所有節點

啟動方式1

$ bin/start-all.sh (同時啟動HDFS和Map/Reduce)

啟動方式2

啟動Hadoop集群需要啟動HDFS集群和Map/Reduce集群。

在分配的NameNode上,運行下面的命令啟動HDFS:
$ bin/start-dfs.sh(單獨啟動HDFS集群)

bin/start-dfs.sh腳本會參照NameNode上${HADOOP_CONF_DIR}/slaves文件的內容,在所有列出的slave上啟動DataNode守護進程。

在分配的JobTracker上,運行下面的命令啟動Map/Reduce:
$bin/start-mapred.sh (單獨啟動Map/Reduce)

bin/start-mapred.sh腳本會參照JobTracker上${HADOOP_CONF_DIR}/slaves文件的內容,在所有列出的slave上啟動TaskTracker守護進程。

 

關閉所有節點

從主節點master關閉hadoop,主節點會關閉所有從節點的hadoop。

$ bin/stop-all.sh

Hadoop守護進程的日志寫入到 ${HADOOP_LOG_DIR} 目錄 (默認是 ${HADOOP_HOME}/logs).

${HADOOP_HOME}就是安裝路徑.

 

測試

1)瀏覽NameNode和JobTracker的網絡接口,它們的地址默認為:

NameNode - http://node1:50070/
JobTracker - http://node2:50030/

3)   使用netstat  –nat查看端口49000和49001是否正在使用。

4)  使用jps查看進程

要想檢查守護進程是否正在運行,可以使用 jps 命令(這是用於 JVM 進程的ps 實用程序)。這個命令列出 5 個守護進程及其進程標識符。

5)將輸入文件拷貝到分布式文件系統:
$ bin/hadoop fs -mkdir input
$ bin/hadoop fs -put conf/core-site.xml input

運行發行版提供的示例程序:
$ bin/hadoop jar hadoop-0.20.2-examples.jar grep input output 'dfs[a-z.]+'

補充


Q: bin/hadoop jar hadoop-0.20.2-examples.jar grep input output 'dfs[a-z.]+' 什么意思啊?
A: bin/hadoop jar(使用hadoop運行jar包) hadoop-0.20.2_examples.jar(jar包的名字) grep (要使用的類,后邊的是參數)input output 'dfs[a-z.]+'
整個就是運行hadoop示例程序中的grep,對應的hdfs上的輸入目錄為input、輸出目錄為output。
Q: 什么是grep?
A: A map/reduce program that counts the matches of a regex in the input.

查看輸出文件:

將輸出文件從分布式文件系統拷貝到本地文件系統查看:
$ bin/hadoop fs -get output output
$ cat output/*

或者

在分布式文件系統上查看輸出文件:
$ bin/hadoop fs -cat output/*

統計結果:
root@v-jiwan-ubuntu-0:~/hadoop/hadoop-0.20.2-bak/hadoop-0.20.2#bin/hadoop fs -cat output/part-00000
3       dfs.class
2       dfs.period
1       dfs.file
1      dfs.replication
1       dfs.servers
1       dfsadmin

HDFS常用操作

hadoop dfs -ls 列出HDFS下的文件
hadoop dfs -ls in 列出HDFS下某個文檔中的文件
hadoop dfs -put test1.txt test 上傳文件到指定目錄並且重新命名,只有所有的DataNode都接收完數據才算成功
hadoop dfs -get in getin 從HDFS獲取文件並且重新命名為getin,同put一樣可操作文件也可操作目錄
hadoop dfs -rmr out 刪除指定文件從HDFS上
hadoop dfs -cat in/* 查看HDFS上in目錄的內容
hadoop dfsadmin -report 查看HDFS的基本統計信息,結果如下
hadoop dfsadmin -safemode leave 退出安全模式
hadoop dfsadmin -safemode enter 進入安全模式

8.添加節點

可擴展性是HDFS的一個重要特性,首先在新加的節點上安裝hadoop,然后修改$HADOOP_HOME/conf/master文件,加入 NameNode主機名,然后在NameNode節點上修改$HADOOP_HOME/conf/slaves文件,加入新加節點主機名,再建立到新加節點無密碼的SSH連接

運行啟動命令:

start-all.sh

然后可以通過http://(Masternode的主機名):50070查看新添加的DataNode

9負載均衡

start-balancer.sh,可以使DataNode節點上選擇策略重新平衡DataNode上的數據塊的分布

結束語:遇到問題時,先查看logs,很有幫助。

 

10 SHell自動安裝腳本

  1. #!/bin/bash 
  2. #validate user or group 
  3. validate() { 
  4. if [ 'id -u' == 0 ];then 
  5.    echo "must not be root!" 
  6.    exit 0 
  7. else 
  8.    echo "---------welcome to hadoop---------" 
  9. fi 
  10. #hadoop install 
  11. hd-dir() { 
  12. if [ ! -d /home/hadoop/ ];then 
  13.    mkdir /home/hadoop/ 
  14. else 
  15.    echo "download hadoop will begin" 
  16. fi 
  17. download-hd() { 
  18. wget -c http://archive.apache.org/dist/hadoop/core/stable/hadoop-1.0.4.tar.gz -O /home/hadoop/hadoop-1.0.4.tar.gz 
  19. tar -xzvf /home/hadoop/hadoop-1.0.4.tar.gz -C /home/hadoop 
  20. rm /home/hadoop/hadoop-1.0.4.tar.gz 
  21. Ln -s /home/hadoop/hadoop-1.0.4 /home/hadoop/hadoop1.0.4 
  22. #hadoop conf 
  23. hd-conf() { 
  24. echo "export JAVA_HOME=/usr/lib/jvm/java-6-openjdk-i386" >> /home/hadoop/hadoop1.0.4/conf/hadoop-env.sh 
  25. echo "#set path jdk" >> /home/hadoop/.profile 
  26. echo "export JAVA_HOME=/usr/lib/jvm/java-6-openjdk-i386" >> /home/hadoop/.profile 
  27. echo "#hadoop path" >> /home/hadoop/.profile 
  28. echo "export HADOOP_HOME=/home/hadoop/hadoop1.0.4" >> /home/hadoop/.profile 
  29. echo "PATH=$PATH:$HADOOP_HOME/bin:$JAVA_HOME/bin" >> /home/hadoop/.profile 
  30. echo "HADOOP_HOME_WARN_SUPPRESS=1" >> /home/hadoop/.profile 
  31. #hadoop core-site.xml 
  32. echo "<configuration>" >> /home/hadoop/hadoop1.0.4/conf/core-site.xml 
  33. echo "<property>" >> /home/hadoop/hadoop1.0.4/conf/core-site.xml 
  34. echo "<name>fs.default.name</name>" >> /home/hadoop/hadoop1.0.4/conf/core-site.xml 
  35. echo "<value>hdfs://hadoop-master:9000" >> /home/hadoop/hadoop1.0.4/conf/core-site.xml 
  36. echo "</property>" >> /home/hadoop/hadoop1.0.4/conf/core-site.xml 
  37. echo "<property>" >> /home/hadoop/hadoop1.0.4/conf/core-site.xml 
  38. echo "<name>hadoop.tmp.dir</name>" >> /home/hadoop/hadoop1.0.4/conf/core-site.xml 
  39. echo "<value>/home/hadoop/tmp</value>" >> /home/hadoop/hadoop1.0.4/conf/core-site.xml 
  40. echo "</property>" >> /home/hadoop/hadoop1.0.4/conf/core-site.xml 
  41. echo "</configuration>" >> /home/hadoop/hadoop1.0.4/conf/core-site.xml 
  42. #hadoop hdfs-site.xml 
  43. echo "<configuration>" >> /home/hadoop/hadoop1.0.4/conf/hdfs-site.xml 
  44. echo "<property>" >> /home/hadoop/hadoop1.0.4/conf/hdfs-site.xml 
  45. echo "<name>dfs.name.dir</name>" >> /home/hadoop/hadoop1.0.4/conf/hdfs-site.xml 
  46. echo "<value>/home/hadoop/name</value>" >> /home/hadoop/hadoop1.0.4/conf/hdfs-site.xml 
  47. echo "</property>" >> /home/hadoop/hadoop1.0.4/conf/hdfs-site.xml 
  48. echo "<property>" >> /home/hadoop/hadoop1.0.4/conf/hdfs-site.xml 
  49. echo "<name>dfs.data.dir</name>" >> /home/hadoop/hadoop1.0.4/conf/hdfs-site.xml 
  50. echo "<value>/home/hadoop/data</value>" >> /home/hadoop/hadoop1.0.4/conf/hdfs-site.xml 
  51. echo "</property>" >> /home/hadoop/hadoop1.0.4/conf/hdfs-site.xml 
  52. echo "<property>" >> /home/hadoop/hadoop1.0.4/conf/hdfs-site.xml 
  53. echo "<name>dfs.replication</name>" >> /home/hadoop/hadoop1.0.4/conf/hdfs-site.xml 
  54. echo "<value>1</value>" >> /home/hadoop/hadoop1.0.4/conf/hdfs-site.xml 
  55. echo "</property>" >> /home/hadoop/hadoop1.0.4/conf/hdfs-site.xml 
  56. echo "</configuration>" >> /home/hadoop/hadoop1.0.4/conf/hdfs-site.xml 
  57. # hadoop mapred-site.xml 
  58. echo "<configuration>" >> /home/hadoop/hadoop1.0.4/conf/mapred-site.xml 
  59. echo "<property>" >> /home/hadoop/hadoop1.0.4/conf/mapred-site.xml 
  60. echo "<name>mapred.job.tracker</name>" >> /home/hadoop/hadoop1.0.4/conf/mapred-site.xml 
  61. echo "<value>hadoop-master:9001</value>" >> /home/hadoop/hadoop1.0.4/conf/mapred-site.xml 
  62. echo "</property>" >> /home/hadoop/hadoop1.0.4/conf/mapred-site.xml 
  63. echo "</configuration>" >> /home/hadoop/hadoop1.0.4/conf/mapred-site.xml 
  64. #hadoop master 
  65. echo "hadoop-master" >> /home/hadoop/hadoop1.0.4/conf/masters 
  66. #hadoop slaves 
  67. echo "hadoop-master" >> /home/hadoop/hadoop1.0.4/conf/slaves 
  68. source /home/hadoop/.profile 
  69. hd-start() { 
  70. hadoop namenode -format 
  71. yes-or-no() { 
  72.   echo "Is your name $* ?" 
  73.   while true 
  74.   do 
  75.      echo -n "Enter yes or no: " 
  76.      read x 
  77.      case "$x" in 
  78.      y | yes ) return 0;; 
  79.      n | no ) return 1;; 
  80.      * ) echo "Answer yes or no";; 
  81.    esac 
  82.   done 
  83. echo "Original params are $*" 
  84. if yes-or-no "$1" 
  85. then 
  86.   echo "HI $1,nice name!" 
  87.   validate 
  88.   hd-dir 
  89.   download-hd 
  90.   hd-conf 
  91. else 
  92.   echo "Never mind!" 
  93. fi 

 

參考:

http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-common/ClusterSetup.html

http://www.cnblogs.com/xia520pi/archive/2012/05/16/2503949.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM