Hadoop生產環境的配置


1.目錄規划

 



Master1/192.168.1.101

Master2/192.168.1.102

Slave1/192.168.1103

Slave2/192.168.1.17104

Slave3/192.168.1.17105

namenode

datanode

resourcemanager

journalnode

zookeeper

 

Journalnode和ZooKeeper保持奇數個,這點大家要有個概念,最少不少於 3 個節點

2.軟件規划

軟件

版本

位數

說明

jdk

jdk1.7

64位

最新穩定版本

centos

centos6.5

64位

 

zookeeper

Apache zookeeper3.4.6

 

穩定版本

hadoop

Apache hadoop2.6.0

 

穩定版本

3.用戶規划

節點名稱

用戶組

用戶

 

Master1

hadoop

hadoop

 

Master2

hadoop

hadoop

 

Slave1

hadoop

hadoop

 

Slave2

hadoop

hadoop

 

Slave3

hadoop

hadoop

 

 

 

 

 

4.目錄規划

 

所有軟件目錄

/home/hadoop/app/

所有數據和日志目錄

/home/hadoop/data/

5.時鍾同步

所有節點的系統時間要與當前時間保持一致。

查看當前系統時間

date
Tue Nov  3 06:06:04 CST 2015

如果系統時間與當前時間不一致,進行以下操作。

[root@Master1 ~]# cd /usr/share/zoneinfo/
[root@Maseter1 zoneinfo]# ls                //找到Asia
[root@Master1 zoneinfo]# cd Asia/           //進入Asia目錄
[root@Maseter1 Asia]# ls           //找到Shanghai
[root@Maseter1  Asia]# cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime              //當前時區替換為上海

我們可以同步當前系統時間和日期與NTP(網絡時間協議)一致。

[root@Maseter1 Asia]# yum install ntp   //如果ntp命令不存在,在線安裝ntp
[root@Maseter1 Asia]# ntpdate pool.ntp.org           //執行此命令同步日期時間
[root@Maseter1 Asia]# date          //查看當前系統時間

6.hosts文件檢查

 hosts文件檢查

所有節點的hosts文件都要配置靜態ip與hostname之間的對應關系。

[root@djt11 Asia]# vi /etc/hosts
192.168.1.101 Master1
192.168.1.102 Master2
192.168.1.103 Slave1
192.168.1.104 Slave2
192.168.1.105 Slave3

禁用防火牆

所有節點的防火牆都要關閉。

查看防火牆狀態

[root@Master1 Asia]# service iptables status
iptables: Firewall is not running.

如果不是上面的關閉狀態,則需要關閉防火牆。

[root@Master1  Asia]#  chkconfig iptables off                 //永久關閉防火牆
[root@Master1 Asia]#  service iptables stop          /

創建hadoop用戶

  1. [root@Master1 ~]# groupadd hadoop //創建用戶組
  2. [root@Master1 ~]# useradd -g hadoop hadoop //新建hadoop用戶並增加到hadoop工作組
  3. [root@Master1 ~]# passwd hadoop    //設置密碼

配置SSH免密碼通信

