HDFS進階應用 配置NFS 網關java
• NFS 網關用途node
– 1.用戶能夠經過操做系統兼容的本地NFSv3客戶端來閱覽HDFS文件系統linux
– 2.用戶能夠從HDFS文件系統下載文檔到本地文件系統正則表達式
– 3.用戶能夠經過掛載點直接流化數據。支持文件附加,可是不支持隨機寫apache
– NFS 網關支持NFSv3和容許HDFS 做爲客戶端文件系統的一部分被掛載vim
• 特性與注意事項安全
– 不支持隨機寫ssh
– 在非安全模式,運行網關的用戶是代理用戶tcp
– 在安全模式時,Kerberos keytab中的用戶是代理用戶ide
– 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>
– 若是客戶端安裝容許訪問時間更新,在某些Unix系統上,用戶能夠經過使用「noatime」安裝來禁用訪問時間更新
<property>
<name>dfs.namenode.accesstime.precision</name>
<value>0</value>
</property>
– nfs.dump.dir
– 用戶須要更新文件轉儲目錄參數。NFS客戶端常常從新安排寫操做,順序的寫操做會以隨機到達NFS網關。這個目錄經常使用於臨時存儲無序的寫操做。對於每一個文件,無序的寫操做會在他們積累在內存中超過必定閾值(如。1 mb)被轉儲。須要確保有足夠的空間的目錄。例如,若是應用上傳10個100M,那麼這個轉儲目錄推薦有1GB左右的空間,以便每一個文件都發生最壞的狀況。只有NFS網關須要在設置該屬性後重啓。
– nfs.exports.allowed.hosts
– 默認狀況下,export能夠被任何客戶端掛載。爲了更好的控制訪問,能夠設置屬性。值字符串爲機器名和訪問策略,經過空格來分割。機器名的格式能夠是單一的主機,Java的正則表達式或者IPv4地址。訪問權限使用rw或ro來指定導出目錄的讀/寫或機器只讀訪問。若是訪問策略沒被提供,默認爲只讀的。每一個條目使用「;」來分割。
• 調試與日誌排錯
– 在配置 NFS 網關過程當中常常會碰到各類各樣的錯誤,若是出現了錯誤,打開調試日誌是一個不錯的選擇
• log4j.property
– log4j.logger.org.apache.hadoop.hdfs.nfs=DEBUG
– log4j.logger.org.apache.hadoop.oncrpc=DEBUG
• core-site.xml
– hadoop.proxyuser.{nfsuser}.groups
– hadoop.proxyuser.{nfsuser}.hosts
– 這裏的 nfsuser 是你機器上真實運行 nfsgw 的用戶
– 在非安全模式,運行nfs網關的用戶爲代理用戶
– groups 爲掛載點用戶所使用的組
– hosts 爲掛載點主機地址
• hdfs-site.xml
– nfs.exports.allowed.hosts
– 設置容許訪問 NFS 主機列與權限,默認 「ro」
<property>
<name>nfs.exports.allowed.hosts</name>
<value>* rw</value>
</property>
– dfs.namenode.accesstime.precision
– 關閉 access time
<property>
<name>dfs.namenode.accesstime.precision</name>
<value>3600000</value>
</property>
– nfs.dump.dir
– 設置轉儲目錄
<property>
<name>nfs.dump.dir</name>
<value>/tmp/.hdfs-nfs</value>
</property>
– nfs.rtmax & nfs.wtmax
– 用戶能夠像訪問本地文件系統的一部分同樣訪問HDFS,但硬連接和隨機寫還不支持。對於大文件I/O的優化,能夠在mount的時候增長NFS傳輸的大小(rsize和wsize)。在默認狀況下,NFS網關支持1MB做爲最大的傳輸大小。更大的數據傳輸大小,須要在hdfs-site.xml中設置「nfs.rtmax」 和「nfs.wtmax」
– nfs.rtmax & nfs.wtmax
<property>
<name>nfs.rtmax</name>
<value>4194304</value>
</property>
<property>
<name>nfs.wtmax</name>
<value>1048576</value>
</property>
– nfs.port.monitoring.disabled
– 容許從沒有權限的客戶端掛載 nfs
<property>
<name>nfs.port.monitoring.disabled</name>
<value>false</value>
</property>
• nfs.map
– 系統管理員必須確保在NFS客戶端的用戶和在HDFS網關主機上的用戶有相同的名稱和UID。不一樣主機上建立的用戶須要修改UID(例如使用「usermod -u 123myusername」),在NFS客戶端或者NFS網關主機來進行。若是客戶端的用戶和NFS網關的用戶 uid 不能保持一致須要咱們配置 nfs.map 的靜態映射關係
實驗環境準備參考 http://www.javashuo.com/article/p-untbjyga-cn.html
配置 NFS 網關
# cd /usr/local/hadoop/
# ./sbin/stop-all.sh
# jps
6598 Jps
# vim /etc/hosts
192.168.4.1 master
192.168.4.2 node1
192.168.4.3 node2
192.168.4.4 node3
192.168.4.5 nfsgw //添加新的主機
# for i in {1..5}
> do
> rsync -a /etc/hosts 192.168.4.${i}:/etc/hosts
> done
# scp /etc/yum.repos.d/yum.repo nfsgw:/etc/yum.repos.d/
yum.repo 100% 61 0.1KB/s 00:00
# ssh nfsgw
Last login: Wed Jan 31 08:20:55 2018 from master
# sed -ri "s/^(SELINUX=).*/\1disabled/" /etc/selinux/config ; yum -y remove firewalld
# reboot
// 添加用戶
[root@nfsgw ~]# adduser -g 10 -u 1001 nfsuser
[root@nfsgw ~]# id nfsuser
uid=1001(nfsuser) gid=10(wheel) 組=10(wheel)
[root@master ~]# adduser -g 10 -u 1001 nfsuser
[root@master ~]# id nfsuser
[root@master ~]# cd /usr/local/hadoop/
[root@master hadoop]# cd etc/hadoop/
[root@master hadoop]# vim core-site.xml
<property>
<name>hadoop.proxyuser.nfsuser.groups</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.nfsuser.hosts</name>
<value>*</value>
</property>
[root@master hadoop]# for i in node{1..3}
> do
> rsync -a /usr/local/hadoop/etc/hadoop/ ${i}:/usr/local/hadoop/etc/hadoop/ -e "ssh"
> done
[root@master ~]# ssh nfsgw
[root@nfsgw ~]# yum -y install java-1.8.0-openjdk-devel.x86_64
[root@nfsgw ~]# cd /usr/local/
[root@nfsgw ~]# rsync -azSH --delete master:/usr/local/hadoop ./ -e "ssh" //同步hadoop
[root@nfsgw ~]# yum -y remove rpcbind nfs-util
[root@master ~]# cd /usr/local/hadoop/
[root@master hadoop]# ./sbin/start-dfs.sh //啓動集羣
[root@master hadoop]# jps
6755 NameNode
7062 Jps
6953 SecondaryNameNode
[root@master hadoop]# ./bin/hdfs dfsadmin -report //檢查節點
[root@master hadoop]# ssh nfsgw
Last login: Wed Jan 31 08:26:48 2018 from master
[root@nfsgw ~]# cd /usr/local/hadoop/
[root@nfsgw hadoop]# cd etc/hadoop/
[root@nfsgw hadoop]# vim hdfs-site.xml
...
<property>
<name>nfs.exports.allowed.hosts</name>
<value>* rw</value> //容許那些主機訪問權限
</property>
<property>
<name>dfs.namenode.accesstime.precision</name>
<value>3600000</value> //accesstime 更新時間
</property>
<property>
<name>nfs.dump.dir</name>
<value>/var/nfstemp</value> //轉儲目錄
</property>
<property>
<name>nfs.rtmax</name>
<value>4194304</value> // 讀文件 傳輸大小
</property>
<property>
<name>nfs.wtmax</name>
<value>1048576</value> //寫文件 傳輸大小
</property>
<property>
<name>nfs.port.monitoring.disabled</name>
<value>false</value> // 容許客戶端掛載
</property>
...
[root@nfsgw ~]# mkdir /var/nfstemp
[root@nfsgw ~]# chown 1001.10 /var/nfstemp/
[root@nfsgw ~]# setfacl -m u:nfsuser:rwx /usr/local/hadoop/logs/
[root@nfsgw ~]# cd /usr/local/hadoop/
– 啓動 portmap 服務
[root@nfsgw hadoop]# ./sbin/hadoop-daemon.sh --script ./bin/hdfs start portmap
starting portmap, logging to /usr/local/hadoop/logs/hadoop-root-portmap-nfsgw.out
[root@nfsgw hadoop]# su nfsuser
– 啓動 nfs3
[nfsuser@nfsgw hadoop]$ ./sbin/hadoop-daemon.sh --script ./bin/hdfs start nfs3
starting nfs3, logging to /usr/local/hadoop/logs/hadoop-nfsuser-nfs3-nfsgw.out
[nfsuser@nfsgw hadoop]$ jps
2728 Jps
2671 Nfs3
[nfsuser@nfsgw hadoop]$ exit
exit
[root@nfsgw hadoop]# jps
2738 Jps
2588 Portmap
2671 -- process information unavailable
– 這裏要特別注意:
– 啓動 portmap 須要使用 root 用戶
– 啓動 nfs3 須要使用 core-site 裏面設置的用戶
掛載 nfs
– 目前NFS v3僅使用TCP做爲傳輸協議。 不支持NLM,所以須要安裝選項「nolock」。 強烈建議使用安裝選項「sync」,由於它能夠最小化或避免從新排序寫入,這將致使更可預測的吞吐量。 未指定同步選項可能會致使上傳大文件時出現不可靠的行爲
– 若是必須使用軟安裝,用戶應該給它一個相對較長的超時(至少不小於主機上的默認超時)
# mount -t nfs -o vers=3,proto=tcp,nolock,sync,noatime,noacl 192.168.4.5:/ /mnt/
# ls /mnt/
input output tmp