python使用hdfs3模組對hdfs進行操作詳解
阿新 • • 發佈:2020-06-08
之前一直使用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進行操作詳解就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。