[root@Master1~]# su hadoop          //切換到hadoop用戶下
[hadoop@Master1root]$ cd           //切換到hadoop用戶目錄
[hadoop@Master1~]$ mkdir .ssh
[hadoop@Master1~]$ ssh-keygen -t rsa                 //執行命令一路回車,生成秘鑰
[hadoop@Master1~]$cd .ssh 
[hadoop@Master1.ssh]$ ls
id_rsa  id_rsa.pub
[hadoop@Master1.ssh]$ cat id_ras.pub >> authorized_keys               //將公鑰保存到authorized_keys認證文件中
[hadoop@Master1.ssh]$ ls
authorized_keys  id_rsa  id_rsa.pub
[hadoop@Master1.ssh]$ cd ..
[hadoop@Master1~]$ chmod 700 .ssh
[hadoop@Master1~]$ chmod 600 .ssh/*
[hadoop@Master1~]$ ssh Master1              //第一次執行需要輸入yes
[hadoop@Master1~]$ ssh Master1

每個節點都同樣的操作

將所有節點中的共鑰id_ras.pub拷貝到Master1中的authorized_keys文件中。

cat ~/.ssh/id_rsa.pub | ssh hadoop@Master1 'cat >> ~/.ssh/authorized_keys  所有節點都需要執行這條命令

然后將Master1中的authorized_keys文件分發到所有節點上面。

scp -r authorized_keys hadoop@Master2:~/.ssh/
 
scp -r authorized_keys hadoop@Slave1:~/.ssh/
 
scp -r authorized_keys hadoop@Slave2:~/.ssh/
 
scp -r authorized_keys hadoop@Slave3:~/.ssh/

大家通過ssh 相互訪問,如果都能無密碼訪問,代表ssh配置成功

腳本工具的使用

在Master1節點上創建/home/hadoop/tools目錄。

[hadoop@Master1 ~]$ mkdir /home/hadoop/tools
cd /home/hadoop/tools

將本地腳本文件上傳至/home/hadoop/tools目錄下。這些腳本大家如果能看懂也可以自己寫, 如果看不懂直接使用就可以,后面慢慢補補Linux相關的知識。

[hadoop@Master1tools]$ rz deploy.conf
[hadoop@Master1tools]$ rz deploy.sh
[hadoop@Master1tools]$ rz runRemoteCmd.sh
[hadoop@Master1tools]$ ls
deploy.conf  deploy.sh  runRemoteCmd.sh

查看一下deploy.conf配置文件內容。

[hadoop@Master1tools]$ cat deploy.conf
Master1,all,namenode,zookeeper,resourcemanager,
Master1,all,slave,namenode,zookeeper,resourcemanager,
Slave1,all,slave,datanode,zookeeper,
Slave2,all,slave,datanode,zookeeper,
Slave3,all,slave,datanode,zookeeper,

查看一下deploy.sh遠程復制文件腳本內容。

[hadoop@Master1 tools]$ cat deploy.sh
#!/bin/bash
#set -x
 
if [ $# -lt 3 ]
then 
  echo "Usage: ./deply.sh srcFile(or Dir) descFile(or Dir) MachineTag"
  echo "Usage: ./deply.sh srcFile(or Dir) descFile(or Dir) MachineTag confFile"
  exit 
fi
 
src=$1
dest=$2
tag=$3
if [ 'a'$4'a' == 'aa' ]
then
  confFile=/home/hadoop/tools/deploy.conf
else 
  confFile=$4
fi
 
if [ -f $confFile ]
then
  if [ -f $src ]
  then
    for server in `cat $confFile|grep -v '^#'|grep ','$tag','|awk -F',' '{print $1}'` 
    do
       scp $src $server":"${dest}
    done 
  elif [ -d $src ]
  then
    for server in `cat $confFile|grep -v '^#'|grep ','$tag','|awk -F',' '{print $1}'` 
    do
       scp -r $src $server":"${dest}
    done 
  else
      echo "Error: No source file exist"
  fi
 
else
  echo "Error: Please assign config file or run deploy.sh command with deploy.conf in same directory"
fi

查看一下runRemoteCmd.sh遠程執行命令腳本內容。

[hadoop@Master1 tools]$ cat runRemoteCmd.sh 
#!/bin/bash
#set -x
 
if [ $# -lt 2 ]
then 
  echo "Usage: ./runRemoteCmd.sh Command MachineTag"
  echo "Usage: ./runRemoteCmd.sh Command MachineTag confFile"
  exit 
fi
 
cmd=$1
tag=$2
if [ 'a'$3'a' == 'aa' ]
then
  
  confFile=/home/hadoop/tools/deploy.conf
else 
  confFile=$3
fi
 
if [ -f $confFile ]
then
    for server in `cat $confFile|grep -v '^#'|grep ','$tag','|awk -F',' '{print $1}'` 
    do
       echo "*******************$server***************************"
       ssh $server "source /etc/profile; $cmd"
    done 
else
  echo "Error: Please assign config file or run deploy.sh command with deploy.conf in same directory"
fi

以上三個文件,方便我們搭建hadoop分布式集群。具體如何使用看后面如何操作。

如果我們想直接使用腳本,還需要給腳本添加執行權限。

[hadoop@Master1 tools]$ chmod u+x deploy.sh
[hadoop@Master1 tools]$ chmod u+x runRemoteCmd.sh

同時我們需要將/home/hadoop/tools目錄配置到PATH路徑中。

[hadoop@Master1 tools]$ su root
Password:
[root@Master1 tools]# vi /etc/profile
PATH=/home/hadoop/tools:$PATH
export PATH

 

用腳本runRemoteCmd.sh “/home/hadoop/app”all

在所有節點上創建軟件目錄

jdk安裝

將本地下載好的jdk1.7,上傳至djt11節點下的/home/hadoop/app目錄。

[root@Master1 tools]# su hadoop
[hadoop@Master1 tools]$ cd /home/hadoop/app/
[hadoop@Master1 app]$ rz           //選擇本地的下載好的jdk-7u79-linux-x64.tar.gz
[hadoop@Master1 app]$ ls
jdk-7u79-linux-x64.tar.gz
[hadoop@Master1 app]$ tar zxvf jdk-7u79-linux-x64.tar.gz               //解壓
[hadoop@Master1 app]$ ls
jdk1.7.0_79 jdk-7u79-linux-x64.tar.gz
[hadoop@Master1 app]$ rm jdk-7u79-linux-x64.tar.gz            //刪除安裝包

添加jdk環境變量。

[hadoop@Master1 app]$ su root
Password:
[root@Master1 app]# vi /etc/profile
JAVA_HOME=/home/hadoop/app/jdk1.7.0_79
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME CLASSPATH PATH
[root@djt11 app]# source /etc/profile                //使配置文件生效

查看jdk是否安裝成功。

[root@Master1 app]# java -version
java version "1.7.0_79"
Java(TM) SE Runtime Environment (build 1.7.0_79-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.79-b02, mixed mode)

出現以上結果就說明Master1 節點上的jdk安裝成功。

然后將Master1 下的jdk安裝包復制到其他節點上。

[hadoop@Master1 app]$ deploy.sh jdk1.7.0_79 /home/hadoop/app/ slave

Master1,Master2,Master3,Master4節點重復Master1節點上的jdk配置環境變量即可

 

Zookeeper安裝

將本地下載好的zookeeper-3.4.6.tar.gz安裝包,上傳至Master1節點下的/home/hadoop/app目錄下。

[hadoop@Master1 app]$ rz           //選擇本地下載好的zookeeper-3.4.6.tar.gz
[hadoop@Master1 app]$ ls
jdk1.7.0_79 zookeeper-3.4.6.tar.gz
[hadoop@Master1 app]$ tar zxvf zookeeper-3.4.6.tar.gz                 //解壓
[hadoop@Master1 app]$ ls
jdk1.7.0_79 zookeeper-3.4.6.tar.gz zookeeper-3.4.6
[hadoop@Master1 app]$ rm zookeeper-3.4.6.tar.gz               //刪除zookeeper-3.4.6.tar.gz安裝包
[hadoop@Master1 app]$ mv zookeeper-3.4.6 zookeeper            //重命名
                  

修改Zookeeper中的配置文件。

[hadoop@Master1 app]$ cd /home/hadoop/app/zookeeper/conf/
[hadoop@Master1 conf]$ ls
configuration.xsl  log4j.properties  zoo_sample.cfg
[hadoop@Master1 conf]$ cp zoo_sample.cfg zoo.cfg              //復制一個zoo.cfg文件
[hadoop@Master1 conf]$ vi zoo.cfg
dataDir=/home/hadoop/data/zookeeper/zkdata          //數據文件目錄
dataLogDir=/home/hadoop/data/zookeeper/zkdatalog             //日志目錄
# the port at which the clients will connect
clientPort=2181           //默認端口號
#server.服務編號=主機名稱:Zookeeper不同節點之間同步和通信的端口:選舉端口(選舉leader)
server.1=Master1:2888:3888
server.2=Master2:2888:3888
server.3=Slave1:2888:3888
server.4=Slave2:2888:3888
server.5=Slave3:2888:3888

通過遠程命令deploy.sh將Zookeeper安裝目錄拷貝到其他節點上面。

[hadoop@Master1 app]$ deploy.sh zookeeer /home/hadoop/app  slave

通過遠程命令runRemoteCmd.sh在所有的節點上面創建目錄:

[hadoop@Master1 app]$ runRemoteCmd.sh "mkdir -p /home/hadoop/data/zookeeper/zkdata" all   //創建數據目錄
[hadoop@Master1 app]$ runRemoteCmd.sh "mkdir -p /home/hadoop/data/zookeeper/zkdatalog" all   //創建日志目錄

然后分別在Master1、Master2、Slave1、Slave2、Slave3上面,進入zkdata目錄下,創建文件myid,里面的內容分別填充為:1、2、3、4、5, 這里我們以Master1為例。

[hadoop@Master1 app]$ cd /home/hadoop/data/zookeeper/zkdata
[hadoop@Master1 zkdata]$ vi myid
1        //輸入數字1
                  

配置Zookeeper環境變量。

[hadoop@Master1 zkdata]$ su root
Password: 
[root@Master1 zkdata]# vi /etc/profile
JAVA_HOME=/home/hadoop/app/jdk1.7.0_79
ZOOKEEPER_HOME=/home/hadoop/app/zookeeper
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
PATH=$JAVA_HOME/bin:$ZOOKEEPER_HOME/bin:$PATH
export JAVA_HOME CLASSPATH PATH ZOOKEEPER_HOME
[root@Master1 zkdata]# source /etc/profile           //使配置文件生效
runRemoteCmd.sh "/home/hadoop/app/zookeeper/bin/zkServer.sh start" zookeeper
runRemoteCmd.sh “jps” all 查看是否安裝成功
runRemoteCmd.sh "/home/hadoop/app/zookeeper/bin/zkServer.sh stop" zookeeper

hadoop集群環境搭建

將下載好的apache hadoop-2.6.0.tar.gz安裝包,上傳至Master1 節點下的/home/hadoop/app目錄下。

[hadoop@Master1 app]$ rz  //將本地的hadoop-2.6.0.tar.gz安裝包上傳至當前目錄
[hadoop@Master1 app]$ ls
hadoop-2.6.0.tar.gz jdk1.7.0_79  zookeeper
[hadoop@Master1 app]$ tar zxvf hadoop-2.6.0.tar.gz            //解壓
[hadoop@Master1 app]$ ls
hadoop-2.6.0 hadoop-2.6.0.tar.gz jdk1.7.0_79  zookeeper
[hadoop@Master1 app]$ rm hadoop-2.6.0.tar.gz                  //刪除安裝包
[hadoop@Master1 app]$ mv hadoop-2.6.0 hadoop                  //重命名
                  

切換到/home/hadoop/app/hadoop/etc/hadoop/目錄下,修改配置文件。

[hadoop@Master1 app]$ cd /home/hadoop/app/hadoop/etc/hadoop/

配置HDFS

配置hadoop-env.sh

[hadoop@Master1 hadoop]$ vi hadoop-env.sh
export JAVA_HOME=/home/hadoop/app/jdk1.7.0_79
                  

配置core-site.xml

[hadoop@Master1 hadoop]$ vi core-site.xml<configuration>
         <property>
                  <name>fs.defaultFS</name>
                  <value>hdfs://cluster1</value>
         </property>
         < 這里的值指的是默認的HDFS路徑 ,取名為cluster1>
         <property>
                  <name>hadoop.tmp.dir</name>
                  <value>/home/hadoop/data/tmp</value>
         </property>
         < hadoop的臨時目錄,如果需要配置多個目錄,需要逗號隔開,data目錄需要我們自己創建>
         <property>
                  <name>ha.zookeeper.quorum</name>
                  <value>master1:2181,Master2:2181,Slave1:2181,Slave2:2181,                            Slave3:2181</value>
    </property>
    < 配置Zookeeper 管理HDFS>
</configuration>
 

配置hdfs-site.xml

[hadoop@Master1hadoop]$ vi hdfs-site.xml<configuration>
         <property>
                  <name>dfs.replication</name>
                  <value>3</value>
    </property>
         < 數據塊副本數為3>
         <property>
                  <name>dfs.permissions</name>
                  <value>false</value>
         </property>
         <property>
                  <name>dfs.permissions.enabled</name>
                  <value>false</value>
         </property>
         < 權限默認配置為false>
         <property>
                  <name>dfs.nameservices</name>
                  <value>cluster1</value>
         </property>
         < 命名空間,它的值與fs.defaultFS的值要對應,namenode高可用之后有兩個namenode,cluster1是對外提供的統一入口>
         <property>
                  <name>dfs.ha.namenodes.cluster1</name>
                  <value>Master1,Master2</value>
         </property>
         < 指定 nameService 是 cluster1 時的nameNode有哪些,這里的值也是邏輯名稱,名字隨便起,相互不重復即可>
         <property>
                  <name>dfs.namenode.rpc-address.cluster1.Master1</name>
                  <value>Master2:9000</value>
         </property>
         < djt11 rpc地址>
         <property>
                  <name>dfs.namenode.http-address.cluster1.Master1</name>
                  <value>Master2:50070</value>
         </property>
         < djt11 http地址>
         <property>
                  <name>dfs.namenode.rpc-address.cluster1.Master2</name>
                  <value>Master2:9000</value>
         </property>
         < djt12 rpc地址>
         <property>
                  <name>dfs.namenode.http-address.cluster1.Master2</name>
                  <value>Master2:50070</value>
         </property>
         < djt12 http地址>
         <property>
                  <name>dfs.ha.automatic-failover.enabled</name>
                  <value>true</value>
    </property>
         < 啟動故障自動恢復>
         <property>
                  <name>dfs.namenode.shared.edits.dir</name>
                  <value>qjournal://Master1:8485;Master2:8485;Slave1:8485;Slave2:8485;Slave3:8485/cluster1</value>
         </property>
         < 指定journal>
         <property>
                  <name>dfs.client.failover.proxy.provider.cluster1</name>
                  <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    </property>
         < 指定 cluster1 出故障時,哪個實現類負責執行故障切換>
    <property>
                  <name>dfs.journalnode.edits.dir</name>
                  <value>/home/hadoop/data/journaldata/jn</value>
    </property>
         < 指定JournalNode集群在對nameNode的目錄進行共享時,自己存儲數據的磁盤路徑 >
         <property>
                  <name>dfs.ha.fencing.methods</name>
                  <value>shell(/bin/true)</value>
    </property>
    <property>
        <name>dfs.ha.fencing.ssh.private-key-files</name>
        <value>/home/hadoop/.ssh/id_rsa</value>
    </property>
         <property>
        <name>dfs.ha.fencing.ssh.connect-timeout</name>
        <value>10000</value>
    </property>
         < 腦裂默認配置>
    <property>
                  <name>dfs.namenode.handler.count</name>
                  <value>100</value>
    </property></configuration>

配置 slave

[hadoop@Master1 hadoop]$ vi slaves
Slave1
Slave2
Slave3

YARN安裝配置

配置mapred-site.xml

[hadoop@Master hadoop]$ vi mapred-site.xml<configuration>
         <property>
                  <name>mapreduce.framework.name</name>
                  <value>yarn</value>
         </property>
         <指定運行mapreduce的環境是Yarn,與hadoop1不同的地方></configuration>
                  

配置yarn-site.xml

[hadoop@Master1 hadoop]$ vi yarn-site.xml<configuration><property>
         <name>yarn.resourcemanager.connect.retry-interval.ms</name>
         <value>2000</value></property>< 超時的周期><property>
         <name>yarn.resourcemanager.ha.enabled</name>
         <value>true</value></property>< 打開高可用><property>
         <name>yarn.resourcemanager.ha.automatic-failover.enabled</name>
         <value>true</value></property><啟動故障自動恢復><property>
         <name>yarn.resourcemanager.ha.automatic-failover.embedded</name>
         <value>true</value></property>
<failover使用內部的選舉算法 style="box-sizing: border-box; margin: 0px; padding: 0px;"><property>
         <name>yarn.resourcemanager.cluster-id</name>
         <value>yarn-rm-cluster</value></property><給yarn cluster 取個名字yarn-rm-cluster><property>
         <name>yarn.resourcemanager.ha.rm-ids</name>
         <value>rm1,rm2</value></property><給ResourceManager 取個名字 rm1,rm2><property>
         <name>yarn.resourcemanager.hostname.rm1</name>
         <value>Master1</value></property><配置ResourceManager rm1 hostname><property>
         <name>yarn.resourcemanager.hostname.rm2</name>
         <value>Master2</value></property><配置ResourceManager rm2 hostname><property>
         <name>yarn.resourcemanager.recovery.enabled</name>
         <value>true</value></property><啟用resourcemanager 自動恢復><property>
         <name>yarn.resourcemanager.zk.state-store.address</name>
         <value>Master1:2181,Master2:2181,Slave1:2181,Slave2:2181,Slave3:2181</value></property><配置Zookeeper地址><property>
         <name>yarn.resourcemanager.zk-address</name>
         <value>Master1:2181,Master2:2181,Slave1:2181,Slave2:2181,Slave3:2181</value></property><配置Zookeeper地址><property>
         <name>yarn.resourcemanager.address.rm1</name>
         <value>Master1:8032</value></property>< rm1端口號><property>
         <name>yarn.resourcemanager.scheduler.address.rm1</name>
         <value>Master1:8034</value></property>< rm1調度器的端口號><property>
         <name>yarn.resourcemanager.webapp.address.rm1</name>
         <value>Master1:8088</value></property>< rm1 webapp端口號><property>
         <name>yarn.resourcemanager.address.rm2</name>
         <value>Master2:8032</value></property>< rm2端口號><property>
         <name>yarn.resourcemanager.scheduler.address.rm2</name>
         <value>Master2:8034</value></property>< rm2調度器的端口號><property>
         <name>yarn.resourcemanager.webapp.address.rm2</name>
         <value>Master2:8088</value></property>< rm2 webapp端口號><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><執行MapReduce需要配置的shuffle過程></configuration>

向所有節點分發hadoop安裝包。

[hadoop@Master1 app]$ deploy.sh hadoop /home/hadoop/app/ slave

1、啟動所有Zookeeper

[hadoop@Master1 hadoop]$ runRemoteCmd.sh "/home/hadoop/app/zookeeper/bin/zkServer.sh start" zookeeper

2、每個節點分別啟動journalnode

[hadoop@Master1 hadoop]$ runRemoteCmd.sh "/home/hadoop/app/hadoop/sbin/hadoop-daemon.sh start journalnode" all

3、主節點執行格式化

[hadoop@Master1 hadoop]$ bin/hdfs namenode -format / /namenode 格式化
[hadoop@Master1 hadoop]$ bin/hdfs zkfc -formatZK //格式化高可用
[hadoop@Master1 hadoop]$bin/hdfs namenode //啟動namenode
                  

4、備節點執行

[hadoop@Master1 hadoop]$ bin/hdfs namenode -bootstrapStandby //同步主節點和備節點之間的元數據
                  

5、停掉hadoop,在Master1按下ctrl+c結束namenode

[hadoop@Master1 hadoop]$ runRemoteCmd.sh "/home/hadoop/app/hadoop/sbin/hadoop-daemon.sh stop journalnode" all       //然后停掉各節點的journalnode

6、一鍵啟動hdfs相關進程

[hadoop@Master1 hadoop]$ sbin/start-dfs.sh

7、在Master1節點上執行。

[hadoop@Master2 hadoop]$ sbin/start-yarn.sh 
                  

8、在Master2節點上面執行。

[hadoop@Master2 hadoop]$ sbin/yarn-daemon.sh start resourcemanager

9、驗證namenode:

http://Master1:50070
http://Master2:50070

10、驗證yarn:

http://Master1:8088
http://Master2:8088

 

 


免責聲明!

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



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