目的:利用NFS,將HDFS底層文件共享到本地操作系統
本篇文章主要介紹HDFS 的NFS網關配置及配置之後讀寫性能問題,網上有比較多的參考資料,也都很有用。但我在配置過程中,遇到許多其他隱藏的坑,例如,首先我不知道NFS是什麼,我就開始配,導致簡單的配置出錯我都弄了很久。爲了讓跟我一樣的小夥伴們避免踩同樣的坑,我從Linux NFS到HDFS NFS配置,再到配置好之後,數據讀寫性能問題進行了詳細描述,希望對大家有用。
NFS(Network File System,網絡文件系統)是當前主流異構平臺共享文件系統之一,NFS可用於不同類型計算機、操作系統、網絡架構和傳輸協議運行環境中的網絡文件遠程訪問和共享。對於NFS的詳細介紹,可參考曹世宏的:https://blog.csdn.net/qq_38265137/article/details/83146421
本人在實現過程中,使用Hadoop自帶得NFS 網關。
簡介
NFS Gateway支持NFSv3,允許將HDFS路徑掛載到本地客戶端文件系統,目前NFS Gateway支持如下使用模式:
用戶可以通過本地文件系統(與NFSv3兼容)瀏覽Hadoop底層HDFS文件系統;
用戶可以在其本地文件系統下載位於HDFS文件系統的文件;
用戶可以直接將其本地文件系統中的文件上傳到HDFS文件系統中;
用戶可以通過掛載點將數據直接流到HDFS。支持文件追加,但不支持隨機寫入。(Users can stream data directly to HDFS through the mount point. File append is supported but random write is not supported.)
NFS gateway機器需要運行相應Hadoop JAR 文件及進行相應配置。NFS可以運行在DataNode節點、NameNode節點,及任何HDFS客戶端。
配置
NFS-gateway使用代理用戶代理所有訪問NFS掛載點的用戶。
在非安全模式,運行gateway的用戶是代理用戶,而安全模式下,代理用戶是在Kerberos keytab下的用戶。
假定代理用戶是“nfsserver”,且所屬組爲“user-group1”和“user-group2”的用戶使用NFS掛載,則Namenode下的配置文件core-site.xml需要增加如下內容,且當配置文件改變後只需要重啓NameNode節點(NOTE:將字符串“nfsserver”替換爲你的集羣中的代理用戶名)。
1. 添加配置
(1)在core-site.xml文件中添加如下內容
<!--*******set for HDFS NFS Gateway********-->
<property>
<name>hadoop.proxyuser.wusong.groups</name>
<value>*</value>
<description>The 'wusong' is changed by me ,is the user which allowd to proxy all members of the 'user-groups1' and
'user-groups2' groups.
The value '*' means to allow nfsserver user to proxy any group.
</description>
</property>
<property>
<name>hadoop.proxyuser.wusong.hosts</name>
<value>*</value>
<description>This is the host where the nfs gateway is running.
Set this to '*' to allow requests from any hosts to be proxied.
</description>
</property>
(2)在 hdfs-site.xml文件中添加如下內容
<!--*******set for HDFS NFS Gateway********-->
<property>
<name>nfs.export.point</name>
<value>/Data</value>
<description> 此路徑特別重要,用來設置被共享的HDFS目錄路徑,若想將HDFS底層文件系統都通過NFS掛載,可設置爲/。本人只想將Data目錄下的數據進行共享,所以設置爲/Data。</description>
</property>
<property>
<name>nfs.dump.dir</name>
<value>/tmp/.hdfs-nfs</value>
</property>
2. 配置好相應文件之後,需要關閉和啓動相應服務。
1). root用戶下,停止portmap(centos6以上則爲rpcbind)和nfs。
/bin/systemctl stop rpcbind
/bin/systemctl stop nfs
並查看是否停止成功
/bin/systemctl status rpcbind
/bin/systemctl status nfs
錯誤1:
在執行停止rpcbind過程中,/bin/systemctl stop rpcbind,出現:
Warning: Stopping rpcbind.service, but it can still be activated by:
rpcbind.socket
因爲 rpcbind.socket正在運行,運行如下語句停止該服務:/bin/systemctl stop rpcbind.socket
2). 啓動hadoop的portmap與nfs3
(1) root用戶下,執行:/homehadoop2.7.2/sbin/hadoop-daemon.sh --script /home/hadoop2.7.2/bin/hdfs start portmap
一直起不來,查看日誌,是端口111佔用。
lsof -i:111查看佔用端口,用kill -9 PID 殺掉進程
(2)Hadoop用戶下,執行: /home/hadoop2.7.2/sbin/hadoop-daemon.sh --script /home/hadoop2.7.2/bin/hdfs start nfs3
驗證:用jps查看portmap與nfs3服務是否啓動成功
3. 驗證
[root@nn0 logs]# rpcinfo -p nn0
輸出;
program vers proto port service
100005 3 udp 4242 mountd
100005 1 tcp 4242 mountd
100000 2 udp 111 portmapper
100000 2 tcp 111 portmapper
100005 3 tcp 4242 mountd
100005 2 tcp 4242 mountd
100003 3 tcp 2049 nfs
100005 2 udp 4242 mountd
100005 1 udp 4242 mountd
[root@nn0 logs]# showmount -e nn0
輸出:
Export list for nn0:
/Data *
4.數據掛載
mount -t nfs -o vers=3,proto=tcp,nolock,noacl,sync nn0:/ /hdfs/tmp
測試:首先往HDFS存放測試數據
創建目錄:./hdfs dfs -mkdir /nfsTest
放入數據:./hdfs dfs -put /home/db_code_hbase/ed_originaldata/ed_original_data/2012.zip /nfsTest
查看是否導入成功: ./hadoop fs -ls /nfsTest
注意:之前出錯,NFS客戶端節點卡死,df -h都很慢,後來發現是NFS服務斷開;解決方法是重啓NFS服務;
原因:事實上,默認掛載方式爲hard-mount,即當客戶端加載NFS不成功時,一直重試,直到NFS服務器有響應。而若改成soft-mount,當客戶端加載NFS不成功時,重試retrans設定的次數.如果retrans次都不成功,則放棄此操作,返回錯誤信息 "Connect time out"。NFS客戶端掛載命令有多個選項,根據實際情況選擇。
5. 結束nfs3服務
Hadoop用戶下,執行:/home/hadoop2.7.2/sbin/hadoop-daemon.sh --script /home/hadoop2.7.2/bin/hdfs stop nfs3
注意,關閉的用戶必須與開啓的一致。
6. 關於出現的權限問題錯誤
在root用戶的掛載路徑,新增文件,顯示permission denied。
後來發現是配置nfsserver爲wusong,相當於wusong是所有組NFS的代理者,在此處,wusong權限比root 還大。
7. 測試性能:
1) 將本地寫入hdfs的底層目錄:cp ~/2020.zip 2020.zip (2.1GB),耗時4分20秒;
將hdfs的底層目錄下2020.zip拷貝到本地:cp 2020.zip ~/2011.zip 39秒
30MB:4秒27
hdparm -Tt /dev/sda
得到結果如下:
/dev/sda:
Timing cached reads: 18614 MB in 2.00 seconds = 9321.82 MB/sec
Timing buffered disk reads: 900 MB in 3.00 seconds = 299.55 MB/sec
2) (直接在本地文件系統上)利用dd測試磁盤的IO寫速度,命令爲: time dd if=/dev/sda of=test1.dbf bs=8k count=300000 oflag=direct
結果爲:
[root@nn0 HdfsMountdata]# time dd if=/dev/sda of=test.dbf bs=8k count=300000 oflag=direct
300000+0 records in
300000+0 records out
2457600000 bytes (2.5 GB) copied, 23.2341 s, 106 MB/s
real 0m23.236s
user 0m0.129s
sys 0m8.531s
(直接在本地文件系統上)利用dd測試磁盤的IO讀速度,命令爲: dd if=test1.dbf bs=8k count=300000 of=/dev/null
結果爲:
[root@nn0 HdfsMountdata]# dd if=test.dbf bs=8k count=300000 of=/dev/null
300000+0 records in
300000+0 records out
2457600000 bytes (2.5 GB) copied, 11.644 s, 211 MB/s
(本地掛載路徑/hdfs/tmp上)
[root@nn0 tmp]# time dd if=/dev/sda of=/hdfs/test.dbf bs=8k count=300000 oflag=direct
300000+0 records in
300000+0 records out
2457600000 bytes (2.5 GB) copied, 19.9944 s, 123 MB/s
real 0m20.015s
user 0m0.120s
sys 0m6.547s
(本地掛載路徑/hdfs/tmp上)
[root@nn0 tmp]# dd if=/hdfs/test.dbf bs=8k count=300000 of=/dev/null
300000+0 records in
300000+0 records out
2457600000 bytes (2.5 GB) copied, 11.555 s, 213 MB/s‘’
錯誤:
error org.apache.hadoop.hdfs.nfs.nfs3.RpcProgramNfs3:Exception org.apache.hadoop.security.AccessControlException:Permission denied:user=root,accecc=WRITE,inode="/2012.zip":wusong:supergroup:drwxr-xr-x