1. 程式人生 > 程式設計 >python使用hdfs3模組對hdfs進行操作詳解

python使用hdfs3模組對hdfs進行操作詳解

之前一直使用hdfs的命令進行hdfs操作,比如:

hdfs dfs -ls /user/spark/
hdfs dfs -get /user/spark/a.txt /home/spark/a.txt #從HDFS獲取資料到本地
hdfs dfs -put -f /home/spark/a.txt /user/spark/a.txt #從本地覆蓋式上傳
hdfs dfs -mkdir -p /user/spark/home/datetime=20180817/
....

身為一個python程式設計師,每天操作hdfs都是在程式中寫各種cmd呼叫的命令,一方面不好看,另一方面身為一個Pythoner這是一個恥辱,於是乎就挑了一個hdfs3的模組進行hdfs的操作,瞬間就感覺優雅多了:

hdfs 官方API:https://hdfs3.readthedocs.io/en/latest/api.html

>>> from hdfs3 import HDFileSystem
#連結HDFS
>>> hdfs = HDFileSystem(host='localhost',port=8020)
>>> hdfs.ls('/user/data')
>>> hdfs.put('local-file.txt','/user/data/remote-file.txt')
>>> hdfs.cp('/user/data/file.txt','/user2/data')

#檔案讀取

#txt檔案全部讀取
>>> with hdfs.open('/user/data/file.txt') as f:
...  data = f.read(1000000)
#使用pandas讀取1000行資料
>>> with hdfs.open('/user/data/file.csv.gz') as f:
...  df = pandas.read_csv(f,compression='gzip',nrows=1000)

#寫入檔案

>>> with hdfs.open('/tmp/myfile.txt','wb') as f:
... f.write(b'Hello,world!')

#多節點連線設定

host = "nameservice1"
conf = {"dfs.nameservices": "nameservice1","dfs.ha.namenodes.nameservice1": "namenode113,namenode188","dfs.namenode.rpc-address.nameservice1.namenode113": "hostname_of_server1:8020","dfs.namenode.rpc-address.nameservice1.namenode188": "hostname_of_server2:8020","dfs.namenode.http-address.nameservice1.namenode188": "hostname_of_server1:50070","dfs.namenode.http-address.nameservice1.namenode188": "hostname_of_server2:50070","hadoop.security.authentication": "kerberos"
}
fs = HDFileSystem(host=host,pars=conf)

#API

hdfs = HDFileSystem(host='127.0.0.1',port=8020)
hdfs.cancel_token(token=None) #未知,求大佬指點
hdfs.cat(path) #獲取指定目錄或檔案的內容
hdfs.chmod(path,mode) #修改制定目錄的操作許可權
hdfs.chown(path,owner,group) #修改目錄所有者,以及使用者組
hdfs.concat(destination,paths) #將指定多個路徑paths的檔案,合併成一個檔案寫入到destination的路徑,並刪除原始檔(The source files are deleted on successful completion.成功完成後將刪除原始檔。)
hdfs.connect() #連線到名稱節點 這在啟動時自動發生。 LZ:未知作用,按字面意思,應該是第一步HDFileSystem(host='127.0.0.1',port=8020)發生的
hdfs.delegate_token(user=None)
hdfs.df() #HDFS系統上使用/空閒的磁碟空間
hdfs.disconnect() #跟connect()相反,斷開連線
hdfs.du(path,total=False,deep=False) #檢視指定目錄的檔案大小,total是否把大小加起來一個總數,deep是否遞迴到子目錄
hdfs.exists(path) #路徑是否存在
hdfs.get(hdfs_path,local_path,blocksize=65536) #將HDFS檔案複製到本地,blocksize設定一次讀取的大小
hdfs.get_block_locations(path,start=0,length=0) #獲取塊的物理位置
hdfs.getmerge(path,filename,blocksize=65536) #獲取制定目錄下的所有檔案,複製合併到本地檔案
hdfs.glob(path) #/user/spark/abc-*.txt 獲取與這個路徑相匹配的路徑列表
hdfs.head(path,size=1024) #獲取指定路徑下的檔案頭部分的資料
hdfs.info(path) #獲取指定路徑檔案的資訊
hdfs.isdir(path) #判斷指定路徑是否是一個資料夾
hdfs.isfile(path) #判斷指定路徑是否是一個檔案
hdfs.list_encryption_zones() #獲取所有加密區域的列表
hdfs.ls(path,detail=False) #返回指定路徑下的檔案路徑,detail檔案詳細資訊
hdfs.makedirs(path,mode=457) #建立檔案目錄類似 mkdir -p
hdfs.mkdir(path) #建立檔案目錄
hdfs.mv(path1,path2) #將path1移動到path2
open(path,mode='rb',replication=0,buff=0,block_size=0) #讀取檔案,類似於python的檔案讀取
hdfs.put(filename,path,chunk=65536,block_size=0) #將本地的檔案上傳到,HDFS指定目錄
hdfs.read_block(fn,offset,length,delimiter=None) #指定路徑檔案的offset指定讀取位元組的起始點,length讀取長度,delimiter確保讀取在分隔符bytestring上開始和停止
>>> hdfs.read_block('/data/file.csv',13) 
b'Alice,100\nBo'
>>> hdfs.read_block('/data/file.csv',13,delimiter=b'\n') 
b'Alice,100\nBob,200'
hdfs.rm(path,recursive=True) #刪除指定路徑recursive是否遞迴刪除
hdfs.tail(path,size=1024) #獲取 檔案最後一部分的資料
hdfs.touch(path) #建立一個空檔案
hdfs.walk(path) #遍歷檔案樹

補充知識:HDFS命令批量建立資料夾和檔案

批量建立測試資料夾:

hadoop fs -mkdir -p /user/hivedata/temp/201912311001/d={27..30}/h={10..17}/m5={5,15,25}/

批量建立測試檔案:

hadoop fs -touchz /user/hivedata/temp/201912311001/d={27..30}/h={10..17}/m5={5,25}/{0..5}.orc

最終效果:

hadoop fs -ls -R /user/hivedata/

python使用hdfs3模組對hdfs進行操作詳解

以上這篇python使用hdfs3模組對hdfs進行操作詳解就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。