设为首页 收藏本站
查看: 1361|回复: 0

Hadoop stream使用与调试

[复制链接]

尚未签到

发表于 2015-11-11 14:26:30 | 显示全部楼层 |阅读模式
Streaming是Hadoop提供的一个可以使用其他编程语言来进行MapReduce来的API,用户可以使用任何可以使用标准输入输出的语言编写mapreduce。特点是开发简便,map和reduce甚至可以使用shell命令实现。

例如:

$HADOOP_HOME/bin/hadoop  jar $HADOOP_HOME/hadoop-streaming.jar \
-D mapred.map.tasks=1 \
-D mapred.reduce.tasks=1 \
-D mapred.job.name="Experiment" \
-input "input.txt"  \
-output "out" \  
-mapper "xargs cat"  \
-reducer "cat"

以下是我实现的优质微博筛选排重mapreduce的实现

map:

#include <iostream>
#include <stdio.h>
#include <string>

using namespace std;

int main(int argc, char *argv[]){
string docid, dup;
while(cin >> docid >> dup){
cout << dup << &quot;\t&quot; << docid << endl;
}
return 0;
}

reduce:

#include <iostream>
#include <stdint.h>

using namespace std;

int main(int argc, char *argv[]){
string key;
uint64_t value;
string last_key = &quot;&quot;;
uint64_t last_value = 0;
while(cin >> key >> value){
if(key == &quot;*&quot;){
cout << value << &quot;\t&quot; << &quot;A&quot; << endl;
}else if(last_key != &quot;&quot; && last_key != key){
cout << last_value << &quot;\t&quot; << &quot;A&quot; << endl;
last_key = key;
last_value = value;
}else{
last_key = key;
last_value = value;
}
}
if(last_key != &quot;&quot;){
cout << value << &quot;\t&quot; << &quot;A&quot; << endl;
}
}

执行命令:

cmd=&quot;$HADOOP_HOME/bin/hadoop  jar $HADOOP_HOME/hadoop-streaming.jar&quot;
cmd=$cmd&quot; -jt host:port&quot;
cmd=$cmd&quot; -fs host:port&quot;
cmd=$cmd&quot; -input $1&quot;
cmd=$cmd&quot; -output $2&quot;
cmd=$cmd&quot; -file uniq_map&quot;
cmd=$cmd&quot; -file uniq_reduce&quot;
cmd=$cmd&quot; -mapper uniq_map&quot;
cmd=$cmd&quot; -reducer uniq_reduce&quot;
cmd=$cmd&quot; -jobconf mapred.map.tasks.spaculative.execution=false&quot;
cmd=$cmd&quot; -jobconf mapred.task.timeout=60000000&quot;
cmd=$cmd&quot; -jobconf mapred.job.tracker=local&quot;
echo $cmd
$cmd >> ./stat.log其实通过脚本语言实现比C&#43;&#43;更为容易。



注意:

-jt和-fs这种通用选项必须写在最前面(Note: Be sure to place the generic options before the streaming options, otherwise the command will fail)

-jobconf mapred.job.tracker=local 指定任务在本地执行方便用户进行调试,input和output都使用hdfs的文件



hadoop stream的调试非常简单且强大,以下是几种调试方式:

1、直接在本地进行调试,例如 cat example.txt | ./uniq_map | sort | uniq_reduce 就可以实现以上程序的调试

2、让HadoopStreaming程序跑在开发机上。(推荐在开发时使用)在jobconf中加上mapred.job.tracker=local。数据的输入和输出都是来自HDFS此时,HadoopStreaming会在本地运行程序

3、保留出错的现场(推荐在跑大数据量时使用)通过设置jobconf参数keep.failed.task.files=true,当程序出错时,可以保留现以供Debug。可以通过GUI查到到具体是在哪个节点运行失败,然后登陆到该节点<local>/taskTracker/<taskid>/work/ ,查看core文件。

4、通过script程序收集信息来调试程序(推荐在开发时使用)编写调试脚本程序,通过脚本,可以把程序执行过程中任何现场都保留下来,比如 Core文件的堆栈信息,这样可以确定程序具体是在什么地方出错。

脚本示例:



core=`find . -name 'core*'`;
cp $core /home/admin/
gdb -quiet ./a.out -c $core -x ./pipes-default-gdb-commands.txt
pipes-default-gdb-commands.txt注明了执行的gdb命令
info threads
backtrace
quit



(注明:如果要正确执行以上的脚本,必须让程序能输出core文件,可以在程序中加入如下代码段)

struct rlimit limit;
limit.rlim_cur = 65535;
limit.rlim_max = 65535;
if (setrlimit(RLIMIT_CORE, &limit) != 0) {
printf(&quot;setrlimit() failed with errno=%s\n&quot;, strerror(errno));
exit(1);
}
  然后在jobconf中,把要执行的script赋给变量”mapred.map.task.debug.script”或”mapred.reduce.task.debug.script”。 这样当HadoopStreaming执行过程发生core dump,就可以通过JobTracker的GUI界面看到GDB的信息了。
  在Hadoop上调试HadoopStreaming程序的方法详解 by 道凡



版权声明:本文为博主原创文章,未经博主允许不得转载。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-137969-1-1.html 上篇帖子: Hue3.9 安装教程:华丽的Spark,Hadoop UI 下篇帖子: Hadoop:Name or service not knownstname Slave1
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表