如何在hadoop环境下运行C程序?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在hadoop环境下运行C程序?相关的知识,希望对你有一定的参考价值。

程序在单机上用GCC编译运行通过,现在有三台机子装了hadoop,需要怎样配置使之能在hadoop环境下运行,谢谢!请务必叙述详尽。
root@linc-OptiPlex-780:/home/public/hadoop/hadoop-0.20.2# bin/hadoop jar ./contrib/streaming/hadoop-0.20.2-streaming.jar -D mapred.reducer.task=0 -input kmeans -output /bin/cat -mapper /root/c/kmeans -file /root/c/ipFile.txt -file /root/c/opFile.txt
这是我用的命令,
11/05/25 10:49:37 INFO streaming.StreamJob: map 0% reduce 0%
11/05/25 10:50:08 INFO streaming.StreamJob: map 100% reduce 100%
11/05/25 10:50:08 INFO streaming.StreamJob: To kill this job, run:
11/05/25 10:50:08 INFO streaming.StreamJob: /home/public/hadoop/hadoop-0.20.2/bin/../bin/hadoop job -Dmapred.job.tracker=localhost:9001 -kill job_201105241748_0015
11/05/25 10:50:08 INFO streaming.StreamJob: Tracking URL: http://linc-OptiPlex-780:50030/jobdetails.jsp?jobid=job_201105241748_0015
11/05/25 10:50:08 ERROR streaming.StreamJob: Job not Successful!
11/05/25 10:50:08 INFO streaming.StreamJob: killJob...
Streaming Job Failed!

hadoop有一个streaming工具,
在hadoop文件夹下的mapred/contrib里
你百度一下streaming工具的使用方法即可追问

我用了streaming工具,我的程序只有mapper段,没有reducer,并且程序是带参数运行的,在网上看了要用-file传递,但是没有输入文件,那-input要 输入什么?

追答

-input 是你mapreduce任务的输入文件或文件夹,是在hdfs下的路径
-file 是将需要传到每台任务机器上的临时文件夹的文件
这两个选项可以设多个,就是同时设置多个输入文件路径,并可以传多个临时文件。
这个临时文件夹就是每台机器运行你的mapper子程序的当前目录。
比如:
hadoop jar streaming.jar -input mapreduce输入路径 -file 本地map程序文件 -file map程序需要的文件(比如配置文件啦之类的) -mapper "./map arg1 arg2" -numReducer 0
这个命令行的意思就是,一个-input选项指定了本mapreduce的输入文件,两个 -file 选项把本地的map程序和配置文件上传到集群中,这样-mapper命令就可以直接使用当前路径调用map程序了(-mapper "./map arg1 arg2",其中arg1 arg2就是map程序的命令行参数)。而-numReducer 表示reduce的数目,如果设置成0,那么map的输出就是最终结果了,不会再经过一道reduce。

注意,streaming面向的是处理一条条字符串记录,如果想要处理二进制非字符串文件的话,需要重写streaming里提供的一些writer reader接口。

假设你的输入文件是/root/c/ipFile.txt,输出目录/root/c/output(hadoop只支持提供一个输出目录,并且要由它来创建)我觉得你的命令应该写成这样:
/home/public/hadoop/hadoop-0.20.2# bin/hadoop jar ./contrib/streaming/hadoop-0.20.2-streaming.jar -input /root/c/ipFile.txt -output /root/c/output -mapper "./kmeans" -file /root/c/kmeans -numReducer 0

参考技术A hadoop本身是用java写的,但Hadoop流提供API允许执行任何语言编写的程序,通过标准输入读取数据,和标准输出写出数据,详见hadoop权威指南 参考技术B (1)切换到执行hadoop 命令的目录:bin/start-all.sh
(2)Hadoop系统上输入以下命令运行程序:
bin/haddop jar contrib/streaming/hadoop-0.20.2-streaming.jar -mapper mapper -reducer reducer -input ipFile -output c_output -jobconf maprd.reduce.tasks=0

以上是关于如何在hadoop环境下运行C程序?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Windows下面运行hadoop的MapReduce程序

如何在Windows下面运行hadoop的MapReduce程序

Windows下运行Hadoop

求教 VS环境下如何给c语言程序运行添加日期限制?

Hadoop ubuntu伪分布式配置及简单使用

老师,IDEA如何在本地运行和调试Hadoop程序?