天天看點

hadoop運作環境搭建

森哥/洋哥hadoop系列,非常适合初學者:

Hive 中繼資料表結構詳解

HDFS學習:HDFS機架感覺與副本放置政策

Yarn【label-based scheduling】實戰總結(一)

Yarn【label-based scheduling】實戰總結(二)

1 Hadoop運作環境搭建

1.1 單機僞分布式環境

1.1.1 系統資訊

Linux版本:

hadoop運作環境搭建

1.1.2 準備工作

1.1.2.1 安裝jdk7.0

hadoop運作環境搭建

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檔案,如下所示:

hadoop運作環境搭建
修改/etc/hosts,如下所示
hadoop運作環境搭建
1.1.2.4 ssh無密碼驗證配置

  • 在本地主機生成密鑰對

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 關閉系統防火牆

通過以下方式檢視防火牆是否關閉,如果出現以下結果,則說明防火牆沒關閉:

hadoop運作環境搭建

如果結果如下:

hadoop運作環境搭建

則說明防火牆已經關閉了。

注:還有一種檢視防火牆是否關閉的方式,即使用指令:chkconfig--list | grep iptables

如下所示則說明防火牆已經關閉:

hadoop運作環境搭建

以下場景則說明防火牆沒有關閉:

hadoop運作環境搭建

以下提供三種方式關閉防火牆:

(1) chkconfig --level 2345 iptablesoff 或 chkconfig iptables off

(2) service iptables stop

(3) 關閉方式如下圖:

hadoop運作環境搭建

這三種方式,隻有第一種是永久關閉,(2)與(3)隻要機器重新開機,則又需要重新去關閉。

關閉防火牆之後的場景如下圖:

hadoop運作環境搭建

搭建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

hadoop運作環境搭建

hdfs web界面

通過master_IP:50070通路hdfs的web界面,如下所示:

hadoop運作環境搭建

通過該web界面能擷取到很多的hdfs叢集資訊,平時多用用,大有幫助。

1.1.6 常見問題

hadoop運作環境搭建

原因是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

hadoop運作環境搭建

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,如下所示:

hadoop運作環境搭建

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配置檔案,如果主節點也作為從節點使用,則可以配置為:

hadoop運作環境搭建

如果主節點不作為從節點使用,則可以配置為:

hadoop運作環境搭建

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,如下所示:

hadoop運作環境搭建

這往往是因為端口被占用導緻的,可以采用Linux指令:lsof -i:50010 檢視端口的占用情況,如下所示:

hadoop運作環境搭建

下:

hadoop運作環境搭建

報以上重連日志一段時間後,最後報以下異常:

hadoop運作環境搭建

解決辦法:在yarn的配置檔案yarn-site.xml中增加以下配置項:

hadoop運作環境搭建

hadoop日志檔案hadoop-root-datanode-slave2.log中還報以下異常:

hadoop運作環境搭建

報錯原因是因為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日志檔案hadoop-root-nodemanager-slave3.log報如下錯誤資訊:

hadoop運作環境搭建

一種解決方案:修改yarn-site.xml配置檔案,增加以下配置項:

該配置項的意思是:是否啟動一個線程檢查每個任務正使用的虛拟記憶體量,如果任務超出配置設定值,則直接将其殺掉,預設是true