使用Python訪問HDFS


最近接觸到大數據,對於Skpark和Hadoop的料及都停留在第一次聽到這個名詞時去搜一把看看大概介紹免得跟不上時代的層次。

在實際讀了點別人的代碼,又自己寫了一些之后,雖然談不上理解加深,至少對於大數據技術的整體布局有了更清晰的認識。

 

HDFS主要用來存儲文件系統,雖然Spark有自己的RDD,但是似乎並未被啟用。我需要的數據,是通過Spark服務啟動的計算程序,寫入HDFS中的。

#這結構怎么看都感覺有點怪。

Spark支持Java、Scala和Python開發,對我來說是個好事。唯一的問題就是如何從HDFS中讀取我需要的數據。

Python的HDFS相關包有很多,我使用的是hdfs,根據官方文檔的說法,同時支持hdfs和WebHDFS,默認創建client的方式好像是WebHDFS,

需要通過datanode進行文件操作,而HDFS則是通過namenode進行文件操作,在這里卡了很久,也換過snakebite等包,直到把端口換成datanode,才正常連接。

※參照文檔:http://fatkun.com/2014/11/httpfs-and-webhdfs.html

hdfs包的安裝命令:

sudo pip install hdfs

 

啟動hdfs:

>>> from hdfs.client import Client
>>> client = Client("http://localhost:50070")  # 50070: Hadoop默認namenode
>>> dir(client)
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__registry__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_append', '_append_1', '_create', '_create_1', '_delete', '_get_content_summary', '_get_file_checksum', '_get_file_status', '_get_home_directory', '_list_status', '_mkdirs', '_open', '_rename', '_request', '_session', '_set_owner', '_set_permission', '_set_replication', '_set_times', '_timeout', 'checksum', 'content', 'delete', 'download', 'from_options', 'list', 'makedirs', 'parts', 'read', 'rename', 'resolve', 'root', 'set_owner', 'set_permission', 'set_replication', 'set_times', 'status', 'upload', 'url', 'walk', 'write']
>>>

其中用到的方法有:

walk() 類似os.walk,返回值也是包含(路徑,目錄名,文件名)元素的數組,每層迭代。

read() 類似file.read,官方文檔的說法是client.read必須在with塊里使用:

with client.read(filepath) as fs:

    content = fs.read()

 

write() 寫文件,同樣需要在with塊中使用:

client.write(filepath, data=data_str, encoding='utf-8')

還有一種寫法:

from hdfs.hfile import Hfile

hfile = Hfile(hostname, port, path, mode='w')
hfile.write(data)
hfile.close()

hfile = Hfile(hostname, port, path)
data = hfile.read()
hfile.close()

 

在filepath中,如果有不存在的路徑,會被直接創建出來。

 

目前用到的只有這些,后面如果涉及新的方法或者模塊,會繼續增加。

 

※ 關於Spark部署任務

Spark部署任務的命令,是spark-submit,語法是

./bin/spark-submit \
--class <main-class>
--master <master-url> \
--deploy-mode <deploy-mode> \
--conf <key>=<value> \
... # other options
<application-jar> \
[application-arguments]

默認可以直接使用Java程序的jar包,Scala是基於Java的,同樣可以打包成jar,對於python文件,需要在<application-jar>處使用--py-files定義,單個文件可以直接寫出,多個文件的話可以打包成.zip或.egg。

參考:http://spark.apache.org/docs/latest/submitting-applications.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM