森哥/洋哥hadoop系列,非常适合初學者:
Hive 中繼資料表結構詳解
HDFS學習:HDFS機架感覺與副本放置政策
Yarn【label-based scheduling】實戰總結(一)
Yarn【label-based scheduling】實戰總結(二)
1 Hadoop運作環境搭建
1.1 單機僞分布式環境
1.1.1 系統資訊
Linux版本:

1.1.2 準備工作
1.1.2.1 安裝jdk7.0
1.1.2.2 配置/etc/profile
增加以下配置項,然後執行source /etc/profile
#set java environment
export JAVA_HOME=/opt/java/
exportCLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
exportPATH=$JAVA_HOME/bin:$PATH
#for hadoop
exportHADOOP_HOME=/home/hadoop-2.7.1
exportPATH=$PATH:$HADOOP_HOME/bin
exportPATH=$PATH:$HADOOP_HOME/sbin
1.1.2.3 修改Linux機器名
執行hostname master指令,其中master是要修改的機器名
修改/etc/sysconfig/network檔案,如下所示:
- 在本地主機生成密鑰對
ssh-keygen -t rsa
執行以上指令并一直回車,生成一個密鑰對:id_rsa(私鑰檔案和id_rsa.pub(公鑰檔案。預設被儲存在~/.ssh/目錄下。
- 将公鑰追加到 authorized_keys 檔案中
cat ~/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys (自己與自己交換密鑰)
1.1.2.5 關閉系統防火牆
通過以下方式檢視防火牆是否關閉,如果出現以下結果,則說明防火牆沒關閉:
如果結果如下:
則說明防火牆已經關閉了。
注:還有一種檢視防火牆是否關閉的方式,即使用指令:chkconfig--list | grep iptables
如下所示則說明防火牆已經關閉:
以下場景則說明防火牆沒有關閉:
以下提供三種方式關閉防火牆:
(1) chkconfig --level 2345 iptablesoff 或 chkconfig iptables off
(2) service iptables stop
(3) 關閉方式如下圖:
這三種方式,隻有第一種是永久關閉,(2)與(3)隻要機器重新開機,則又需要重新去關閉。
關閉防火牆之後的場景如下圖:
搭建Hadoop時一定要記得關閉防火牆,不然會出現一些很詭異的問題。
1.1.2.6 分區【非必要操作,除非搭環境時用到分區】
parted -s /dev/sdb mkpartdata 0 898G(修改為實際的大小)
如此會報下面的警告:
Warning: The resultingpartition is not properly aligned for best performance.
但用下面的語句來分區時,并不會報上面的警告了
parted -s /dev/sdb mkpartdata 2048s 100%
知識點擴充-->>
如果要把/dev/sdb劃分為四個相等大小的分區,可如下操作:
parted /dev/sdc
mkpart primary 2048s 25%
mkpart primary 25% 50%
mkpart primary 50% 75%
mkpart primary 75% 100%
備注:執行parted /dev/sdb後 print(顯示分區資訊),rm(删除分區)
1.1.2.7 建立檔案系統【非必要操作】
mkfs.ext4 /dev/sdb1
1.1.2.8 建立并挂載目錄【非必要操作】
mkdir /data
mount /dev/sdb1 /data [臨時挂載]
echo "/dev/sdb1 /srv/smartcare ext4 defaults 1 2">> /etc/fstab [永久挂載]
1.1.2.9 下載下傳并解壓hadoop安裝包
tar -xvf hadoop-2.7.1.tar.gz
1.1.3 修改配置檔案
1.1.3.1 hadoop-env.sh
vim hadoop-env.sh增加以下配置項:
exportJAVA_HOME=/usr/java/jdk1.7.0_21
1.1.3.2 core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://169.10.35.123:9000</value>
</property>
<name>hadoop.tmp.dir</name>
<value>/hadoop-2.7.1/tmp</value>
</configuration>
1.1.3.3 hdfs-site.xml
<name>dfs.replication</name>
<value>1</value>
<name>dfs.namenode.name.dir</name>
<value>/hadoop-2.7.1/name</value>
<name>dfs.datanode.data.dir</name>
<value>/data/data1</value>
1.1.3.4 mapred-site.xml
<name>mapreduce.framework.name</name>
<value>yarn</value>
1.1.3.5 yarn-site.xml
<value>yarn</value>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
1.1.4 啟動Hadoop
格式化Hadoop
在指令行執行 hdfs namenode -format
啟動Hadoop
在指令行執行 tart-all.sh
1.1.5 檢視Hadoop安裝
Jps指令
[root@lsn hadoop-2.6.0]# jps
6215 Jps
6037 ResourceManager
5623 NameNode
5743 DataNode
5898 SecondaryNameNode
6132 NodeManager
hdfs dfsadmin –report
hdfs web界面
通過master_IP:50070通路hdfs的web界面,如下所示:
通過該web界面能擷取到很多的hdfs叢集資訊,平時多用用,大有幫助。
1.1.6 常見問題
原因是hadoop-2.6.0.tar.gz安裝包是在32位機器上編譯的,64位的機器加載本地庫.so檔案時出錯,不影響使用。
可用如下方式解決:
1、重新編譯源碼後将新的lib/native替換到叢集中原來的lib/native
2、修改hadoop-env.sh ,增加 export HADOOP_OPTS="-Djava.library.path=$HADOOP_PREFIX/lib:$HADOOP_PREFIX/lib/native"
1.2 分布式叢集環境
1.2.1 作業系統安裝
1.2.1.1 系統盤做raid1
重新開機系統,按提示按按Ctrl+H,進入WebBIOS,給系統盤做raid1 (
參數項 參數值
RAID Level 1
Strip Size 64KB
Access RW
Read Normal
Default Write Write Through
Current Write Write Through
Disable BGI No
Disk Cache Disable
I/O Direct
),之後重新開機;
1.2.1.2 安裝Linux作業系統
在系統盤上安裝作業系統【略】
1.2.1.3 啟用硬碟jbod模式
重新開機系統,當提示按ctrl+H或者ctrl+y進行選擇時,按crtl+y 進入輸入指令的界面,啟用硬碟位jbod模式-adpsetprop -enablejbod -1 -a0(附:禁用jbod模式指令 -adpsetprop -enablejbod -0 -a0),之後再重新開機。
1.2.1.4 硬碟分區、建立檔案系統
parted -s /dev/sdb mklabelgpt //gpt,對大于2T的硬碟分區
mkfs.ext4 /dev/sdb1 //格式化,建立檔案系統
mount /dev/sdb1 /data1 //挂載硬碟
echo "/dev/sdb1 /srv/smartcare ext4 defaults 1 2">> /etc/fstab //設定永久挂載
1.2.2 系統環境配置
1.2.2.1 配置/etc/hosts
修改/etc/hosts檔案,配置子節點ip
1.2.2.2 配置SSH
1) 在本地主機生成密鑰對
這個指令生成一個密鑰對:id_rsa(私鑰檔案和id_rsa.pub(公鑰檔案。預設被儲存在~/.ssh/目錄下。
2) 将公鑰添加到遠端主機的 authorized_keys 檔案中
将檔案上傳到遠端主機中
scp ~/.ssh/[email protected]:/root/
SSH到登陸到遠端主機,将公鑰追加到 authorized_keys 檔案中
cat /root/id_rsa.pub>> /root/.ssh/authorized_keys
注:cat ~/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys (自己與自己交換密鑰)
1.2.2.3 關閉系統防火牆
編寫并執行以下腳本,可批量關閉叢集防火牆:
#! /bin/bash
ALL_CLIENTS=
cat /etc/hosts| grep "193.168.1" | awk '{print $2}'
CLIENTS=""
for client in $ALL_CLIENTS
do
echo "==================close iptablesat $client=================="
ssh $client " chkconfig --level 2345iptables off "
ssh $client " service iptables stop"
done
1.2.2.4 關閉selinux
編寫并執行以下腳本,可批量關閉叢集selinux:
cat /etc/hosts| grep "193.168.1" | awk '{print $2}'
echo "=====set close selinux at$client,need restart server======"
ssh $client " sed -i"s/SELINUX=enforcing/SELINUX=disabled/" /etc/selinux/config "
echo "=====close selinux at $client,noneed restart server======"
ssh $client " setenforce 0 "
1.2.2.5 調整最大檔案句柄數
編寫并執行以下腳本,可批量調整叢集最大檔案句柄數群:
cat /etc/hosts| grep "169.10.35" | awk '{print $2}'
echo "======set/etc/security/limits.conf at $client ======="
ssh $client " echo '* soft nofile65536' >> /etc/security/limits.conf "
ssh $client " echo '* hardnofile 65536' >> /etc/security/limits.conf "
ssh $client " echo '* soft nproc131072' >> /etc/security/limits.conf "
ssh $client " echo '* hard nproc131072' >> /etc/security/limits.conf "
echo "=====set /etc/security/limits.d/90-nproc.confat $client ======"
ssh $client " echo '* soft nproc131072' >> /etc/security/limits.d/90-nproc.conf "
ssh $client " echo '* hard nproc131072' >> /etc/security/limits.d/90-nproc.conf "
1.2.2.6 打開磁盤預讀
編寫并執行以下腳本,可批量打開叢集磁盤預讀:
cat /etc/hosts| grep "169.10.35" | awk '{print $2}'
echo "=====set disk ahead read in/etc/rc.local file at $client ====="
ssh $client " echo '/sbin/blockdev--setra 16384 /dev/sd*' >> /etc/rc.local "
1.2.2.7 關閉大頁記憶體(THP)
RedHat6作業系統中需關閉大頁記憶體(THP):
echo never >/sys/kernel/mm/redhat_transparent_hugepage/enabled
1.2.2.8 配置nmon【非必要操作】
在指令行執行crontab –e,然後配置:
0 /1 nmon -f -m/opt/nmonResult/ -t -r test -s 3 -c 1200
1.2.3 叢集環境配置
1.2.3.1 安裝jdk
在叢集的各個節點上安裝jdk,如下所示:
1.2.3.2 修改Hadoop配置檔案
在Hadoop主節點上修改Hadoop叢集配置檔案hadoop-env.sh、core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml與slaves
在hadoop-env.sh配置檔案中,隻需修改jdk的路徑配置就行了,如下所示:
exportJAVA_HOME=/usr/java/jdk1.7.0_25
core-site.xml參考配置如下:
<value>hdfs://169.10.35.57:8020</value>
<value>/data/version3/tmp</value>
yarn-site.xml參考配置如下:
<name>yarn.resourcemanager.hostname</name>
<value>slave2</value>
<name>yarn.nodemanager.local-dirs</name>
<value>/data/version3/mapred</value>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
<name>mapreduce.jobhistory.webapp.address</name>
<value>169.10.35.57:19888</value>
<name>yarn.node-labels.fs-store.root-dir</name>
<value>hdfs://slave2:8020/yarn/node-labels</value>
<name>yarn.node-labels.enabled</name>
<value>true</value>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value>
<name>yarn.node-labels.manager-class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.nodelabels.RMNodeLabelsManager</value>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
mapred-site.xml參考配置如下:
<name>mapreduce.framework.name</name>
<value>yarn</value>
hdfs-site.xml參考配置如下:
<value>/data/version3/name</value>
<value>/data/version3/data</value>
<name>dfs.permissions.enabled</name>
<value>true</value>
<name>dfs.namenode.acls.enabled</name>
<name>dfs.namenode.dfs-zone-labels.enabled</name>
slaves參考配置如下(叢集節點名稱):
Slave1
Slave2
Slave3
這些配置檔案中需要修改<configuration>标簽内的一些屬性配置,特别提醒一下的是IP以及一些目錄需要按照實際安裝環境做相應修改。
最後将主節點上的Hadoop安裝包以及hadoop的各配置檔案拷貝到各slave節點,需要注意的是slave節點的jdk版本以及各種目錄配置最好與主節點保持一緻,要不然則需要在slave節點上修改以上各個配置檔案。
1.2.3.3 配置Hadoop叢集節點
修改slaves配置檔案,如果主節點也作為從節點使用,則可以配置為:
如果主節點不作為從節點使用,則可以配置為:
1.2.3.4 設定ntp服務
先在Hadoop的主節點設定正确的時間:
date -s month/day/year (修改年月日,例如date -s 11/15/2012)
date -s hh:mm:ss (修改時分秒,例如date -s 10:10:10)
hwclock –w (将設定的時間固化,不受系統重新開機的影響)
在Hadoop主節點建立ntp伺服器
根據需要考慮是否需修改/etc/ntp.conf檔案
chkconfig ntpd on
service ntpd start
在各子節點上設定定時ntp同步
執行crontab –e然後配置定時ntp,如下為一個例子:
0 /1 root ntpdate 169.10.35.32
1.2.3.5 啟動Hadoop叢集
在主節點上,格式化hdfs名位元組點:hdfs namenode –format
啟動hadoop叢集:start-all.sh
1.2.4 叢集環境清理
1、 關閉hadoop叢集
2、 清理/tmp目錄
3、 清理資料目錄中的檔案 /data*/
4、 清理記憶體:echo 3 >/proc/sys/vm/drop_caches
1.3 搭環境常見問題
1.3.1.1 主節點的datanode程序啟動不了
解決方案:
清除主節點的中繼資料目錄(name)内容、資料目錄(data)内容、/tmp目錄内容以及
日志目錄内容。
清除從節點的資料目錄(data)内容、日志目錄内容以及/tmp目錄内容。
重新格式化名位元組點:hdfs namenode –format
啟動hadoop叢集
1.3.1.2 java.net.BindException
啟動HDFS(start-dfs.sh)時,namenode與datanode的log日志報java.net.BindException,如下所示:
這往往是因為端口被占用導緻的,可以采用Linux指令:lsof -i:50010 檢視端口的占用情況,如下所示:
下:
報以上重連日志一段時間後,最後報以下異常:
解決辦法:在yarn的配置檔案yarn-site.xml中增加以下配置項:
hadoop日志檔案hadoop-root-datanode-slave2.log中還報以下異常:
報錯原因是因為hadoop叢集中有機器沒有關閉防火牆,把之關閉就可以了。
備注:在此提供一個測試hadoop叢集網絡是否異常的java socket程式,client與server端代碼如下所示:
Server.java
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(9527);
ss.setReceiveBufferSize(100);
Socket socket = ss.accept();
System.out.println(socket.getReceiveBufferSize());
DataInputStream din = new DataInputStream(socket.getInputStream());
int round = 0;
while (true) {
try {
Thread.sleep(1 * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Client.java
import java.io.BufferedInputStream;
import java.io.DataOutputStream;
import java.io.PrintStream;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
public class Client {
public static void main(String[] args) throws IOException {
Socket socket = new Socket();
socket.setSendBufferSize(4);
System.out.println(socket.getSendBufferSize());
SocketAddress remote = new InetSocketAddress("127.0.0.1", 9527);
socket.connect(remote);
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
for (int i = 0; i < 10240; i++) {
dos.writeInt(i);
dos.flush();
System.out.println("wrote: " + i);
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
dos.close();
socket.close();
将代碼分别放在兩台機器上運作則可以測試網絡是否故障,先運作server端,再運作client端,都是比較簡單的java代碼,在此就不做解釋了。
Javac Server.java javaServer
1.3.1.5 Yarn平台運作mapreduce程式導緻虛拟記憶體溢出
問題現象1:=>運作mapreduce程式時直接卡死
檢視hadoop日志檔案hadoop-root-nodemanager-slave3.log報如下錯誤資訊:
一種解決方案:修改yarn-site.xml配置檔案,增加以下配置項:
該配置項的意思是:是否啟動一個線程檢查每個任務正使用的虛拟記憶體量,如果任務超出配置設定值,則直接将其殺掉,預設是true