1. 程式人生 > >hadoopHDFS-2(hdfs NFS 網關)

hadoopHDFS-2(hdfs NFS 網關)

hadoopHDFS學習筆記

完全分布式
Hadoop最大的優勢就是分布式集群計算,所以在生產環境下都是搭建的最後一種模式:完全分布模式
技術準備
系統規劃
搭建
測試
上線使用

HDFS端口
8020 namenode RPC交互端口 core-site.xml
50070 NameNode web管理端口 hdfs- site.xml
50010 datanode 控制端口 hdfs -site.xml
50020 datanode的RPC服務器地址和端口 hdfs-site.xml
50075 datanode的HTTP服務器和端口 hdfs-site.xml
50090 secondary NameNode web管理端口 hdfs-site.xml

MR端口
8021 job-tracker交互端口 mapred-site.xml

50030 tracker的web管理端口 mapred-site.xml
50060 task-tracker的HTTP端口 mapred-site.xml

192.168.4.10
角色 master NameNode SecondaryNameNode ResourceManager
軟件 HDFS YARN
192.168.4.11
角色 node1 DataNode NodeManager
軟件 HDFS YARN
192.168.4.12
角色 node2 DataNode NodeManager
軟件 HDFS YARN
192.168.4.13
角色 node3 DataNode NodeManager
軟件 HDFS YARN

hadoop 完全分布式安裝

規劃集群 namenode ,secnedorynamenode, datanode

使用 4 臺機器組件集群,其中 1臺作為 master,其他3臺做為 node 節點
master 上的角色 namenode , secnedorynamenode
node    上的角色 datanode

master ip => 192.168.4.10
node   ip => 192.168.4.{11,12,13}

修改 /etc/hosts ,配置 ip 與名稱的對應關系
#vim /etc/hosts #同步到集群所有主機
192.168.4.10 master1
192.168.4.11 node1
192.168.4.12 node2
192.168.4.13 node3

#for i in master1 node{1..3}; do scp /etc/hosts ${i}:/etc/hosts; done
#or#
#for((i=1;i<4;i++));do rsync -a /etc/hosts 192.168.4.1${i}:/etc/ -e ‘ssh‘; ssh 192.168.4.${i} ‘reboot‘; done

禁用防火墻,禁用 selinux

在所有機器上 安裝 java 運行環境 openjdk 和 jps 工具
#yum install java-1.8.0-openjdk-devel -y

在master上設置 ssh-key 信任登錄,保證 master 能登錄所有主機,包括自己
#ssh-keygen -b 2048 -t rsa -N ‘‘ -f key
#for i in master1 node{1..3};do ssh-copy-id ${i};done


把軟件解壓拷貝到 /usr/local/hadoop #配置一臺其他同步即可
#scp -r hadoop-2.7.3 master1:/usr/local/hadoop
#bin/hadooop version


HDFS 完全分布式系統配置
配置 hadoop-env.sh
配置 core-site.xml
配置 hdfs-site.xml

1.編輯配置文件(master1)
hadoop-env.sh
配置 JAVA_HOME , HADOOP_CONF_DIR

#readlink -f /usr/bin/java
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.65-3.b17.el7.x86_64/jre/bin/java  
#vim etc/hadoop/hadoop-env.sh
export JAVA_HOME="/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.65-3.b17.el7.x86_64/jre"    #有轉移字符就需要加雙引,此處可不加
export HADOOP_CONF_DIR="/usr/local/hadoop/etc/hadoop"

xml 配置格式
<property>
<name>關鍵字</name>
<value>值</value>
<description>描述說明</description>
</property>


2.core-site.xml
#vim etc/hadoop/core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master1:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name> #數據根目錄
<value>/var/hadoop</value>
<description>A base for other temporary directories.</description>
</property>
</configuration>

3.hdfs-site.xml
#vim etc/hadoop/hdfs-site.xml
<configuration>
<property>
<name>dfs.namenode.http-address</name>
<value>master1:50070</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>master1:50090</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
</configuration>

4.配置 slaves ,寫入所有 datanode 節點
#vim etc/hadoop/slaves
node1
node2
node3

5.同步所有文件到所有節點
#for i in node{1..3} ;do rsync -avSH --delete /usr/local/hadoop node${i}:/usr/local/ -e ‘ssh‘;done

6.在所有節點上創建 hadoop.tmp.dir 指定的文件夾
#mkdir /var/hadoop
#for i in node{1..3};do ssh ${i} mkdir /var/hadoop;done

7.在 master 上執行格式化 namenode 的操作
#./bin/hdfs namenode -format

8.啟動集群
#./sbin/start-dfs.sh
#./sbin/stop-dfs.sh #停止

