1 作業題目
2 編譯Hadoop2.X 64bit
2.1 運行環境說明
2.1.1 硬軟件環境
2.1.2 集群網絡環境
2.2 環境搭建
2.2.1 JDK安裝和Java環境變量配置
2.2.2 安裝並設置maven
2.2.3 以root用戶使用yum安裝svn
2.2.4 以root用戶使用yum安裝autoconf automake libtool cmake
2.2.5 以root用戶使用yum安裝ncurses-devel
2.2.6 以root用戶使用yum安裝openssl-devel
2.2.7 以root用戶使用yum安裝gcc*
2.2.8 安裝並設置protobuf
2.3 編譯Hadoop
2.3.1 下載Hadoop源代碼 Release2.2.0
2.3.2 編譯Hadoop源代碼
2.3.3 驗證編譯是否成功
3 Hadoop2.X 64bit安裝
3.1 運行環境說明
3.1.1 硬軟件環境
3.1.2 集群網絡環境
3.1.3 安裝使用工具
3.2 環境搭建
3.2.1 配置本地環境
3.2.2 設置操作系統環境
3.3 配置Hadooop設置
3.3.1 下載並解壓hadoop安裝包
3.3.2 在Hadoop目錄下創建子目錄
3.3.3 配置hadoop-env.sh
3.3.4 配置yarn-env.sh
3.3.5 配置core-site.xml
3.3.6 配置hdfs-site.xml
3.3.7 配置mapred-site.xml
3.3.8 配置yarn-site.xml
3.3.9 配置slaves文件
3.3.10向各節點分發hadoop程序
3.3.11格式化namenode
3.3.12啟動hdfs
3.3.13驗證當前進行
3.3.14啟動yarn
3.3.15驗證當前進行
4 實驗性問題解決
4.1 運行環境說明
4.1.1 硬軟件環境
4.1.2 集群網絡環境
4.2 問題1--給web監控界面加上安全機制
4.2.1 修改Core-Site.xml文件
4.2.2 手動創建signature-secret文件
4.2.3 把該文件分發到兩個datanode中
4.2.4 重新啟動hadoop
4.2.5 驗證訪問
4.3 問題2--模擬namenode崩潰並恢復
4.3.1 刪除NameNode中Name目錄下所有文件,模擬崩潰
4.3.2 重啟Hadoop
4.3.3 格式化NameNode
4.3.4 獲取DataNode的namespaceID
4.3.5 修改NameNode的namespaceID
4.3.6 刪除NameNode的fsimage
4.3.7 從SSN中拷貝fsimage到NN中
4.3.8 重啟Hadoop
4.4 問題3--改變HDFS塊大小
4.4.1 在Hadoop中建立/input文件夾
4.4.2 查看當前blocksize
4.4.3 修改hdfs-site.xml配置文件
4.4.4 重啟Hadoop
4.4.5 再次查看當前blocksize
4.5 問題4--SNN與NN的分離
4.5.1 復制虛擬機
4.5.2 設置SNN虛擬機IP地址
4.5.3 設置SNN虛擬機名稱
4.5.4 所有節點hosts 文件加入SNN的 IP對應信息
4.5.5 所有節點masters文件加入SNN信息
4.5.6 所有節點中修改hdfs-site.xml
4.5.7 重啟所有虛擬機
4.5.8 配置ssh免密碼登錄
4.5.9 重新格式化NameNode
4.5.10啟動Hadoop
4.5.11驗證
4.6 問題5--再次格式化namenode,此時datanode是否能加入
4.6.1 停止Hadoop並格式化
4.6.2 啟動Hadoop,並查看datanode狀態
4.6.3 查看datanode日志
4.6.4 解決辦法
4.6.5 重啟集群,查看datanode狀態
4.7 問題6--控制namenode檢查點發生的頻率
4.7.1 在core-site.xml中修改檢查點頻率
4.7.2 重啟集群,查看檢查點更新頻率
4.7.3 觀察checkpoint 前后 namenode的變化
4.7.4 基本原理
5 問題解決
5.1 安裝CentOS64位虛擬機 This host supports Intel VT-x, but Intel VT-x is disabled
5.2 *** is not in the sudoers file解決方法
5.3 yum無法下載
5.4 CentOS 64bit安裝Hadoop2.2.0中出現文件編譯位數異常
5.5 編譯Hadoop2.2.0出現代碼異常
1 作業題目
1. 部署Hadoop 2.x,建議嘗試64位系統下進行本地編譯的安裝方式
2. 在Hadoop 1.x上進行探索性的實驗研究,以下問題6選2
(1) 能否給web監控界面加上安全機制,怎樣實現?抓圖過程
(2)模擬namenode崩潰,例如將name目錄的內容全部刪除,然后通過secondary namenode恢復namenode,抓圖實驗過程
(3) 怎樣改變HDFS塊大小?實驗驗證並抓圖過程
(4) 把secondary namenode和namenode分離,部署到單獨的節點,抓圖實驗過程
(5) 在Hadoop集群實施成功后,再次格式化名稱節點,請問此時datanode還能加入集群不?如果不能加入怎樣解決?模擬過程並抓圖
(6) 怎樣控制namenode檢查點發生的頻率,用實驗模擬檢查點發生的前后過程,並抓圖發生前和發生后的元數據情況進行比較,說明之
2 編譯Hadoop2.X 64bit
2.1 運行環境說明
2.1.1硬軟件環境
l 主機操作系統:Windows 64 bit,雙核4線程,主頻2.2G,6G內存
l 虛擬軟件:VMware® Workstation 9.0.0 build-812388
l 虛擬機操作系統:CentOS 6.5 64位,單核,1G內存
l JDK:1.7.0_55 64位
l Hadoop:Release 2.3.0 source
2.1.2集群網絡環境
集群只包含一個節點,設置IP地址為192.168.1.200。
2.2 環境搭建
2.2.1JDK安裝和Java環境變量配置
1. 下載JDK1.7 64bit安裝包
打開JDK1.7 64bit安裝包下載鏈接為:
http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html
打開界面之后,先選中 Accept License Agreement ,然后下載 jdk-7u55-linux-x64.tar.gz,如下圖所示:
2. 賦予hadoop用戶/usr/lib/java目錄可讀寫權限,使用命令如下:
sudo chmod -R 777 /usr/lib/java
3. 把下載的安裝包,使用ssh工具上傳到/usr/lib/java 目錄下,使用如下命令進行解壓
tar -zxvf jdk-7u55-linux-x64.tar.gz
解壓后目錄如下圖所示:
4. 使用root用戶配置 /etc/profile,該設置對所有用戶均生效
vi /etc/profile
export JAVA_HOME=/usr/lib/java/jdk1.7.0_55
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
5. 重新登錄並驗證
logout
java -version
2.2.2安裝並設置maven
1. 下載maven安裝包,建議安裝3.0以上版本,本次安裝選擇的是maven3.0.5的二進制包,下載地址如下
http://mirror.bit.edu.cn/apache/maven/maven-3/
2. 使用ssh工具把maven包上傳到/home/hadoop/Downloads目錄
3. 解壓縮apache-maven-3.0.5-bin.tar.gz包
tar -zxvf apache-maven-3.0.5-bin.tar.gz
4. 把apache-maven-3.0.5目錄移到/usr/local目錄下
sudo mv apache-maven-3.0.5 /usr/local
5. 在/etc/profile配置文件中加入如下設置
export PATH=$JAVA_HOME/bin:/usr/local/apache-maven-3.0.5/bin:$PATH
6. 編輯/etc/profile文件並驗證配置是否成功:
source /etc/profile
mvn -version
2.2.3以root用戶使用yum安裝svn
yum install svn
2.2.4以root用戶使用yum安裝autoconf automake libtool cmake
yum install autoconf automake libtool cmake
2.2.5以root用戶使用yum安裝ncurses-devel
yum install ncurses-devel
2.2.6以root用戶使用yum安裝openssl-devel
yum install openssl-devel
2.2.7以root用戶使用yum安裝gcc*
yum install gcc*
2.2.8安裝並設置protobuf
注:該程序包需要在gcc安裝完畢后才能安裝,否則提示無法找到gcc編譯器。
1. 下載protobuf安裝包
下載鏈接為: https://code.google.com/p/protobuf/downloads/list
2. 使用ssh工具把protobuf-2.5.0.tar.gz包上傳到/home/hadoop/Downloads目錄
3. 解壓安裝包
tar -zxvf protobuf-2.5.0.tar.gz
4. 把protobuf-2.5.0目錄轉移到/usr/local目錄下
sudo mv protobuf-2.5.0 /usr/local
5. 進行目錄運行命令
進入目錄以root用戶運行如下命令:
./configure
make
make check
make install
6. 驗證是否安裝成功
運行成功之后,通過如下方式來驗證是否安裝成功
protoc
2.3 編譯Hadoop
2.3.1下載Hadoop源代碼 Release2.2.0
通過SVN獲取Hadoop2.2.0源代碼,在/home/hadoop/Downloads目錄下命令:
svn checkout http://svn.apache.org/repos/asf/hadoop/common/tags/release-2.2.0
獲取時間較長,大小約75.3M
2.3.2編譯Hadoop源代碼
:) 由於hadoop2.2.0在svn中pom.xml有點問題,會造成編譯中出錯,可先參考5.5修復該問題。在Hadoop源代碼的根目錄執行如下命令:
mvn package -Pdist,native -DskipTests –Dtar
(注意:這行命令需要手工輸入,如果復制執行會報異常!)
耗費的時間較長,總共花費了32分鍾,在編譯過程需要聯網,從網絡中下載所需要的資料。
2.3.3驗證編譯是否成功
到 hadoop-dist/target/hadoop-2.2.0/lib/native 目錄中查看libhadoop.so.1.0.0屬性:
file ./libhadoop.so.1.0.0
該文件為ELF 64-bit LSB則表示文件成功編譯為64位
在hadoop-dist/target目錄中已經打包好了hadoop-2.2.0.tar.gz,該文件作為Hadoop2.X 64位安裝包。
3 Hadoop2.X 64bit安裝
3.1 運行環境說明
3.1.1硬軟件環境
l 主機操作系統:Windows 64 bit,雙核4線程,主頻2.2G,6G內存
l 虛擬軟件:VMware® Workstation 9.0.0 build-812388
l 虛擬機操作系統:CentOS 64位,單核,1G內存
l JDK:1.7.0_55 64位
l Hadoop:2.2.0
3.1.2集群網絡環境
集群包含三個節點:1個namenode、2個datanode,其中節點之間可以相互ping通。節點IP地址和主機名分布如下:
| 序號 |
機器名 |
類型 |
用戶名 |
|
| 1 |
10.88.147.226 |
hadoop1 |
名稱節點 |
hadoop |
| 2 |
10.88.147.227 |
hadoop2 |
數據節點 |
hadoop |
| 3 |
10.88.147.228 |
hadoop3 |
數據節點 |
hadoop |
所有節點均是CentOS6.5 64bit系統,防火牆均禁用,所有節點上均創建了一個hadoop用戶,用戶主目錄是/usr/hadoop。所有節點上均創建了一個目錄/usr/local/hadoop,並且擁有者是hadoop用戶。因為該目錄用於安裝hadoop,用戶對其必須有rwx權限。(一般做法是root用戶在/usr/local下創建hadoop目錄,並修改該目錄擁有者為hadoop(chown –R hadoop /usr/local/hadoop),否則通過SSH往其他機器分發Hadoop文件會出現權限不足的提示。
3.1.3安裝使用工具
3.1.3.1Linux文件傳輸工具
向Linux系統傳輸文件推薦使用SSH Secure File Transfer,該工具頂部為工具的菜單和快捷方式,中間部分左面為本地文件目錄,右邊為遠程文件目錄,可以通過拖拽等方式實現文件的下載與上傳,底部為操作情況監控區,如下圖所示:
3.1.3.2Linux命令行執行工具
l SSH Secure Shell
SSH Secure工具的SSH Secure Shell提供了遠程命令執行,如下圖所示:
l SecureCRT
SecureCRT是常用遠程執行Linux命令行工具,如下圖所示:
3.2 環境搭建
本次安裝集群分為三個節點,節點設置按照2.1.2章節進行設置。環境搭建分為兩部分,具體為配置本地環境和設置操作系統環境。
3.2.1配置本地環境
該部分對服務器的配置需要在服務器本地進行配置,配置完畢后需要重啟服務器確認配置是否生效,特別是遠程訪問服務器需要設置固定IP地址。
3.2.1.1設置IP地址
1. 點擊System-->Preferences-->Network Connections,如下圖所示:
2. 修改或重建網絡連接,設置該連接為手工方式,設置如下網絡信息:
IP地址: 10.88.147.*
子網掩碼: 255.255.255.0
網關: 10.88.*.*
DNS: 10. **.***.** (上網需要設置DNS服務器)
注意:網關、DNS等根據所在網絡實際情況進行設置,並設置連接方式為"Available to all users",否則通過遠程連接時會在服務器重啟后無法連接服務器
3. 在命令行中,使用ifconfig命令查看設置IP地址信息,如果修改IP不生效,需要重啟機器再進行設置(如果該機器在設置后需要通過遠程訪問,建議重啟機器,確認機器IP是否生效):
3.2.1.2設置機器名
以root用戶登錄,使用 vi /etc/sysconfig/network 打開配置文件,根據實際情況設置該服務器的機器名,新機器名在重啟后生效
3.2.1.3設置Host映射文件
1. 使用root身份編輯/etc/hosts映射文件,設置IP地址與機器名的映射,設置信息如下:
vi /etc/hosts
l 10.88.147.226 hadoop1
l 10.88.147.227 hadoop2
l 10.88.147.228 hadoop3
2. 使用如下命令對網絡設置進行重啟
/etc/init.d/network restart
3. 驗證設置是否成功
3.2.1.4上網配置
第一步 以root用戶使用vi /etc/profile命令打開配置文件,如下圖所示:
第二步 在該文件設置如下配置:
export http_proxy=proxy.*****:8080
export no_proxy="localhost,10.88.*,hadoop*"
export https_proxy=proxy.*****:8080
3.2.2設置操作系統環境
3.2.2.1關閉防火牆
在Hadoop安裝過程中需要關閉防火牆和SElinux,否則會出現異常
1. service iptables status 查看防火牆狀態,如下所示表示iptables已經開啟
2. 以root用戶使用如下命令關閉iptables
chkconfig iptables off
3.2.2.2關閉SElinux
1. 使用getenforce命令查看是否關閉
2. 修改/etc/selinux/config 文件
將SELINUX=enforcing改為SELINUX=disabled,執行該命令后重啟機器生效
3.2.2.3JDK安裝及配置
7. 下載JDK1.7 64bit安裝包
打開JDK1.7 64bit安裝包下載鏈接為:
http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html
打開界面之后,先選中 Accept License Agreement ,然后下載 jdk-7u55-linux-x64.tar.gz,如下圖所示:
8. 賦予hadoop用戶/usr/lib/java目錄可讀寫權限,使用命令如下:
sudo chmod -R 777 /usr/lib/java
該步驟有可能遇到問題5.2,可參考解決辦法處理
9. 把下載的安裝包,使用2.1.3.1介紹的ssh工具上傳到/usr/lib/java 目錄下,使用如下命令進行解壓
tar -zxvf jdk-7u55-linux-x64.tar.gz
解壓后目錄如下圖所示:
10. 使用root用戶配置 /etc/profile,該設置對所有用戶均生效
vi /etc/profile
export JAVA_HOME=/usr/lib/java/jdk1.7.0_55
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
11. 重新登錄並驗證
logout
java -version
3.2.2.4更新OpenSSL
C自帶的OpenSSL存在bug,如果不更新OpenSSL在Ambari部署過程會出現無法通過SSH連接節點,使用如下命令進行更新:
yum update openssl
該步驟有可能遇到問題5.3,可參考解決辦法處理
3.2.2.5SSH無密碼驗證配置
1. 以root用戶使用vi /etc/ssh/sshd_config,打開sshd_config配置文件,開放三個配置,如下圖所示:
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
2. 配置后重啟服務
service sshd restart
3. 完成以上步驟后,復制該虛擬機兩份,分別為hadoop2和hadoop3數據節點,IP設置參見1.2章節
4. 使用hadoop用戶登錄在三個節點中使用如下命令生成私鑰和公鑰;
ssh-keygen -t rsa
5. 進入/home/hadoop/.ssh目錄在三個節點中分別把公鑰命名為authorized_keys_hadoop1、authorized_keys_hadoop2和authorized_keys_hadoop3,使用命令如下:
cp id_rsa.pub authorized_keys_hadoop1
6. 把兩個從節點(hadoop2、hadoop3)的公鑰使用scp命令傳送到hadoop1節點的/home/hadoop/.ssh文件夾中;
scp authorized_keys_hadoop2 hadoop@hadoop1:/home/hadoop/.ssh
7. 把三個節點的公鑰信息保存到authorized_key文件中
使用cat authorized_keys_hadoop1 >> authorized_keys 命令
8. 把該文件分發到其他兩個從節點上
使用scp authorized_keys hadoop@hadoop2:/home/hadoop/.ssh把密碼文件分發出去
9. 在三台機器中使用如下設置authorized_keys讀寫權限
chmod 400 authorized_keys
10. 測試ssh免密碼登錄是否生效
3.3 配置Hadooop設置
3.3.1下載並解壓hadoop安裝包
1. 在Apache網站上提供Hadoop2.X安裝包只支持32位操作系統安裝,在64位服務器安裝會出現5.4的錯誤異常。我們使用上一步驟編譯好的hadoop-1.1.2-bin.tar.gz文件作為安裝包(也可以從網上下載native文件夾或者打包好的64位hadoop安裝包),使用2.1.3.1介紹的ssh工具上傳到/home/hadoop/Downloads 目錄下
2. 在主節點上解壓縮
cd /home/hadoop/Downloads/
tar -xzvf hadoop-2.2.0.tar.gz
3. 把hadoop-2.2.0目錄移到/usr/local目錄下
sudo mv hadoop-2.2.0 /usr/local
cd /usr/local
ls
4. 使用chown命令遍歷修改hadoop-1.1.2目錄所有者為hadoop
sudo chown -R hadoop /usr/local/hadoop-2.2.0
3.3.2在Hadoop目錄下創建子目錄
使用hadoop用戶在hadoop-2.2.0目錄下創建tmp、name和data目錄,保證目錄所有者為hadoop
mkdir tmp
mkdir name
mkdir data
ls
3.3.3配置hadoop-env.sh
1. 打開配置文件hadoop-env.sh
cd etc/hadoop
sudo vi hadoop-env.sh
2. 加入配置內容,設置了hadoop中jdk和hadoop/bin路徑
export JAVA_HOME=/usr/lib/java/jdk1.7.0_55
export PATH=$PATH:/usr/local/hadoop-2.2.0/bin
3. 編譯配置文件hadoop-env.sh,並確認生效
source hadoop-env.sh
hadoop version
3.3.4配置yarn-env.sh
1. 在/usr/local/hadoop-2.2.0/etc/hadoop打開配置文件yarn-env.sh
cd /usr/local/hadoop-2.2.0/etc/hadoop
sudo vi yarn-env.sh
2. 加入配置內容,設置了hadoop中jdk和hadoop/bin路徑
export JAVA_HOME=/usr/lib/java/jdk1.7.0_55
3. 編譯配置文件yarn-env.sh,並確認生效
source yarn-env.sh
3.3.5配置core-site.xml
1. 使用如下命令打開core-site.xml配置文件
sudo vi core-site.xml
2. 在配置文件中,按照如下內容進行配置
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://hadoop1:9000</value>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop1:9000</value>
</property>
<property>
<name>io.file.buffer.size</name>
<value>131072</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/usr/local/hadoop-2.2.0/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
<property>
<name>hadoop.proxyuser.hduser.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.hduser.groups</name>
<value>*</value>
</property>
</configuration>
3.3.6配置hdfs-site.xml
1. 使用如下命令打開hdfs-site.xml配置文件
sudo vi hdfs-site.xml
2. 在配置文件中,按照如下內容進行配置
<configuration>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop1:9001</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/usr/local/hadoop-2.2.0/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/usr/local/hadoop-2.2.0/data</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
</configuration>
3.3.7配置mapred-site.xml
1. 默認情況下不存在mapred-site.xml文件,可以從模板拷貝一份
cp mapred-site.xml.template mapred-site.xml
2. 使用如下命令打開mapred-site.xml配置文件
sudo vi mapred-site.xml
3. 在配置文件中,按照如下內容進行配置
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop1:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop1:19888</value>
</property>
</configuration>
3.3.8配置yarn-site.xml
1. 使用如下命令打開yarn-site.xml配置文件
sudo vi yarn-site.xml
2. 在配置文件中,按照如下內容進行配置
<configuration>
<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>
<property>
<name>yarn.resourcemanager.address</name>
<value>hadoop1:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>hadoop1:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>hadoop1:8031</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>hadoop1:8033</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>hadoop1:8088</value>
</property>
</configuration>
3.3.9配置slaves文件
1. 設置從節點
sudo vi slaves
hadoop2
hadoop3
3.3.10 向各節點分發hadoop程序
1. 在hadoop2和hadoop3機器中創建/usr/local/hadoop-2.2.0目錄,然后修改該目錄所有權限
sudo mkdir /usr/local/hadoop-2.2.0
sudo chown –R hadoop /usr/local/hadoop-2.2.0
2. 在hadoop1機器上進入/usr/local/hadoop-2.2.0目錄,使用如下命令把hadoop文件夾復制到hadoop2和hadoop3機器
使用命令scp -r * hadoop@hadoop2:/usr/local/hadoop-2.2.0
3. 在從節點查看是否復制成功
3.3.11 格式化namenode
./bin/hdfs namenode -format
3.3.12 啟動hdfs
cd hadoop-2.2.0/sbin
./start-dfs.sh
如果服務器操作系統為32位時,出現問題5.4異常,可以參考解決
3.3.13 驗證當前進行
此時在hadoop1上面運行的進程有:namenode,secondarynamenode
hadoop2和hadoop3上面運行的進程有:datanode
3.3.14 啟動yarn
./start-yarn.sh
3.3.15 驗證當前進行
此時在hadoop1上運行的進程有:namenode,secondarynamenode,resourcemanager
hadoop2和hadoop3上面運行的進程有:datanode,nodemanager
4 實驗性問題解決
4.1 運行環境說明
以下實驗性問題解決是在第1~2周搭建的環境下進行解決,即在Hadoop1.1.2版本下模擬問題的發生和解決。
4.1.1硬軟件環境
l 主機操作系統:Windows 64 bit,雙核4線程,主頻2.2G,6G內存
l 虛擬軟件:VMware® Workstation 9.0.0 build-812388
l 虛擬機操作系統:三個節點均為CentOS6.5 64位,單核,1G內存
l JDK:1.7.0_55 64位
l Hadoop:1.1.2
4.1.2集群網絡環境
集群包含三個節點:1個namenode、2個datanode,其中節點之間可以相互ping通。節點IP地址和主機名分布如下:
| 序號 |
IP地址 |
機器名 |
類型 |
用戶名 |
運行進程 |
| 1 |
10.88.147.221 |
hadoop1 |
名稱節點 |
hadoop |
NN、SNN、JobTracer |
| 2 |
10.88.147.222 |
hadoop2 |
數據節點 |
hadoop |
DN、TaskTracer |
| 3 |
10.88.147.223 |
hadoop3 |
數據節點 |
hadoop |
DN、TaskTracer |
所有節點均是CentOS系統,防火牆均禁用,所有節點上均創建了一個hadoop用戶,用戶主目錄是/usr/hadoop。所有節點上均創建了一個目錄/usr/local/hadoop,並且擁有者是hadoop用戶。
4.2 問題1--給web監控界面加上安全機制
4.2.1修改Core-Site.xml文件
以下為配置添加部分:
<property>
<name>hadoop.http.filter.initializers</name>
<value>org.apache.hadoop.security.AuthenticationFilterInitializer</value>
<description>HTTP Authentication document in hadoop tar file</description>
</property>
<property>
<name>hadoop.http.authentication.type</name>
<value>simple</value>
<description>authentication type for web UI</description>
</property>
<property>
<name>hadoop.http.authentication.token.validity</name>
<value>36000</value>
<description>how long authentication token is valid before it needs to be renewed</description>
</property>
<property>
<name>hadoop.http.authentication.signature.secret.file</name>
<value>/usr/local/hadoop-1.1.2/signature-secret</value>
<description>signature secret for signing authentication tokens</description>
</property>
<property>
<name>hadoop.http.authentication.cookie.domain</name>
<value></value>
<description>domain to use for the http cookie that stores authentication token</description>
</property>
<property>
<name>hadoop.http.authentication.simple.anonymous.allowed</name>
<value>false</value>
<description>anonymous web UI requests enabled or disabled</description>
</property>
4.2.2手動創建signature-secret文件
在/usr/local/hadoop-1.1.2目錄下創建signature-secret文件,使用如下命令:
echo hadoop >signature-secret
4.2.3把該文件分發到兩個datanode中
在namenode創建需要把這個文件分發到各個datanode,使用如下命令:
scp signature-secret hadoop@hadoop2:/usr/local/hadoop-1.1.2
4.2.4重新啟動hadoop
4.2.5驗證訪問
使用http://10.88.147.221:50030/jobtracker.jsp訪問jobtracker頁面出現如下錯誤:
在http訪問地址加入?user.name=hadoop就能夠訪問了,不過存在問題是user.name是可以隨意輸入,在http中明碼傳遞,還是不安全!
4.3 問題2--模擬namenode崩潰並恢復
4.3.1刪除NameNode中Name目錄下所有文件,模擬崩潰
在NameNode節點中name目錄為 /usr/local/hadoop-1.1.2/hdfs/name,使用如下命令刪除該文件夾下所有文件:
cd /usr/local/hadoop-1.1.2/hdfs/name
rm -R *
4.3.2重啟Hadoop
使用./stop-all.sh停止Hadoop,然后使用./start-all.sh啟動Hadoop,通過jps命令可以看到namenode進程無法啟動
cd /usr/local/hadoop-1.1.2/bin
./stop-all.sh
./start-all.sh
通過hadoop命令查看hdfs文件時無法連接,如下圖所示:
hadoop fs -ls
查看logs文件夾下NameNode對應日志文件hadoop-hadoop-jobtracker-hadoop1.log,出現如下錯誤:
INFO org.apache.hadoop.mapred.JobTracker: Problem connecting to HDFS Namenode... re-trying
java.net.ConnectException: Call to hadoop1/10.88.147.221:9000 failed on connection exception: java.net.ConnectException: Connection refused
4.3.3格式化NameNode
停止Hadoop后,通過如下命令格式化Hadoop:
./stop-all.sh
./hadoop namenode -format
4.3.4獲取DataNode的namespaceID
通過ssh連接到hadoop2節點,進入DataNode存放數據的文件夾 /usr/local/hadoop-1.1.2/hdfs/data/current,通過如下命令查看VERSION文件內容:
ssh hadoop2
cd /usr/local/hadoop-1.1.2/hdfs/data/current
ls
cat VERSION
獲取namespaceID值
4.3.5修改NameNode的namespaceID
修改hadoop1機器NameNode目錄/usr/local/hadoop-1.1.2/hdfs/name/current中VERSION文件中namespaceID值為上一步驟DataNode所對應的值,結果如下圖所示:
cd /usr/local/hadoop-1.1.2/hdfs/name/current
vi VERSION
4.3.6刪除NameNode的fsimage
通過如下命令刪除NameNode中fsimage:
cd /usr/local/hadoop-1.1.2/hdfs/name/current
rm fsimage
4.3.7從SSN中拷貝fsimage到NN中
在NameNode中SSN路徑為/usr/local/hadoop-1.1.2/tmp/dfs/namesecondary,把current文件夾下得fsimage拷貝到NN所在路徑中,命令如下:
cd /usr/local/hadoop-1.1.2/tmp/dfs/namesecondary
cp fsimage /usr/local/hadoop-1.1.2/hdfs/name/current/
4.3.8重啟Hadoop
啟動Hadoop,使用jps命令查看,namenode進程正常啟動
cd /usr/local/hadoop-1.1.2/bin
./start-all.sh
4.4 問題3--改變HDFS塊大小
4.4.1在Hadoop中建立/input文件夾
使用如下命令在Hadoop中創建/input文件夾,把start開始的sh腳本文件放到該文件中:
cd /usr/local/hadoop-1.1.2/bin
./hadoop fs -mkdir /input
./hadoop fs -put *.sh /input
./hadoop fs -ls /input
4.4.2查看當前blocksize
查看hadoop2節點數據塊大小情況,如下圖所示:
4.4.3修改hdfs-site.xml配置文件
在NameNode節點hadoop1中修改hdfs-site.xml配置文件,加入如下配置:
<property>
<name>dfs.block.size</name>
<value>134217728</value>
</property>
4.4.4重啟Hadoop
重新啟動Hadoop程序
./stop-all.sh
./start-all.sh
4.4.5再次查看當前blocksize
使用如下命令在Hadoop中創建/input1文件夾並復制文件到該文件夾覆蓋之前操作的文件:
./hadoop fs -mkdir /input1
./hadoop fs -put *.sh /input1
再次在查看block size,如下圖所示
4.5 問題4--SNN與NN的分離
4.5.1復制虛擬機
復制NameNode節點所在虛擬機作為SecondaryNameNode運行虛擬機
4.5.2設置SNN虛擬機IP地址
設置該虛擬機IP地址為:10.88.147.224
4.5.3設置SNN虛擬機名稱
設置SNN虛擬機名稱為:hadoop4
sudo vi /etc/sysconfig/network
4.5.4所有節點hosts 文件加入SNN的 IP對應信息
在所有節點/etc/hosts文件中加入SNN的IP地址10.88.147.224對應hadoop4
sudo vi /etc/hosts
4.5.5所有節點masters文件加入SNN信息
在所有節點masters文件中加入SNN機器名信息,使用如下命令:
sudo vi /usr/local/hadoop-1.1.2/conf/masters
在master文件中加入SNN機器名
4.5.6所有節點中修改hdfs-site.xml
使用如下命令編輯hdfs-site.xml配置文件:
sudo vi /usr/local/hadoop-1.1.2/conf/hdfs-site.xml
在hdfs-site.xml文件中加入如下信息:
<property>
<name>dfs.secondary.http.address</name>
<value>hadoop4:50090</value>
</property>
4.5.7重啟所有虛擬機
4.5.8配置ssh免密碼登錄
1. 在hadoop4(10.88.147.244)節點中使用ssh-keygen -t rsa生成私鑰和公鑰;
2. 把hadoop4(10.88.147.244)節點中公鑰信息加入到authorized_keys文件中;
ll
chmod 400 -R /home/hadoop/.ssh
cat id_rsa.pub >> authorized_keys
cat authorized_keys
3. 把authorized_keys分發到各個節點上;
scp authorized_keys hadoop@hadoop1:/home/hadoop/.ssh
4. 驗證是否能夠免登錄到各個節點;
4.5.9重新格式化NameNode
在/usr/local/hadoop-1.1.2/bin目錄下使用如下命令進行格式化:
./hadoop namenode -format
4.5.10 啟動Hadoop
使用如下命令啟動Hadoop:
cd /usr/local/hadoop-1.1.2/bin
./start-all.sh
4.5.11 驗證
1. 在hadoop1(NN)查看進程情況,啟動了NameNode、JobTracker兩個進程:
2. 在hadoop2、hadoop3查看進程情況,啟動了TraskTracker進程:
(注意這個節點上DataNode並沒有啟動,這個問題是由於NameNode和DataNode之間的namespaceID不一致造成的,該問題的解決方法如4.6所描述)
3. 在hadoop4(SNN)查看進程情況,啟動了SecondaryNameNode進程:
4.6 問題5--再次格式化namenode,此時datanode是否能加入
4.6.1停止Hadoop並格式化
使用如下命令停止Hadoop並格式化:
./stop-all.sh
./hadoop namenode -format
4.6.2啟動Hadoop,並查看datanode狀態
使用./start-all.sh啟動Hadoop:
在datanode中使用jps查看啟動狀態:
4.6.3查看datanode日志
查看datanode節點hadoop2日志文件夾下日志內容:
cd /usr/local/hadoop-1.1.2/logs
cat hadoop-hadoop-datanode-hadoop2.log
報錯信息為namenode與datanode之間的namespaceID不一致:
2014-09-30 10:04:41,890 ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: java.io.IOException: Incompatible namespaceIDs in /usr/local/hadoop-1.1.2/hdfs/data: namenode namespaceID = 87263132; datanode namespaceID = 1318122769
at org.apache.hadoop.hdfs.server.datanode.DataStorage.doTransition(DataStorage.java:232)
at org.apache.hadoop.hdfs.server.datanode.DataStorage.recoverTransitionRead(DataStorage.java:147)
at org.apache.hadoop.hdfs.server.datanode.DataNode.startDataNode(DataNode.java:399)
at org.apache.hadoop.hdfs.server.datanode.DataNode.<init>(DataNode.java:309)
at org.apache.hadoop.hdfs.server.datanode.DataNode.makeInstance(DataNode.java:1651)
at org.apache.hadoop.hdfs.server.datanode.DataNode.instantiateDataNode(DataNode.java:1590)
at org.apache.hadoop.hdfs.server.datanode.DataNode.createDataNode(DataNode.java:1608)
at org.apache.hadoop.hdfs.server.datanode.DataNode.secureMain(DataNode.java:1734)
at org.apache.hadoop.hdfs.server.datanode.DataNode.main(DataNode.java:1751)
4.6.4解決辦法
有兩個解決辦法:
Ø 修改所有datanode中/usr/local/hadoop-1.1.2/tmp/dfs/data/current/VERSION 文件的namespaceID 為 namenode的namespaceID(采用該方法)
Ø 刪除datanode 中 /usr/local/hadoop-1.1.2/tmp/dfs/data 目錄
登錄到hadoop1節點上,獲取該節點NameNode的namespaceID:
cd /usr/local/hadoop-1.1.2/hdfs/name/current
cat VERSION
登錄到hadoop2和hadoop3節點上,修改DataNode的namespaceID為NameNode的namespaceID的值:
cd /usr/local/hadoop-1.1.2/hdfs/data/current
vi VERSION
4.6.5重啟集群,查看datanode狀態
在namenode節點hadoop1使用./start-all.sh啟動Hadoop:
./start-all.sh
在datanode節點hadoop2中使用jps查看啟動狀態:
datanode進程已經啟動
4.7 問題6--控制namenode檢查點發生的頻率
4.7.1在core-site.xml中修改檢查點頻率
系統默認為1個小時即3600秒,在namenode節點中修改core-site.xml文件,加入如下配置內容:
<property>
<name>fs.checkpoint.period</name>
<value>180</value>
</property>
4.7.2重啟集群,查看檢查點更新頻率
在namenode節點的目錄 /usr/local/hadoop-1.1.2/hdfs/name/current中 fsimage、edits等的更新頻率。每隔4分鍾查看,發現namenode 每隔 180 秒 checkpoint 進行更新一次:
4.7.3觀察checkpoint 前后 namenode的變化
1. 檢查點發生前:
l namenode的fsimage和edits 最后修改時間為16:39。
l 16:40 向hdfs系統加入 input 文件,namenode 中的edits 記錄這次操作,其修改時間為16:40
2. 檢查點發生后
l namenode 中的fsimage、fsimage、fstime、VERSION等文件在16:42進行了檢查點更新
4.7.4基本原理
當距離上個checkpoint 時間 為${fs.checkpoint.period} 時:
1. SSN請求NN滾動edits文件,使新的edits log 放到另一個新生成的edits文件。
2. SSN通過 HTTP GET 獲取NN的fsimage和edits文件
3. SSN將fsimage文件載入內存,並應用edits 文件中的每一項操作,這樣就創建了一個新的合成的fsimage 文件。
4. SSN采用 HTTP POST 方式 將剛合成的fsimage 發送回NN
5. NN用剛從SSN收到的fsimage代替老一版本的fsimage, 並用第一步中產生的edits 代替原先的edits,同時將fctime文件更新到checkpoint發生的時間
最終,名稱節點就有了一份最新的fsimage文件和一個更短的edits文件(該edits文件不一定空,當SSN在執行checkpoint操作時,edits 可能已經記錄下了一些hdfs系統的操作)
5 問題解決
5.1 安裝CentOS64位虛擬機 This host supports Intel VT-x, but Intel VT-x is disabled
在進行Hadoop2.X 64bit編譯安裝中由於使用到64位虛擬機,安裝過程中出現下圖錯誤:
按F1 鍵進入BIOS 設置實用程序 使用箭頭鍵security面板下找virtualization按Enter 鍵 進去Intel VirtualizationTechnology改成Enabled按F10 鍵保存並退出 選擇Yes按Enter 鍵 完全關機(關閉電源)等待幾秒鍾重新啟動計算機此Intel虛擬化技術開啟成功
5.2 *** is not in the sudoers file解決方法
當使用hadoop用戶需要對文件夾進行賦權,使用chmod命令出現“hadoop is not in the sudoers file. This incident will be reported”錯誤,如下所示:
1. 使用su命令進入root用戶
2. 添加文件的寫權限,操作命令為:chmod u+w /etc/sudoers
3. 編輯/etc/sudoers文件,使用命令"vi /etc/sudoers"進入編輯模式,找到:"root ALL=(ALL) ALL"在起下面添加"hadoop ALL=(ALL) ALL",然后保存退出。
5.3 yum無法下載
1. 在/etc/yum.conf中加入proxy=htt://XX.XXX.XX:PORT
2. 重啟網絡
3. 再次運行yum install ambari-server則能夠正常下載
5.4 CentOS 64bit安裝Hadoop2.2.0中出現文件編譯位數異常
在安裝hadoop2.2.0過程中出現如下異常:Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
通過分析是由於lib/native目錄中有些文件是在32位編譯,無法適應CentOS 64位環境造成
有兩種辦法解決:
l 重新編譯hadoop,然后重新部署
l 暫時辦法是修改配置,忽略有問題的文件
5.5 編譯Hadoop2.2.0出現代碼異常
目前的2.2.0 的Source Code 壓縮包解壓出來的code有個bug 需要patch后才能編譯。否則編譯hadoop-auth 會提示下面錯誤:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.5.1:testCompile (default-testCompile) on project hadoop-auth: Compilation failure: Compilation failure:
[ERROR] /home/hadoop/Downloads/release-2.2.0/hadoop-common-project/hadoop-auth/src/test/java/org/apache/hadoop/security/authentication/client/AuthenticatorTestCase.java:[88,11] error: cannot access AbstractLifeCycle
[ERROR] class file for org.mortbay.component.AbstractLifeCycle not found
[ERROR] /home/hadoop/Downloads/release-2.2.0/hadoop-common-project/hadoop-auth/src/test/java/org/apache/hadoop/security/authentication/client/AuthenticatorTestCase.java:[96,29] error: cannot access LifeCycle
[ERROR] class file for org.mortbay.component.LifeCycle not found
直接修改hadoop-common-project/hadoop-auth/pom.xml,其實就是少了一個包,添加一個dependency:
<dependency>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-util</artifactId>
<scope>test</scope>
</dependency>















































![clip_image010[1] clip_image010[1]](/image/aHR0cHM6Ly9pbWFnZXMwLmNuYmxvZ3MuY29tL2Jsb2cvMTA3Mjg5LzIwMTQxMi8xNTA4NTY1OTMxMjU3NzIuanBn.png)




![clip_image002[1] clip_image002[1]](/image/aHR0cHM6Ly9pbWFnZXMwLmNuYmxvZ3MuY29tL2Jsb2cvMTA3Mjg5LzIwMTQxMi8xNTA4NTcwMzA2MjQ5MTcuanBn.png)
![clip_image004[1] clip_image004[1]](/image/aHR0cHM6Ly9pbWFnZXMwLmNuYmxvZ3MuY29tL2Jsb2cvMTA3Mjg5LzIwMTQxMi8xNTA4NTcwMzc2NTI1MzMuanBn.png)
![clip_image006[1] clip_image006[1]](/image/aHR0cHM6Ly9pbWFnZXMwLmNuYmxvZ3MuY29tL2Jsb2cvMTA3Mjg5LzIwMTQxMi8xNTA4NTcwNDMxMjQ2MzMuanBn.png)
![clip_image008[1] clip_image008[1]](/image/aHR0cHM6Ly9pbWFnZXMwLmNuYmxvZ3MuY29tL2Jsb2cvMTA3Mjg5LzIwMTQxMi8xNTA4NTcwNDgxMjI3MTkuanBn.png)
![clip_image010[2] clip_image010[2]](/image/aHR0cHM6Ly9pbWFnZXMwLmNuYmxvZ3MuY29tL2Jsb2cvMTA3Mjg5LzIwMTQxMi8xNTA4NTcwNTQ2OTUzMjAuanBn.png)
![clip_image012[1] clip_image012[1]](/image/aHR0cHM6Ly9pbWFnZXMwLmNuYmxvZ3MuY29tL2Jsb2cvMTA3Mjg5LzIwMTQxMi8xNTA4NTcwNjE0MDQ2OTEuanBn.png)
![clip_image014[1] clip_image014[1]](/image/aHR0cHM6Ly9pbWFnZXMwLmNuYmxvZ3MuY29tL2Jsb2cvMTA3Mjg5LzIwMTQxMi8xNTA4NTcwNjkyMjQ1NjQuanBn.png)



































































![clip_image206[1] clip_image206[1]](/image/aHR0cHM6Ly9pbWFnZXMwLmNuYmxvZ3MuY29tL2Jsb2cvMTA3Mjg5LzIwMTQxMi8xNTA4NTgwNTEyNTcwNzkuanBn.png)



















![clip_image268[1] clip_image268[1]](/image/aHR0cHM6Ly9pbWFnZXMwLmNuYmxvZ3MuY29tL2Jsb2cvMTA3Mjg5LzIwMTQxMi8xNTA4NTgyMTA2MjMzNDcuanBn.png)
![clip_image272[1] clip_image272[1]](/image/aHR0cHM6Ly9pbWFnZXMwLmNuYmxvZ3MuY29tL2Jsb2cvMTA3Mjg5LzIwMTQxMi8xNTA4NTgyMTgxMjQ5NzYuanBn.png)



















