Hadoop:运用 JavaScript 构建

申明

  1. 本文一切操纵均在 linux 环境下举行。

  2. 转载请说明出处。

“任何能够运用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:运用 JavaScript 构建》

向 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 的几个参数:

  1. -input:输入文件途径

  2. -output:输出文件途径

  3. -mapper:用户本身写的 mapper 顺序,能够是可实行文件或许剧本

  4. -reducer:用户本身写的 reducer 顺序,能够是可实行文件或许剧本

参考资料

Hadoop Streaming 编程
Node.js 命令行顺序开辟教程
Readline | Node.js v7.7.0 Documentation

    原文作者:kviccn
    原文地址: https://segmentfault.com/a/1190000008574175
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