HDFS NFS數據掛載功能

   目的:利用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
     

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章