驗證集群:
在 master 上
jps 能看見 namenode ,secondarynamenode
#netstat -ltunp
能看見 9000,50070,50090 端口被監聽
#./bin/hdfs dfsadmin -report #查看加入集群的節點

在 node 上
jps 能看見 datanode
#netstat -ltunp
能看見 50075 被監聽

排錯:
所有的日誌在本機的 logs 裏面,查看對應的角色日誌

通過 web 訪問 hdfs角色
http://192.168.4.10:50070/
http://192.168.4.10:50090/
http://192.168.4.12:50075/

hdfs 基本使用
#./bin/hadoop fs
#./bin/hadoop fs -ls hdfs://master1:9000/ #可簡寫
#./bin/hadoop fs -ls /
#./bin/hadoop fs -mkdir /input
#./bin/hadoop fs -put *.txt /input


yarn 配置文件
mapred-site.xml
yarm-site.xml

1.配置 mapred-site.xml
#cp etc/hadoop/mapred-site.xml.template etc/hadoop/mapred-site.xml
#vim etc/hadoop/mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>

2.配置 yarn-site.xml
#vim etc/hadoop/yarn-site.xml
<configuration>

<!-- Site specific YARN configuration properties -->
   <property>
       <name>yarn.nodemanager.aux-services</name>
       <value>mapreduce_shuffle</value>
   </property>
   <property>
       <name>yarn.resourcemanager.hostname</name>
       <value>master1</value>
   </property>
</configuration>

3.配置以後將配置同步到集群所有機器

4.啟動服務
#./sbin/start-yarn.sh

驗證配置:

在 master 上 jsp 能看見 resourecemanager,netstat 可以看見 8088 端口打開
可以訪問 http://master1:8088/
在 node 上 jps 可以看見 nodemanager ,netstat 可以看見 8042 端口打開
可以訪問 http://node1:8042/
master: 50070 namen ode
master: 50090 secondary node
master: 8088 resourcemanager
node: 50075 data node
node: 8042 nodemanager

在集群上做數據分析
#./bin/hadoop fs –mkdir /input
#./bin/hadoop fs –put *.txt /input
#./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar wordcount /input /output

查看分析結果
#./bin/hadoop fs -cat hdfs://192.168.4.10:9000/output/*


hdfs 進階應用 NFS 網關

NFS 網關用途
1.用戶可以通過操作系統兼容的本地NFSv3客戶端來閱覽HDFS文件系統
2.用戶可以從HDFS文件系統下載文檔到本地文件系統
3.用戶可以通過掛載點直接流化數據。支持文件附加,但是不支持隨機寫
NFS 網關支持NFSv3和允許HDFS 作為客戶端文件系統的一部分被掛載
#./sbin/stop-all.sh
#jps

特性與註意事項
不支持隨機寫
在非安全模式,運行網關的用戶是代理用戶
在安全模式時,Kerberos keytab中的用戶是代理用戶
AIX NFS有一些知道的問題,不能讓默認的HDFS NFS網關正常工作,如果想在 AIX 訪問NFS 網關需要配置下面的參數
<property>
<name>nfs.aix.compatibility.mode.enabled</name>
<value>true</value>
</property>

HDFS超級用戶是與NameNode進程本身具有相同標識的用戶,超級用戶可以執行任何操作,因為權限檢查永遠不會為超級用戶失敗。

<property>
<name>nfs.superuser</name>
<value>the_name_of_hdfs_superuser</value>
</property>

新建一臺主機nfswg 192.168.4.15
安裝jdk1.8 復制一份 hadoop 到本機
#rsync -azSH --delete master:/usr/local/hadoop /usr/local/

#vim /etc/hosts #同步到集群所有主機
192.168.4.10 master1
192.168.4.11 node1
192.168.4.12 node2
192.168.4.13 node3
192.168.4.15 nfswg

NFS & portmap 相關配置
core-site.xml
hdfs-site.xml

1.core-site.xml(10-13 15)
hadoop.proxyuser.{nfsuser}.groups
hadoop.proxyuser.{nfsuser}.hosts
這裏的 nfsuser 是你機器上真實運行 nfsgw 的用戶
在非安全模式,運行nfs網關的用戶為代理用戶
#vim etc/hadoop/core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master1:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/var/hadoop</value>
<description>A base for other temporary directories.</description>
</property>
<property> #掛載點用戶所使用的組
<name>hadoop.proxyuser.nfsuser.groups</name>
<value></value>
</property>
<property> #掛載點主機地址
<name>hadoop.proxyuser.nfsuser.hosts</name>
<value>
</value>
</property>
</configuration>
#該配置要同步到其他所有主機上

2.hdfs-site.xml (註意 只在nfsgw 15!)
nfs.exports.allowed.hosts (* rw) #允許那些主機 訪問權限默認ro
dfs.namenode.accesstime.precision (3600000) #減少atime更新減少I/O壓力
nfs.dump.dir (/tmp/.hdfs-nfs) #轉儲目錄推薦有1G空間
nfs.rtmax (4194304) 一次讀占用4M內存
nfs.wtmax (1048576) 以此寫占用1M內存
用戶可以像訪問本地文件系統的一部分一樣訪問HDFS,但硬鏈接和隨機寫還不支持。對於大文件I/O的優化,可以在mount的時候增加NFS傳輸的大小(rsize和wsize)。在默認情況下,NFS網關支持1MB作為最大的傳輸大小。更大的數據傳輸大小,需要在hdfs-site.xml中設置“nfs.rtmax” 和“nfs.wtmax”
nfs.port.monitoring.disabled (false) #允許從沒有權限的客戶端掛載 nfs

#vim etc/hadoop/hdfs-site.xml   #只配置nfswg
<configuration>
    <property>
    <name>dfs.namenode.http-address</name>
    <value>master1:50070</value>
    </property>
    <property>
    <name>dfs.namenode.secondary.http-address</name>
    <value>master1:50090</value>
    </property>
    <property>
    <name>dfs.replication</name>
    <value>2</value>
    </property>
    <property>  #允許掛載的客戶端
    <name>nfs.exports.allowed.hosts</name>
    <value>* rw</value> #Java正則或者IP,多個用;來分割
    </property>
    <property>
    <name>dfs.namenode.accesstime.precision</name>
    <value>3600000</value>  #默認值1小時
    </property>
    <property>
    <name>nfs.dump.dir</name>   #轉儲目錄
    <value>/tmp/.hdfs-nfs</value>
    </property>
    <property>
    <name>nfs.rtmax</name>
    <value>4194304</value>  #4M
    </property>
    <property>
    <name>nfs.wtmax</name>
    <value>1048576</value>
    </property>
    <property>
    <name>nfs.port.monitoring.disabled</name>
    <value>false</value>
    </property>
</configuration>
該配置文件不需要同步到其他主機

這裏要註意 關閉系統的 portmap 和 nfs 服務添加用戶
#yum erase nfs-utils rpcbind #移除掉防止系統調用錯誤
確保2049 111端口不被占用就可以

在nfsgw和master1上創建用戶 確保兩處用戶uid gid和用戶組 要一致
#useradd nfsuser

nfsgw:設置權限
給nfs代理用戶寫日誌的權限
#setfacl -m u:nfsuser:rwx /usr/local/hadoop/logs
#mkdir /tmp/.hdfs-nfs #創建轉儲目錄
#chown nfsuser:nfsuser /tmp/.hdfs-nfs

重啟 hdfs 集群服務 在namenode上
#./sbin/stop-dfs.sh
#./sbin/start-dfs.sh
#./bin/hdfs dfsadmin -report
#jps 查看啟動

在nfswg上啟動 portmap 服務 #啟動 portmap 需要使用 root 用戶
#./sbin/hadoop-daemon.sh --script ./bin/hdfs start portmap
#jps 查看有portmap角色
#netstat 有111端口

啟動 nfs3 服務 #啟動 nfs3 需要使用 core-site 裏面設置的用戶
sudo -u 你core-site裏面配置的用戶
#su -l nfsuser
#./sbin/hadoop-daemon.sh --script ./bin/hdfs start nfs3

在一臺新機器上掛載測試15
#mount -t nfs -o vers=3,proto=tcp,nolock,sync,noatime,noacl 192.168.4.15:/ /mnt #
#cd /mnt
#ls
掛載 nfs
目前NFS v3僅使用TCP作為傳輸協議。 不支持NLM,因此需要安裝選項“nolock”。 強烈建議使用安裝選項“sync”,因為它可以最小化或避免重新排序寫入,這將導致更可預測的吞吐量。 未指定同步選項可能會導致上傳大文件時出現不可靠的行為
如果必須使用軟安裝,用戶應該給它一個相對較長的超時(至少不小於主機上的默認超時)


調試與日誌排錯
在配置 NFS 網關過程中經常會碰到各種各樣的錯誤,
如果出現了錯誤,打開調試日誌是一個不錯的選擇
#vim etc/hadoop/log4j.property #加入下面項
log4j.logger.org.apache.hadoop.hdfs.nfs=DEBUG
log4j.logger.org.apache.hadoop.oncrpc=DEBUG

nfs.map
系統管理員必須確保在NFS客戶端的用戶和在HDFS網關主機上的用戶有相同的名稱和UID。
不同主機上創建的用戶需要修改UID(例如使用“usermod -u 123myusername”),在NFS客戶端或者NFS網關主機
來進行。如果客戶端的用戶和NFS網關的用戶 uid 不能保持一致需要我們配置 nfs.map 的靜態映射關系
#vim etc/hadoop/nfs.map
uid 10 100 # Map the remote UID 10 the local UID 100
gid 11 101 # Map the remote GID 11 to the local GID 101


HDFS 增加節點

  1. 配置hadoop環境,包括主機名、ssh免密碼登錄、禁用 selinux、iptables、安裝 java 環境
    #vim /etc/hosts #同步到集群所有機器
    192.168.4.10 master1
    192.168.4.11 node1
    192.168.4.12 node2
    192.168.4.13 node3
    192.168.4.14 newnode
    192.168.4.15 nfswg
    #yum install java-1.8.0-openjdk-devel -y

  2. 修改namenode的slaves文件增加該(newnode 14 )節點
    #vim etc/hadoop/slave
    node1
    node2
    node3
    newnode

    同步所有
    #!/bin/bash
    for i in node{1..3}
    do
    rsync -avSH --delete /usr/local/hadoop/etc/hadoop/ ${i}:/usr/local/hadoop/etc/hadoop/ -e ‘ssh‘
    wait
    done

  3. 把namnode的hadoop復制到newnode目錄下
    #rsync -avSH --delete /usr/local/hadoop newnode:/usr/local/ -e ‘ssh‘

  4. 在newnode啟動Datanode
    #./sbin/hadoop-daemon.sh start datanode
    #jps #查看有Datanode

  5. 在master上增加同步數據帶寬,默認後臺轉數據,將原有服務器的數據均到新節點上但是有點慢
    #./bin/hdfs dfsadmin
    #./bin/hdfs dfsadmin -setBalancerBandwidth 67108864 #增加同步數據的帶寬
    #./sbin/start-balancer.sh -threshold 5 #啟動同步線程

  6. 查看集群狀態
    #./bin/hdfs dfsadmin -report

HDFS 刪除節點

  1. 配置NameNode的hdfs-site.xml
    #vim etc/hadoop/hdfs-site.xml
    #檢查 dfs.replication 設置的副本數量,備份份數要小於刪除後的節點數
    #增加 dfs.hosts.exclude 配置
    <property>
    <name>dfs.hosts.exclude</name>
    <value>/usr/local/hadoop/etc/hadoop/exclude</value>
    </property>

  2. 增加 exclude 配置文件,寫入要刪除的節點 ip
    #vim etc/hadoop/exclude
    newnode

  3. 將配置同步到剩余 所有節點上
    #./rsyncfile.sh

  4. 在master更新數據
    #./bin/hdfs dfsadmin -refreshNodes

  5. 查看狀態
    #./bin/hdfs dfsadmin -report
    Hostname: node5
    Decommission Status : Decommission in progress
    #等待狀態面成下面在繼續操作 否則集群會崩噠!
    #./bin/hdfs dfsadmin -report
    Hostname: node5
    Decommission Status : Decommissioned

    關閉節點
    #./sbin/hadoop-daemon.sh stop datanode
    #jps 此時沒有任何角色了


HDFS 修復節點
修復節點比較簡單
單獨配置一臺新 datanode
啟動服務
#./sbin/hadoop-daemon.sh start datanode
數據恢復是自動的
我們上線以後會自動恢復數據,如果數據量非常巨大,可能需要一定的時間

Yarn 的相關操作
由於在 2.x hadoop 引入了 yarn 框架,對於計算節點的操作已經變得非常簡單

增加節點
#sbin/yarn-daemon.sh start nodemanager

刪除節點
#sbin/yarn-daemon.sh stop nodemanager

查看節點 (Resourcemanager)
#./bin/yarn node -list
當沒成功時 重啟服務再查看 
#./sbin/stop-yarn.sh
#./sbin/start-yarn.sh 

HDFS 還有很多其他的應用方式,比如 native-hdfs,有興趣的可以自行測試
用到的軟件依賴
cmake, fuse-devel
protobuf
protobuf-c
native-hdfs-fuse

知識點總結
Hadoop 完全分布式安裝的配置
java 環境
ssh key 認證
hosts 配置
hadoop-env.sh
core-site.xml
hdfs-site.xml
mapred-site.xml
yarn-site.xml
slaves
Hadoop NFS網關
hadoop-env.sh
core-site.xml
hdfs-site.xml
mount 參數

hadoopHDFS-2(hdfs NFS 網關)