2014年12月31日 星期三

Ubuntu上安裝Hadoop

一、單機模式


由於Hadoop預設便以單機(非分佈)模式運行,故不需要特別設定,但需事先建置好以下環境。
     (一)JDK
          1.安裝OpenJDK:apt-get install openjdk-7-jre
          2.安裝OracleJDK:

 wget --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u25-b17/jdk-8u25-linux-x64.tar.gz 
     mkdir -p /usr/lib/jvm/java-8-oracle/ 
     tar -zxf jdk-8u25-linux-x64.tar.gz 
     mv jdk1.8.0_25/* /usr/lib/jvm/java-8-oracle/ 
     rm -rf jdk* &&\
     update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-8-oracle/bin/java 100 
     update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/java-8-oracle/bin/javac 100 
     update-alternatives --install /usr/bin/jps jps /usr/lib/jvm/java-8-oracle/bin/jps 100 

     (二)SSH

sudo apt-get install openssh-server

二、偽分布模式     

     (一)創建新用戶:hduser並以該用戶登入,對外提供服務的程序,安裝在單獨的用戶之下,可以達到隔離的效果,在.bashrc所設定的參數將與root或其他user獨立,以免互相干擾,所有hduser的資料將位於/home/hduser。

$ sudo addgroup hadoop
$ sudo adduser --ingroup hadoop hduser
$ sudo adduser hduser sudo

     (二)設置ssh無密碼登入localhost。

apt-get install -y openssh-server 
apt-get install ssh 
ssh-keygen -q -N "" -t rsa -f ~/.ssh/id_rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

      (三)下載Hadoop壓縮檔,並解壓縮到/usr/local下,將hadoop-2.6.0更名為hadoop。

wget http://ftp.tc.edu.tw/pub/Apache/hadoop/common/hadoop-2.6.0/hadoop-2.6.0.tar.gz
tar vxzf hadoop-2.6.0.tar.gz -C /usr/local
cd /usr/local
mv hadoop-2.6.0/ hadoop 
chown -R hduser:hduser hadoop

       (四)設置環境變數:利用echo指令將下列環境變數設定文字append到.bashrc內容下。

 echo "#Hadoop variables
     export JAVA_HOME=/usr/lib/jvm/java-8-oracle/
     export HADOOP_PID_DIR=/usr/local/hadoop/pids/
     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
     ###end of paste" >> ~/.bashrc

       設置完成後,用以下指令reload

source ~/.bashrc

       測試hadoop指令

hadoop version
Hadoop 2.6.0
Subversion https://git-wip-us.apache.org/repos/asf/hadoop.git -r e3496499ecb8d220fba99dc5ed4c99c8f9e33bb1
Compiled by jenkins on 2014-11-13T21:10Z
Compiled with protoc 2.5.0
From source with checksum 18e43357c8f927c0695f1e9522859d6a
This command was run using /usr/local/hadoop/share/hadoop/common/hadoop-common-2.6.0.jar

       (五)修改配置文件
            1.先進到hadoop目錄

cd /usr/local/hadoop/etc/hadoop/

            2.hadoop-env.sh 此文件中要設定JDK安裝路徑,讓hadoop知道。

echo -e "#modify JAVA_HOME\\nexport JAVA_HOME=$JAVA_HOME">>hadoop-env.sh

            3.HDFS的配置                

               (1)vi core-site.xml//<configuration></configuration>之間加入

<property>
  <name>fs.default.name</name>
  <value>hdfs://localhost:9000</value>
</property>        

               (2)vi hdfs-site.xml//<configuration></configuration>之間加入

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

           4.YARN的配置         

          為了能夠運行MapReduce,需要讓各個NodeManager在啟動時加載shuffle server,vi yarn-site.xml

<property>
     <name>yarn.nodemanager.aux-services</name>
     <value>mapreduce_shuffle</value>
</property>
<property>
     <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
     <value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>

           5.MapReduce的配置              

               (1)先將mapred-site.xml.template改名為mapred-site.xml

mv mapred-site.xml.template mapred-site.xml

               (2)vi mapred-site.xml//<configuration></configuration>之間加入

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

        (六)Format Namenode

hdfs namenode -format

        (七)啟動HDFS及YARN

start-dfs.sh
start-yarn.sh
※查看管理介面:localhost:50070

         (八)啟動MapReduce

cd /usr/local/hadoop/
hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar pi 2 5
Number of Maps  = 2
Samples per Map = 5
Wrote input for Map #0
Wrote input for Map #1
Starting Job
14/12/19 10:34:29 INFO client.RMProxy: Connecting to ResourceManager at /0.0.0.0:8032

三、群集模式

在這裡使用Docker技術來模擬Cluster,首先利用Dockerfile將ubuntu、jdk8、hadoop2.6.0、sshd打包成image並設定環境變數以    便快速使用,或是可以直接用VMWare、Hyper-V、Virtual Box來模擬,差別僅在於配置部分。
          (一)準備2台機器,這裡使用Docker來啟動兩個container。
               a.可以根據Dockerfile來建立image:
               b.在DockerHub上下載打包好的環境,包含ubuntu、jdk8、hadoop環境變數設定,或自行撰寫Dockerfile並打包成image。
               c.假設我利用Dockerfile建立一個image叫mytest/hadoop-2.6.0-jdk8則


sudo docker run -itd -h master -p 9000:9000 -p 50070:50070 -p 22mytest/hadoop-2.6.0-jdk8
sudo docker run -itd -h slave1 -p 22 mytest/hadoop-2.6.0-jdk8

   當然也可以使用-v 參數來將資料夾掛入container之中,就不用每次要查看log或是files都要進入container之中。               

               d.開放出port 9000是因為要讓datanode傳送資訊時透過9000,而50070則是方便用WebUI檢視,22的部分則是為了能夠讓namenode順利使用ssh做為溝通管道。                 

          (二)配置master無密碼登入到其他機器:              

               a.在設定之前先清除已經ssh的連線  

rm -rf ~/.ssh/*    

               b.在master上產生一對金鑰

ssh-keygen -q -N "" -t rsa -f ~/.ssh/id_rsa

               c.將公鑰拷貝到自己

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

               d.將公鑰及認可的keys拷貝到其他機器,這裡為了方便而將整個.ssh資料夾copy過去,但較好的作法是將public key傳過去在寫入authorized_keys。

scp -r ~/.ssh/ root@slave1:~

          (三)於master中修改hosts

vi /etc/hosts
172.17.0.2 master
172.17.0.3 slave1

         (四)修改各主機的hostname

                 a.master

 vi /etc/hostname
 master

                 b.slave1

vi /etc/hostname
slave1

          (五)ssh設定完成後可順便將本機的/etc/hosts複製到遠端的/etc/hosts

scp /etc/hosts root@slave1:/etc/hosts

          (六)修改配置文件
               1.指定NameNode
               在core-site.xml中,fs.default.name,要改為運行NameNode那台機器的hostname。

<configuration>
   <property>
      <name>fs.defaultFS</name>
      <value>hdfs://master:9000</value>
   </property>
</configuration>

               2.指定ResourceManager
               在yarn-site.xml,增加yarn.resourcemanager.hostname

<property>
     <name>yarn.resourcemanager.hostname</name>
     <value>master</value>
</property>
<property>
     <name>yarn.nodemanager.aux-services</name>
     <value>mapreduce_shuffle</value>
</property>
<property>
      <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
      <value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>

               3.添加Slave,因為這裡只有一個Slave所以檔案中只會有一個

vi /usr/local/hadoop/etc/hadoop/slaves
root@slave1 

               4.設置hadoop.tmp.dir,在core-site.xml內增加,這是暫存的位置

<property>
    <name>hadoop.tmp.dir</name>
    <value>file:/usr/local/hadoop/tmp</value>
</property>

               5.修改mapred-site.xml,加入

<property>
      <name>mapreduce.jobtracker.staging.root.dir</name>
      <value>/user</value>
 </property>

               6.設置pid文件的存放位置,在hadoop-env.sh中增加

export HADOOP_MAPRED_PID_DIR=/usr/local/hadoop/pids

                在 mapred-env.sh中增加

export HADOOP_PID_DIR=/usr/local/hadoop/pids

                  7.設定checkpoint.dir及Slave個數
                       a.dfs.namenode.checkpoint.dir設為file:/usr/local/hadoop/tmp/hdfs/namesecondary
                       b.將dfs.replication設置為slave的個數,而這裡只有一台Slave,所以設為1,在hdfs-site.xml增加

<property>
    <name>dfs.namenode.secondary.http-address</name>
    <value>master:50090</value>
</property>
<property>
    <name>dfs.namenode.name.dir</name>
    <value>file:/usr/local/hadoop/tmp/hdfs/namenode</value>
</property>
<property>
    <name>dfs.datanode.data.dir</name>
    <value>file:/usr/local/hadoop/tmp/hdfs/datanode</value>
</property>
<property>
    <name>dfs.namenode.checkpoint.dir</name>
    <value>file:/usr/local/hadoop/tmp/hdfs/namesecondary</value>
</property>
<property>
     <name>dfs.replication</name>
     <value>1</value>
</property>

        (七)切換到群集模式之前需先把之前的臨時文件刪除。

 rm -r /usr/local/hadoop/tmp

           切換Hadoop模式不管是從群集切換到偽分佈,還是偽分佈切換到群集,這樣一來避免殘餘檔案造成無法啟動,尤其是DataNode,刪除完重新執行一次hdfs namenode -format,再啟動        

         (八)將配置文件Copy到Slaves

cd /usr/local/hadoop/etc/hadoop
scp * root@slave1:$HADOOP_INSTALL/etc/hadoop

         (九)啟動Hadoop
               (1)格式化NameNode,並啟動dfs

hdfs namenode -format
start-dfs.sh    

               (2) 啟動Yarn

start-yarn.sh

         (十)檢查是否啟動成功
              a.用jps指令查看
               在matser上應該會有:NameNode,SecondaryNameNode、ResourceManager,而Slave會有:DataNode,NodeManager
               b.hdfs dfsadmin -report查看狀態
         (十一)使用WebUI查看
               (1)NameNode:http://master:50070/
               (2)ResourceManager:http://master:8088/
               (3)NodeManager:http://slave1:8042
         (十二)操作hdfs
               1.創建目錄:hadoop fs -mkdir -f /tmp
               2.下載一個超過128MB的檔案:wget  http://ftp.tc.edu.tw/pub/Apache/hadoop/common/hadoop-2.6.0/hadoop-2.6.0.tar.gz            
               3.上傳檔案到該目錄:hadoop fs -put hadoop-2.6.0.tar.gz /tmp
三、錯誤處理
         (一).安裝時難免會發生一些網路連線或其他不可預期錯誤,因此可於/usr/local/hadoop/logs來查看日誌紀錄。
         (二)如果發生以下錯誤,那可能是防火牆沒有打開9000的port

INFO org.apache.hadoop.ipc.Client: Retrying connect to server: master/192.168.121.128:9000. Already tried 11 time(s); maxRetries=45
打開port9000
sudo ufw allow  in 9000
sudo ufw allow out 9000

         (三).如果發生以下錯誤,那可能是datanode與namenode溝通時發生的權限問題。
              1.namenode的log如下

 INFO org.apache.hadoop.ipc.Server: IPC Server handler 2 on 9000, call org.apache.hadoop.hdfs.server.protocol.DatanodeProtocol.versionRequest from 172.17.0.3:60122 Call#8 Retry#0: org.apache.hadoop.security.AccessControlException: Access denied for user root. Superuser privilege is required

              2.datanode的log如下

WARN org.apache.hadoop.hdfs.server.datanode.DataNode: Problem connecting to server: master/192.168.121.128:9000

              3.要解決此問題有兩個方式:
                   a.可將權限檢查關閉:
                   hdfs-site.xml,將dfs.permissions設為false

<property>
       <name>dfs.permissions</name>
       <value>false</value>
</property>

                如果是true,代表文件操作時的權限檢查,false則是關閉的但是其他的行為並沒有改變如文件或目錄的模式、擁有者或群組等訊息。                    

參考資料:http://hadoop.apache.org/docs/r1.0.4/cn/hdfs_permissions_guide.html
                    b.以chmod、chown改變目錄操作權限及擁有者,如chown hduser:hadoop /usr/local/hadoop

四、使用Docker架設Hadoop常用指令
         (一)查詢ip sudo docker inspect -f '{{ .NetworkSettings.IPAddress }}' YOUR_CONTAINER_ID
         (二)停止所有container:sudo docker stop $(sudo docker ps -a -q)


1 則留言: