之前一直使用hdfs的命令進(jìn)行hdfs操作,比如:
1
2
3
4
5
|
hdfs dfs - ls / user / spark / hdfs dfs - get / user / spark / a.txt / home / spark / a.txt #從HDFS獲取數(shù)據(jù)到本地 hdfs dfs - put - f / home / spark / a.txt / user / spark / a.txt #從本地覆蓋式上傳 hdfs dfs - mkdir - p / user / spark / home / datetime = 20180817 / .... |
身為一個(gè)python程序員,每天操作hdfs都是在程序中寫各種cmd調(diào)用的命令,一方面不好看,另一方面身為一個(gè)Pythoner這是一個(gè)恥辱,于是乎就挑了一個(gè)hdfs3的模塊進(jìn)行hdfs的操作,瞬間就感覺優(yōu)雅多了:
hdfs 官方API:https://hdfs3.readthedocs.io/en/latest/api.html
1
2
3
4
5
6
|
>>> 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' ) |
#文件讀取
1
2
3
4
5
6
|
#txt文件全部讀取 >>> with hdfs. open ( '/user/data/file.txt' ) as f: ... data = f.read( 1000000 ) #使用pandas讀取1000行數(shù)據(jù) >>> 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!')
#多節(jié)點(diǎn)連接設(shè)置
1
2
3
4
5
6
7
8
9
10
|
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
hdfs = HDFileSystem(host = '127.0.0.1' , port = 8020 ) hdfs.cancel_token(token = None ) #未知,求大佬指點(diǎn) hdfs.cat(path) #獲取指定目錄或文件的內(nèi)容 hdfs.chmod(path, mode) #修改制定目錄的操作權(quán)限 hdfs.chown(path, owner, group) #修改目錄所有者,以及用戶組 hdfs.concat(destination, paths) #將指定多個(gè)路徑paths的文件,合并成一個(gè)文件寫入到destination的路徑,并刪除源文件(The source files are deleted on successful completion.成功完成后將刪除源文件。) hdfs.connect() #連接到名稱節(jié)點(diǎn) 這在啟動(dòng)時(shí)自動(dòng)發(fā)生。 LZ:未知作用,按字面意思,應(yīng)該是第一步HDFileSystem(host='127.0.0.1', port=8020)發(fā)生的 hdfs.delegate_token(user = None ) hdfs.df() #HDFS系統(tǒng)上使用/空閑的磁盤空間 hdfs.disconnect() #跟connect()相反,斷開連接 hdfs.du(path, total = False , deep = False ) #查看指定目錄的文件大小,total是否把大小加起來一個(gè)總數(shù),deep是否遞歸到子目錄 hdfs.exists(path) #路徑是否存在 hdfs.get(hdfs_path, local_path, blocksize = 65536 ) #將HDFS文件復(fù)制到本地,blocksize設(shè)置一次讀取的大小 hdfs.get_block_locations(path, start = 0 , length = 0 ) #獲取塊的物理位置 hdfs.getmerge(path, filename, blocksize = 65536 ) #獲取制定目錄下的所有文件,復(fù)制合并到本地文件 hdfs.glob(path) #/user/spark/abc-*.txt 獲取與這個(gè)路徑相匹配的路徑列表 hdfs.head(path, size = 1024 ) #獲取指定路徑下的文件頭部分的數(shù)據(jù) hdfs.info(path) #獲取指定路徑文件的信息 hdfs.isdir(path) #判斷指定路徑是否是一個(gè)文件夾 hdfs.isfile(path) #判斷指定路徑是否是一個(gè)文件 hdfs.list_encryption_zones() #獲取所有加密區(qū)域的列表 hdfs.ls(path, detail = False ) #返回指定路徑下的文件路徑,detail文件詳細(xì)信息 hdfs.makedirs(path, mode = 457 ) #創(chuàng)建文件目錄類似 mkdir -p hdfs.mkdir(path) #創(chuàng)建文件目錄 hdfs.mv(path1, path2) #將path1移動(dòng)到path2 open (path, mode = 'rb' , replication = 0 , buff = 0 , block_size = 0 ) #讀取文件,類似于python的文件讀取 hdfs.put(filename, path, chunk = 65536 , replication = 0 , block_size = 0 ) #將本地的文件上傳到,HDFS指定目錄 hdfs.read_block(fn, offset, length, delimiter = None ) #指定路徑文件的offset指定讀取字節(jié)的起始點(diǎn),length讀取長(zhǎng)度,delimiter確保讀取在分隔符bytestring上開始和停止 >>> hdfs.read_block( '/data/file.csv' , 0 , 13 ) b 'Alice, 100\nBo' >>> hdfs.read_block( '/data/file.csv' , 0 , 13 , delimiter = b '\n' ) b 'Alice, 100\nBob, 200' hdfs.rm(path, recursive = True ) #刪除指定路徑recursive是否遞歸刪除 hdfs.tail(path, size = 1024 ) #獲取 文件最后一部分的數(shù)據(jù) hdfs.touch(path) #創(chuàng)建一個(gè)空文件 hdfs.walk(path) #遍歷文件樹 |
補(bǔ)充知識(shí):HDFS命令批量創(chuàng)建文件夾和文件
批量創(chuàng)建測(cè)試文件夾:
hadoop fs -mkdir -p /user/hivedata/temp/201912311001/d={27..30}/h={10..17}/m5={5,15,25}/
批量創(chuàng)建測(cè)試文件:
hadoop fs -touchz /user/hivedata/temp/201912311001/d={27..30}/h={10..17}/m5={5,15,25}/{0..5}.orc
最終效果:
hadoop fs -ls -R /user/hivedata/
以上這篇python使用hdfs3模塊對(duì)hdfs進(jìn)行操作詳解就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持服務(wù)器之家。
原文鏈接:https://blog.csdn.net/u013429010/article/details/81772130