申明
本文一切操纵均在 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}\t1`)
})
})
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
})
// 存储键值对 <String, Number>
let words = new Map()
rl.on('line', line => {
// 解构赋值
const [word, count] = line.split('\t')
// 假如 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}\t${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 接口检察文件是不是准确上传:
向 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