1. 背景
Hadoop支持Java以及C/C++開發,其中Hadoop Pipes(C++)支持MapReduce,而Hadoop libhdfs(C)支持HDFS的訪問。但Python的解決方案僅能支持Hadoop部分功能,具體如下。
Hadoop Streaming:1. Awkward編程風格;2.僅能編寫Mapper和Reducer腳本,不能編寫RecordReader/Writer,Partitioner腳本;3. 不能訪問HDFS;4. 僅能處理文本數據流;
Jython:1.支持不完整的標准庫;2.大多數第三方包僅兼容CPython;3.不能使用C/C++擴展;
Hadoop-based類:局限性類似於Hadoop Streaming/Jython。
Non-Hadoop MR類:不成熟。
以上Python方案只支持hadoop部分功能,不能完全同時支持MapReduce/HDFS。因此CRS4提出了Pydoop 方案,用Python封裝Hadoop Pipes和libhdfs,實現MapReduce和HDFS的訪問。
2. Pydoop特性
Pydoop的特性如下:
支持訪問多數MR組件(RecordReader/Writer/Partitioner);
獲取configuration,設置counter和report status;
Like Java編程;
支持CPython,支持Python模塊;
支持Hadoop HDFS API。
綜上所述,歸納了Hadoop Streaming-Jython-Pydoop類的特性,如下圖。
3. Pydoop架構
Pydoop架構如下圖所示,包括整合Pipes和整合C libhdfs兩部分。
整合Pipes:方法調用流從Hadoop Framework開始,通過C++ Pipes和Python API,最后到達用戶自定義的方法;Boost封裝結果后,返回至Hadoop Framework。
整合C libhdfs: 與Pipes相反,函數調用由Pydoop觸發,通過C libhdfs,到達Hadoop framework; Boost封裝結果后返回Pydoop端。
4. Pydoop模塊包
Pydoop包括pydoop.hdfs、pydoop.pipes、pydoop.utils、pydoop.hadut等模塊包,包的詳細功能如下:
Hdfs:hdfs api模塊,包括hdfs.path、hdfs.fs、 hdfs.file子包。主要有訪問HDFS,讀寫文件,獲取文件/目錄/文件系統屬性的信息功能。
Pipes:mapreduce模塊包,用於編寫Mapreduce程序,編寫mapreduce組件(Mapper, Reducer, RecordReader/Writer, Partitioner,etc.)。
Utils: utility函數模塊包。
Hadut:hadoop shell命令模塊包。
參考資料