当前位置: 首页 > 后端技术 > Node.js

Hadoop-Building

时间:2023-04-03 21:25:54 Node.js

withJavaScript可见本文所有操作均在linux环境下进行。请注明出处。“任何可以用JavaScript编写的应用程序最终都会用JavaScript编写。”作为一个小前端,我受到了JeffAtwood前辈们的启发。上述法律是他提出来的。背景我最近在权威的Hadoop学习指南中介绍了HadoopStreaming,说HadoopStreaming是Hadoop提供的一种编程工具,它允许用户使用任何可执行文件或脚本文件作为Mapper和Reducer。本书介绍了如何使用Ruby和Python结合HadoopStreaming进行开发。没有JS,没有乐趣。我们的JS这么强大,肯定是可以的。..分析首先分析一下HadoopStreaming的原理,如下:mapper和reducer会从标准输入中读取用户数据,逐行处理后发送到标准输出。Streaming工具会创建一个MapReduce作业,发送给各个TaskTracker,监控整个作业的执行过程。分析完原理我们知道只需要构造mapper和reducer即可。他们的工作是从标准输入中读取用户数据,以行为单位进行处理(挂起)并将其发送到标准输出。准备JavaScript如何从标准输入输出中读写数据?别担心,我们有NodeJS。准备好JavaScript运行环境后,开始搭建Hadoop运行环境。请参阅Hadoop:单节点集群配置。先写代码,贴上目录结构:$find.../map./reduce./wordcount.txtmap中的代码如下:#!/usr/bin/envnode//引入readline模块constreadline=require('readline')//创建readline接口的实例constrl=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/envnodeconstreadline=require('readline')constrl=readline.createInterface({input:process.stdin,output:process.stdout,terminal:false})//存储键值对letwords=newMap()rl.on('line',line=>{//解构赋值const[word,count]=line.split('\t')//如果单词不存在Map中,则将单词放入Map中,即第一次添加if(!words.has(word)){words.set(word,parseInt(count))}else{//如果单词已经存在,则将单词对应的count加1words.set(word,words.get(word)+1)}})rl.on("关闭",()=>{words.forEach((v,k)=>{//将统计结果写入标准输出console.log(`${k}\t${v}`)})process.exit(0)})wordcount.txt内容如下:JSJavaJSPythonJSHadoopmap和reduce这两个程序目前无法运行,需要添加可执行权限,方法如下:$chmod+xmapreduce现在可以测试程序是否是正确在终端执行:$catwordcount.txt|./地图|./reduceJS3Java1Python1Hadoop1可以看到,词频已经统计正确。接下来,只需将作业提交到Hadoop并让它执行即可。将作业提交到Hadoop此时,确保Hadoop正常运行在HDFS中创建一个目录:$hdfsdfs-mkdirinput将pending文件上传到HDFS:$hdfsdfs-putwordcount.txtinput这个时候可以查看通过web界面上传文件是否正确上传:http://localhost:50070/explor...如下图:提交作业到Hadoop$hadoopjar$HADOOP_HOME/share/hadoop/tools/lib/hadoop-streaming-2.7.3.jar\>-inputinput/wordcount.txt\>-outputoutput\>-mappermap\>-reducerreduce查看计算结果:$hdfsdfs-catoutput/*Hadoop1JS3Java1Python1You可以看到和之前的结果是一致的。解释一下HadoopStreaming的几个参数:-input:输入文件路径-output:输出文件路径-mapper:用户编写的mapper程序,可以是可执行文件或脚本-reducer:用户编写的reducer程序,可以可执行文件或脚本参考HadoopStreaming编程Node.js命令行程序开发教程Readline|Node.jsv7.7.0文档