1. 背景html
Hadoop支持Java以及C/C++開發,其中Hadoop Pipes(C++)支持MapReduce,而Hadoop libhdfs(C)支持HDFS的訪問。但Python的解決方案僅能支持Hadoop部分功能,具體以下。python
- Hadoop Streaming:1. Awkward編程風格;2.僅能編寫Mapper和Reducer腳本,不能編寫RecordReader/Writer,Partitioner腳本;3. 不能訪問HDFS;4. 僅能處理文本數據流;
- Jython:1.支持不完整的標準庫;2.大多數第三方包僅兼容CPython;3.不能使用C/C++擴展;
![](http://static.javashuo.com/static/loading.gif)
- Hadoop-based類:侷限性相似於Hadoop Streaming/Jython。
- Non-Hadoop MR類:不成熟。
以上Python方案只支持hadoop部分功能,不能徹底同時支持MapReduce/HDFS。所以CRS4提出了Pydoop 方案,用Python封裝Hadoop Pipes和libhdfs,實現MapReduce和HDFS的訪問。shell
2. Pydoop特性編程
Pydoop的特性以下:api
- 支持訪問多數MR組件(RecordReader/Writer/Partitioner);
- 獲取configuration,設置counter和report status;
- Like Java編程;
- 支持CPython,支持Python模塊;
- 支持Hadoop HDFS API。
綜上所述,概括了Hadoop Streaming-Jython-Pydoop類的特性,以下圖。架構
![點擊查看原始大小圖片](http://static.javashuo.com/static/loading.gif)
3. Pydoop架構app
Pydoop架構以下圖所示,包括整合Pipes和整合C libhdfs兩部分。ide
- 整合Pipes:方法調用流從Hadoop Framework開始,經過C++ Pipes和Python API,最後到達用戶自定義的方法;Boost封裝結果後,返回至Hadoop Framework。
- 整合C libhdfs: 與Pipes相反,函數調用由Pydoop觸發,經過C libhdfs,到達Hadoop framework; Boost封裝結果後返回Pydoop端。
![](http://static.javashuo.com/static/loading.gif)
4. Pydoop模塊包函數
Pydoop包括pydoop.hdfs、pydoop.pipes、pydoop.utils、pydoop.hadut等模塊包,包的詳細功能以下:oop
- 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命令模塊包。
參考資料
Pydoop: a Python MapReduce and HDFS API for Hadoop
Python MapReduce Programming with Pydoop
Pydoop官網