本文轉載自:http://www.jianshu.com/p/227c4155941e
最近在學習 Hadoop ,權威指南 中介紹到了 Hadoop Streaming,說 Hadoop Streaming 是 Hadoop 提供的一個編程工具,它允許用戶使用任何可執行文件或者腳本文件作為 Mapper 和 Reducer 。書中分別介紹了如何使用 Ruby 和 Python 結合 Hadoop Streaming 進行開發,但是並沒有介紹如何使用JavaScript編寫MapReduce程序,所有本文就是為了解決這個。
我們先來分析 Hadoop Streaming 的原理,如下:
mapper 和 reducer 會從標準輸入中讀取用戶數據,一行一行處理後發送給標準輸出。Streaming 工具會創建 MapReduce 作業,發送給各個 TaskTracker,同時監控整個作業的執行過程。
分析完原理之後我們知道了只需構造 mapper 和 reducer 即可,他們的工作是從標準輸入讀取用戶數據,以行(hang)為單位處理完成後發送到標準輸出。
JavaScript 如何從標準輸入輸出讀寫數據呢?別擔心,我們有 NodeJS。
準備好 JavaScript 的運行環境之後開始搭建 Hadoop 的運行環境,參考 Hadoop: 單節點集群配置。
先貼目錄結構:
$ find .../map./reduce./wordcount.txt
map 中的代碼如下:
reduce 中的代碼如下:
wordcount.txt 中的內容如下:
JS JavaJS PythonJS Hadoop
目前 map 和 reduce 這兩個程序還無法運行,需要加可執行權限,方法如下:
$ chmod +x map reduce
現在可以在終端測試一下程序是否能正確執行:
$ cat wordcount.txt | ./map | ./reduceJS 3Java 1Python 1Hadoop 1
可以看到,已經正確統計出了詞頻。
接下來只需把作業提交給 Hadoop ,讓它去執行就可以了。
此時要確保 Hadoop 正常運行
在 HDFS 中創建目錄:
$ hdfs dfs -mkdir input
將待處理文件上傳至 HDFS:
$ hdfs dfs -put wordcount.txt input
此時可以通過 web 接口查看文件是否正確上傳:
向 Hadoop 提交作業
$ hadoop jar $HADOOP_HOME/share/hadoop/tools/lib/hadoop-streaming-2.7.3.jar \> -input input/wordcount.txt \> -output output \> -mapper map \> -reducer reduce
檢查計算結果:
$ hdfs dfs -cat output/*Hadoop 1JS 3Java 1Python 1
可以看到與之前的結果一致。
解釋一下 Hadoop Streaming 的幾個參數:
-input:輸入文件路徑
-output:輸出文件路徑
-mapper:用戶自己寫的 mapper 程序,可以是可執行文件或者腳本
-reducer:用戶自己寫的 reducer 程序,可以是可執行文件或者腳本
歡迎關注本公眾號:iteblog_hadoop:
0、回復 spark_2017_all 獲取 Spark Summit East 2017高清視頻和PPT
1、回復 hive_es 獲取 《基於 Hive/ES 金融大數據指標系統》PPT
2、回復 bigdata_e 獲取 《大規模數據處理演變》PPT
3、回復 大數據分析 獲取 《Big Data Analytics》電子書
4、回復 spark2電子書 獲取 《Apache Spark 2 for Beginners》電子書
5、回復 spark2_data 獲取 《Spark for Data Science》電子書
6、回復 架構師大會ppt 獲取 《2016年中國架構師[大數據場]》 PPT
7、回復 intro_flink 獲取 《Introduction to Apache Flink》 電子書
8、回復 learning_flink 獲取《Learning Apache Flink》電子書
8、回復 Hadoop權威指南 獲取 《Hadoop權威指南中文第三版》電子書
9、回復 flink未來 獲取 《The Future of Apache Flink》
10、回復 Learning_PySpark 獲取《Learning PySpark》電子書
11、更多大數據文章歡迎訪問https://www.iteblog.com及本公眾號(iteblog_hadoop)