摘要:說明本文所有操作均在環境下進行。任何可以使用來編寫的應用,最終會由編寫。書中分別介紹了如何使用和結合進行開發。工具會創建作業,發送給各個,同時監控整個作業的執行過程。準備好的運行環境之后開始搭建的運行環境,參考單節點集群配置。
說明
本文所有操作均在 linux 環境下進行。
轉載請注明出處。
"任何可以使用JavaScript來編寫的應用,最終會由JavaScript編寫。"
作為一名小前端,我深受 Jeff Atwood 前輩的鼓舞。上面這條定律便是他提出來的。
背景最近在學習 Hadoop ,權威指南 中介紹到了 Hadoop Streaming,說 Hadoop Streaming 是 Hadoop 提供的一個編程工具,它允許用戶使用任何可執行文件或者腳本文件作為 Mapper 和 Reducer 。書中分別介紹了如何使用 Ruby 和 Python 結合 Hadoop Streaming 進行開發。沒有 JS,不開心。我們 JS 這么強大,一定也可以。。。
分析我們先來分析 Hadoop Streaming 的原理,如下:
mapper 和 reducer 會從標準輸入中讀取用戶數據,一行一行處理后發送給標準輸出。Streaming 工具會創建 MapReduce 作業,發送給各個 TaskTracker,同時監控整個作業的執行過程。
分析完原理之后我們知道了只需構造 mapper 和 reducer 即可,他們的工作是從標準輸入讀取用戶數據,以行(hang)為單位處理完成后發送到標準輸出。
準備JavaScript 如何從標準輸入輸出讀寫數據呢?別擔心,我們有 NodeJS。
準備好 JavaScript 的運行環境之后開始搭建 Hadoop 的運行環境,參考 Hadoop: 單節點集群配置。
先貼目錄結構:
$ find . . ./map ./reduce ./wordcount.txt
map 中的代碼如下:
#!/usr/bin/env node // 引入readline模塊 const readline = require("readline") // 創建readline接口實例 const rl = readline.createInterface({ input:process.stdin, output:process.stdout }) rl.on("line", line => { // 分離每一行的單詞 line.split(" ").map((word) => { // 將單詞以如下格式寫入標準輸出 console.log(`${word} 1`) }) }) rl.on("close", () => { process.exit(0) })
reduce 中的代碼如下:
#!/usr/bin/env node const readline = require("readline") const rl = readline.createInterface({ input:process.stdin, output:process.stdout, terminal: false }) // 存儲鍵值對let words = new Map() rl.on("line", line => { // 解構賦值 const [word, count] = line.split(" ") // 如果 Map 中沒有該單詞,則將該單詞放入 Map ,即第一次添加 if (!words.has(word)) { words.set(word, parseInt(count)) } else { // 如果該單詞已存在,則將該單詞對應的 count 加 1 words.set(word, words.get(word) + 1) } }) rl.on("close", () => { words.forEach((v, k) => { // 將統計結果寫入標準輸出 console.log(`${k} ${v}`) }) process.exit(0) })
wordcount.txt 中的內容如下:
JS Java JS Python JS Hadoop
目前 map 和 reduce 這兩個程序還無法運行,需要加可執行權限,方法如下:
$ chmod +x map reduce
現在可以在終端測試一下程序是否能正確執行:
$ cat wordcount.txt | ./map | ./reduce JS 3 Java 1 Python 1 Hadoop 1
可以看到,已經正確統計出了詞頻。
接下來只需把作業提交給 Hadoop ,讓它去執行就可以了。
提交作業至 Hadoop此時要確保 Hadoop 正常運行
在 HDFS 中創建目錄:
$ hdfs dfs -mkdir input
將待處理文件上傳至 HDFS:
$ hdfs dfs -put wordcount.txt input
此時可以通過 web 接口查看文件是否正確上傳:
http://localhost:50070/explor...
如下圖所示:
向 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 1 JS 3 Java 1 Python 1
可以看到與之前的結果一致。
解釋一下 Hadoop Streaming 的幾個參數:
-input:輸入文件路徑
-output:輸出文件路徑
-mapper:用戶自己寫的 mapper 程序,可以是可執行文件或者腳本
-reducer:用戶自己寫的 reducer 程序,可以是可執行文件或者腳本
參考資料Hadoop?Streaming?編程
Node.js 命令行程序開發教程
Readline?|?Node.js v7.7.0 Documentation
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/81920.html
摘要:雖然廣受歡迎,但是仍受到來自另外一個基于的機器學習庫的競爭年出現的。還提供更傳統的機器學習功能的庫,包括神經網絡和決策樹系統。和的機器學習庫。顧名思義,是用于神經網絡機器學習的庫,便于將瀏覽器用作數據工作臺。 關于機器學習的11個開源工具 翻譯:瘋狂的技術宅英文標題:11 open source tools to make the most of machine learning英文連...
閱讀 2588·2021-11-24 09:38
閱讀 2615·2019-08-30 15:54
閱讀 934·2019-08-30 15:52
閱讀 1918·2019-08-30 15:44
閱讀 2726·2019-08-30 13:48
閱讀 778·2019-08-29 16:21
閱讀 1008·2019-08-29 14:03
閱讀 2223·2019-08-28 18:15