Python操作HDFS利器之hdfs

分類:IT技術 時間:2017-03-18

本文基於實驗室已經搭建好的Hadoop平臺而寫,使用python調用hdfs來操作HDFS

HdfsCLI官方文檔:https://hdfscli.readthedocs.io/en/latest/

 

1.安裝

pip install hdfs

 

2.配置

(1)使用hdfs這個用戶登錄到hdfs服務器,創建用戶,並修改權限

(2)集群中所有節點的hdfs-site.xml文件增加如下內容

(3)配置hosts文件:這個配置非常重要。

    如果想在集群外的其他節點(此處可以理解為你自己的工作節點)通過WebHDFS REST API訪問集群,需要配置hosts文件

    本人使用的是Windows7 64位系統,hosts文件在C:\Windows\system32\drivers\etc目錄下。在hosts文件中配置集群中節點的ip和名稱,如下:

此處如果不配置,讀寫操作都無法完成,會出現如下錯誤:

File "C:\Python27\lib\site-packages\hdfs\util.py", line 99, in __exit__
    raise self._err # pylint: disable=raising-bad-type
requests.packages.urllib3.exceptions.NewConnectionError: <requests.packages.urllib3.connection.HTTPConnection object at 0x0000000003B3C400>: Failed to establish a new connection: [Errno 10060] 

 

3.連接

from hdfs import InsecureClient

hdfs_client = InsecureClient('http://10.1.13.111:50070', user='liulin')

print hdfs_client.list('.')        # 列出當前目錄下的所有文件

通過hue可以看到目前user/liulin下的文件情況如下:

程序運行之後的結果如下:

4.讀文件:read()方法提供了一個類似於文件的接口,用於從HDFS讀取文件。

                它必須在with上下文管理器中使用。

(1)將文件加載到內存

# 將文件加載到內存
with client.read('test.txt') as reader:
    data = https://my.oschina.net/wolfoxliu/blog/reader.read()
    print data

通過hue可以看到test.txt的內容如下:

程序運行之後的結果如下:

(2)對於json文件,可以直接反序列化

# 直接將json對象反序列化
with client.read('model.json', encoding='utf-8') as reader:
    from json import load
    model = load(reader)
    print model

(3)如果設置了chunk_size這個參數,with上下文管理器將返回一個chunk_size 字節的生成器,

        而不是返回一個類文件對象,除非同時也設置了delimiter參數。

# 流文件
with client.read('test.txt', chunk_size=8) as reader:
    for chunk in reader:
        print chunk

(4)類似的,如果設置了delimiter這個參數,with上下文管理器將返回一個生成器,該生成器遇到delimiter 就會生成數據。設置該參數的時候,必須同時設置encoding參數。

# 通過設置定界符來讀取數據,必須與encoding參數同時使用
with client.read('test.txt', encoding='utf-8', delimiter='\n') as reader:
    for line in reader:
        print line

 

5.寫文件:通過write()方法向HDFS寫入文件,該方法返回一個可寫的類文件對象

(1)創建一個新文件,並向文件中寫入數據

# 向文件寫入數據,會創建一個新的文件
datahttps://my.oschina.net/wolfoxliu/blog/= '''
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
'''

with client.write('test_liulin.txt') as writer:
    writer.write(data)

(2)通過設置append參數向一個已經存在的文件追加寫入數據

# 通過設置append參數,向一個已經存在的文件追加寫入數據
with client.write('test_liulin.txt', append=True) as writer:
    writer.write('You succeed!')

(3)通過設置overwrite參數向一個已經存在的文件覆蓋寫入數據

# 寫入文件的一部分, 可以用作文件
with client.read('test_liulin.txt', delimiter='\n', encoding='utf-8') as reader, \
        client.write('test_liulin.txt', overwrite=True) as writer:
    for line in reader:
        print line
        if line.find('is') != -1:
            writer.write(line + '\n')

(4)向json文件寫入數據

# 編寫序列化的json對象
sample = {'university': 'HDU', "school": "computer"}
with client.write('sample.json', encoding='utf-8') as writer:
    from json import dump
    dump(sample, writer)

 

6.探索文件系統

所有的Client子類都公開了多種與HDFS交互的方法,大多數方法都是直接將WebHDFS的操作直接模塊化。

(1)用content()方法檢索文件或文件夾的內容摘要

# 檢索文件或文件夾的內容摘要
content = client.content('test.txt')
print content

(2)列出一個目錄中的所有文件

# 列出當前目錄中所有的文件
file_names = client.list('.')
print file_names

(3)檢索一個文件或文件夾的狀態

# 檢索一個文件或文件夾的狀態
from pprint import pprint
status = client.status('test_liulin.txt')
pprint(status)

(4)重命名:該方法也可以用於移動文件

# 給文件重命名
client.rename('test1.txt', 'test22.txt')

(5)刪除文件

# 刪除文件
client.delete('test_wyx')

(6)從HDFS下載文件到本地

# 從HDFS下載文件到本地:即當前這個文件所在的位置
client.download('test_liulin.txt', '.', n_threads=3)

(7)文件路徑擴展:使用特殊的標記來標識路徑,使用#LATEST 來標識給定文件夾中最後被修改的文件

# 給定文件夾中最後一個被修改的文件
with client.read('./#LATEST') as reader:
    data = https://my.oschina.net/wolfoxliu/blog/reader.read()
    print data

註意:如果路徑缺失,上面提到的大多數方法都會報HdfsError,推薦的方式是使用content()和status()方法來檢查路徑是否存在,並將strict參數設置False,若路徑真的不存在,則返回None

 

還有一些高級應用及更詳細的API參考資料請閱讀官方文檔……

 

 


Tags: Windows7 用戶登錄 實驗室 服務器 Failed

文章來源:


ads
ads

相關文章
ads

相關文章

ad