Hadoop2.x集羣的安裝主要包括兩個核心NameNode(一個主節點),DataNode(多個從節點),NameNode有三個作用:(1)管理HDFS文件系統的無數據信息,如文件的名稱、文件大小、建立時間、修改時間、存儲位置等;(2)存儲HDFS的邏輯關係,也可以理解爲文件目錄,即文件與塊節點的映射關係;(3)存儲用戶對文件的操作日誌。DataNode的作用主要是用於存儲文件。
Hadoop的運行模式主要有三種:
• 單機模式。默認情況下,Hadoop被配置成以非分佈式模式運行的一個獨立Java進程。這對調試非常有幫助。
• 僞分佈式模式。Hadoop可以在單節點上以所謂的僞分佈式模式運行,此時每一個Hadoop守護進程都作爲一個獨立的Java進程運行。
• 完全分佈式模式。具有實際意義的Hadoop集羣,其規模可從幾個節點的小集羣到幾千個節點的超大集羣。
3.1 基礎學習:Hadoop2.x完全分佈式實驗環境安裝
所謂“萬事開頭難”,Hadoop2.x集羣實驗環境的安裝放倒了不少新手,沒有安裝好實驗環境導致後面的內容沒法學習,於是乎只有放棄了。在本節中,主要介紹Hadoop2.x的完全分佈模式。
3.1.1 硬件環境
至少滿足以下配置的普通PC機三臺:
處理器:二核1.7G+ 硬盤:40G+ 內存:768M+ 網絡:局域網
3.1.2 軟件環境
(1) JDK:Java 7+,可以從Oracle官網下載Linux版本,64位。
(2) Hadoop2.x:可以從Hadoop官網http://hadoop.apache.org/core/releases.html
(3) 操作系統:CentOS,64位,下載地址:http://isoredirect.centos.org/centos/6.5/isos/
3.1.3 Linux環境安裝
(1) 安裝3臺搭載CentOS6.5的主機,也可以用虛擬主機,並保證每臺主機上有統一的登錄名,如hadoop,使用客戶端軟件(如使用PieTTY 0.3.26、putty登錄CentOS)登錄到CentOS,相同的目錄結構。
1)更改hostname,將每臺主機名改成便於管理的名字:vi /etc/sysconfig/network 修改hostname
2)更改hosts,在作爲namenode節點的主機上配置IP與主機名的對應關係:vi /etc/hosts,如:
192.168.8.11 master
192.168.8.12 slave12
192.168.8.13 slave13
3)關閉防火牆
service iptables stop
chkconfig iptables off
(2) 安裝JDK在每臺主機上安裝JDK,需把準備好的jdk-7u55-linux-x64.tar.gz放到Linux系統中,當然可以採用wget方法直接下載,也可採用WinSCP上傳。說下WinSCP的文件上傳吧。
step1:下載安裝WinSCP,如果不會下載安裝,先百度啦。
step2:打開WinSCP,如圖4-1:
圖3-1 WinSCP界面
step3:在主機名處輸入主機的IP地址,也可輸入名(但需要設置hosts),輸入用戶名及登錄密碼,單擊“登錄”按鈕,出現如圖4-2:
圖4-2 WinSCP操作界面
note:左側圓角框所示爲本地Windows系統目錄結構,右側直角框所示爲Linux目錄結構。
step4:在左側找到等上傳的jdk-7u71-linux-x64.gz,在右側找到目標位置,這裏選擇的是/home/hadoop目錄,將左側的jdk-7u71-linux-x64.gz拖至右側即可。
接下來的工作就是到Linux系統上安裝JDK啦,
1)安裝JDK
找到/usr目錄,並建立一個目錄java,命令:
cd /usr
mkdir java
將剛纔上傳的文件移動到/usr/java下,命令:
mv /home/hadoop/jdk-7u71-linux-x64.gz /usr/java/jdk-7u71-linux-x64.gz
進入目錄/usr/java,命令:
cd /usr/java
用ls查看一下目錄下的文件,確認/jdk-7u71-linux-x64.gz已經存在後,使用命令:
用tar命令解壓安裝JDK,命令:
tar -zxvf jdk-7u55-linux-x64.tar.gz
2)配置JAVA環境變量
step2:按下i鍵進入編輯模式,加入以下內容:
export JAVA_HOME=/usr/java/jdk1.7.0_71
export PATH=.:$JAVA_HOME/bin:$PATH
step3:按ESC鍵後再輸入:wq保存退出。
step4:使用source命令在當前bash環境下讀取並執行profile中的命令,如下:
source /home/hadoop/.bash_profile
step5:確認,使用java -version出現以下提示,則說明JDK安裝成功。
java version "1.7.0_71"Java(TM) SE Runtime Environment (build 1.7.0_71-b14)
Java HotSpot(TM) 64-Bit Server VM (build 24.71-b01, mixed mode)
並將其分發到各datanode結點上,命令:
scp -rf /usr/java/ root@slave12:/usr/java
scp /home/hadoop/.bash_profile root@slave12:/home/hadoop/.bash_profile
(3)配置主機名稱
使用root用戶配置主機名,將作爲namenode的結點命名爲:master,命令:
vi /etc/sysconfig/network
寫入:
HOSTNAME=master
其他的datanode,如12結點命名爲:slave12,命令:
vi /etc/sysconfig/network
寫入:
HOSTNAME=slave12(4)用root用戶 配置hosts,是爲了在安裝HDFS時直接引用主機名,將主機的IP映射爲主機名,便於安裝HDFS時使用主機名,方便管理。
vi /etc/hosts
加入:
192.168.8.11 master
192.168.8.12 slave12
192.168.8.13 slave13
其他的datanode 也要如此配置。
(5) 設置ssh登錄(很關鍵)
cd /home/hadoop
ssh-keygen -t rsa
一路回車,生成id_rsa.pub等文件。
chmod 0700 .ssh
用命令ls -a查看,存在.ssh文件夾。
在其他datanode結點上, 進入ssh目錄,cd .ssh,做相同的工作,如下:
將namenode結點的id_rsa.pub拷貝到各datanode節點的相同目錄下,執行touch /root/.ssh/authorized_keys (如果已經存在這個文件, 跳過這條),chmod 600 ~/.ssh/authorized_keys (# 注意: 必須將~/.ssh/authorized_keys的權限改爲600, 該文件用於保存ssh客戶端生成的公鑰,可以修改服務器的ssh服務端配置文件/etc/ssh/sshd_config來指定其他文件名),cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys (將id_rsa.pub的內容追加到 authorized_keys 中, 注意不要用 > ,否則會清空原有的內容,使其他人無法使用原有的密鑰登錄)
在namenode上驗證: ssh slaver12,出現下面提示表示成功:
Last login:Thu Apr 23 06:11:34 from 192.168.1.11
(6)Hadoop集羣的HDFS文件系統主要通過心跳機制來判斷各DataNode的在線情況,所以需要設置在NameNode節點與DataNode節點上設置時鐘同步。分別在各主機上配置時間同步,命令:
crontab -e
插入內容:
0 1 * * * /usr/sbin/ntpdate us.pool.ntp.org #us.pool.ntp.org是時鐘同步網址,0 1 * * * 之間均有空格
(7)關閉NameNode節點與各DataNode節點的防火牆,切換到root用戶下,執行命令:
service iptables stop
3.1.4 安裝Hadoop2.x
將下載的hadoop-2.5.1.tar.gz上傳至namenode節點主機的/home/hadoop目錄下,也可直接用wget命令下載到此目錄下。wget http://apache.claz.org/hadoop/core/hadoop-2.5.2/hadoop-2.5.2.tar.gz
(1)進入目錄/home/hadoop目錄下,解壓hadoop-2.5.2.tar.gz。命令:
tag -xvf hadoop-2.5.2.tar.gz
(2)在目錄/home/hadoop目錄下建立文件夾mydata,命令:
mkdir mydata
(3)在文件hadoop-env.sh中配置Hadoop2.x運行時的JDK環境變量,命令:
vi /home/hadoop/hadoop-2.5.1/etc/hadoop/hadoop-env.sh
文件打開後,將:export JAVA_HOME=${JAVA_HOME}修改爲:export JAVA_HOME=/usr/java/jdk1.7.0_71,也就是JAVA_HOME的路徑。
(4)在文件yarn-env.sh中配置yarn所需的JDK環境變量,命令:
vi /home/hadoop/hadoop-2.5.1/etc/hadoop/yarn-env.sh
文件打開後,找到#export JAVA_HOME=/home/y/libexec/jdk1.6.0,將其改了:export JAVA_HOME=/usr/java/jdk1.7.0_71,並去除註釋符號#。
(5)在文件core-site.xml中配置核心組件,命令:
vi /home/hadooop/hadoop-2.5.1/etc/hadoop/core-site.xml
完整配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/mydata</value>
</property>
</configuration>
(6)在文件hdfs-site.xml中配置文件系統,命令:
vi /home/hadoop/hadoop-2.5.1/etc/hadoop/hdfs-site.xml
完整配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value><!--1代表一個副本-->
</property>
</configuration>
(7)在文件yarn-site.xml中配置文件系統,命令:
vi /home/hadoop/hadoop-2.5.1/etc/hadoop/yarn-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>master:18040</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>master:18030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>master:18025</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>master:18141</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>master:18088</value>
</property>
</configuration>
(8)複製mapred-site.xml.template爲mapred-site.xml,並在文件mapred-site.xml中配置計算框架,命令:
cp /home/hadoop/hadoop-2.5.1/etc/hadoop/mapred-site.xml.template /home/hadoop/hadoop-2.5.1/etc/hadoop/mapred-site.xml
vi /home/hadoop/hadoop-2.5.1/etc/hadoop/mapred-site.xml
完整配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
(9)在文件slaves中配置DataNode節點,命令:
vi /home/hadoop/hadoop-2.5.1/etc/hadoop/slaves
在slaves中填寫DataNode節點名稱,一行填寫一個DataNode名稱,如:
slave12
slave13
(10)分發Hadoop-2.5.1文件夾至各DataNode節點主機,命令:
scp -r /home/hadoop/hadoop-2.5.1 hadoop@slave12:/home/hadoop/hadoop-2.5.1
scp -r /home/hadoop/hadoop-2.5.1 hadoop@slave13:/home/hadoop/hadoop-2.5.1
(11)在NameNode節點與各DataNode節點主機上的文件/home/hadoop/.bash_profile文件中配置Hadoop集羣啓動的系統環境變量,命令:
vi /home/hadoop/.bash_profile
在文件的最後一行加入以下內容:
export HADOOP_HOME=/home/hadoop/hadoop-2.5.1
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
用命令source /home/hadoop/.bash_profile,全其配置生效。
(12)在NameNode節點主機上執行格式化HDFS文件系統的命令:
hdfs namenode -format
(13)在NameNode節點上啓動Hadoop集羣,命令:
cd /home/hadoop/hadoop-2.5.1
sbin/start-all.sh
可以通過進程查看集羣是否啓動成功,在NameNode節點上存在進程: ResourceManager、NameNode和SecondaryNameNode三個進程,在各DataNode節點存在兩個進程:DataNode和NodeManager ,查看進程的Linux命令爲jps。
還可以通過Web UI方式查看進程是否啓動成功。在瀏覽器地址欄中輸入Http://master:50070即可查看,當然需要在本機上的hosts文件中加入:
192.168.8.11 master
192.168.8.12 slave12
192.168.8.13 slave13
成功時再現圖4-3所示界面。
圖4-3 web ui提示界面
3.1.5 我的第一個Hadoop運算——PI
進入hadoop-2.5.1目錄下的示例文件夾,命令:
cd /home/hadoop/hadoop-2.5.1/share/hadoop/mapreduce
執行命令:
hadoop jar hadoop-mapreduce-examples-2.5.1.jar pi 10 10
在集羣成功配置,並運行正常的情況下,可以輸出如結果: