hadoop下c++程序-天气实例,hadoop实例
hadoop下c++程序-天气实例,hadoop实例
很希望能在hadoop上做c++程序,自己对c++还是有点情节的,根据《hadoop权威指南中文第二版》Hadoop的Pipes进行了试验,并测试成功
#include <algorithm> #include <limits.h> #include <stdint.h> #include <string> #include "Pipes.hh" #include "TemplateFactory.hh" #include "StringUtils.hh" class MaxTemperatureMapper : public HadoopPipes::Mapper { public: MaxTemperatureMapper(HadoopPipes::TaskContext& context) { } void map(HadoopPipes::MapContext& context) { std::string line = context.getInputValue(); std::string year = line.substr(15, 4); std::string airTemperature = line.substr(87, 5); std::string q = line.substr(92, 1); if (airTemperature != "+9999" && (q == "0" || q == "1" || q == "4" || q == "5" || q == "9")) { context.emit(year, airTemperature); } } }; class MapTemperatureReducer : public HadoopPipes::Reducer { public: MapTemperatureReducer(HadoopPipes::TaskContext& context) { } void reduce(HadoopPipes::ReduceContext& context) { int maxValue = INT_MIN; while (context.nextValue()) { maxValue = std::max(maxValue, HadoopUtils::toInt(context.getInputValue())); } context.emit(context.getInputKey(), HadoopUtils::toString(maxValue)); } }; int main(int argc, char *argv[]) { return HadoopPipes::runTask(HadoopPipes::TemplateFactory<MaxTemperatureMapper, MapTemperatureReducer>()); }注意:和书上不一样的地方:limit.h头文件
Makefile文件(自己进行了修改):
.SUFFIXES:.h .c .cpp .o CC=g++ CPPFLAGS = -m64 RM = rm SRCS = max_temperature.cpp PROGRAM = max_temperature INC_PATH = -I$(HADOOP_DEV_HOME)/include LIB_PATH = -L$(HADOOP_DEV_HOME)/lib/native LIBS = -lhadooppipes -lcrypto -lhadooputils -lpthread $(PROGRAM):$(SRCS) $(CC) $(CPPFLAGS) $(INC_PATH) $< -Wall $(LIB_PATH) $(LIBS) -g -O2 -o $@ .PHONY:clean clean: $(RM) $(PROGRAM)
源数据文件:
0067011990999991950051507004+68750+023550FM-12+038299999V0203301N00671220001CN9999999N9+00001+99999999999
0043011990999991950051512004+68750+023550FM-12+038299999V0203201N00671220001CN9999999N9+00221+99999999999
0043011990999991950051518004+68750+023550FM-12+038299999V0203201N00261220001CN9999999N9-00111+99999999999
0043012650999991949032412004+62300+010750FM-12+048599999V0202701N00461220001CN0500001N9+01111+99999999999
0043012650999991949032418004+62300+010750FM-12+048599999V0202701N00461220001CN0500001N9+00781+99999999999
上传到HDFS:hdfs dfs -put sample.txt
make后生成了可执行文件上传到HDFS: hdfs dfs -put max_temperature /bin
执行方法: hadoop pipes -D hadoop.pipes.java.recordreader=true -D hadoop.pipes.java.recordwriter=true -input /user/root/sample.txt -output /output -program /bin/max_temperature
数据输出结果:
hadoop有个C++的接口,没有c的。需要自己编译链接库文件。你可以在网上找找,有个wordcount的例子。但是具体讲哪些类的好像没见过。
c语言或者其他语言的程序可以使用streaming方式来运行。
streaming的执行方法如下:
$HADOOP_HOME/bin/hadoop jar $HADOOP_HOME/hadoop-streaming.jar [options]
Options:
-input <path> 任务的输入路径
-output <path> 任务的输出路径,需要是一个还不存在的目录。否则任务不能执行。
-mapper <cmd|JavaClassName> mapper的程序(可以是java的类,也可以是编译好的其他语言的程序)
-combiner <JavaClassName> Combiner的程序
-reducer <cmd|JavaClassName> reducer的程序
-file <file> 程序运行所需要的文件或目录,会在执行任务前拷贝到所有节点机器上
-inputformat TextInputFormat(default)|SequenceFileAsTextInputFormat|JavaClassName Optional.输入文件的格式一般保持默认(默认可以不写这个参数)即可。
-outputformat TextOutputFormat(default)|JavaClassName Optional.输出文件的格式
-partitioner JavaClassName 这个是决定根据key值制定处理数据用哪个reducer的那个类。
-numReduceTasks <num> reducer的数目(这只是任务分配的数目,具体能否并行执行还看hadoop配置的最大并发reducer数目)
-inputreader <spec> 这个参数没用过。。。。。
-cmdenv <n>=<v> 运行程序需要的一些环境变量
-mapdebug <path> 远程调试用,不明白是怎么用的。。。
-reducedebug <path> 远程调试用
实际使用中至少需要指定输入、输出目录和mapper程序
例子:$HADOOP_HOME/bin/hadoop jar $HADOOP_HOME/hadoop-streaming.jar -input test -output out -mapper cat
注意:hadoop-streaming.jar默认并不在$HADOOP_HOME中,你可以在$HADOOP_HOME/contrib/streaming/中找到这个jar包,或者直接使用$HADOOP_HOME/contrib/streaming/hadoop-0.20.2-streaming.jar...余下全文>>
hadoop有一个streaming工具,
在hadoop文件夹下的mapred/contrib里
你百度一下streaming工具的使用方法即可
评论暂时关闭