转自:https://www.linuxidc.com/Linux/2012-04/58991.htm

今天尝试用C语言在Hadoop上编写统计单词的程序,具体过程如下:

一、编写map和reduce程序

mapper.c

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define BUF_SIZE    2048
  5. #define DELIM       '\n'
  6. int main(int argc, char * argv[])
  7. {
  8. char buffer[BUF_SIZE];
  9. while(fgets(buffer,BUF_SIZE-1,stdin))
  10. {
  11. int len = strlen(buffer);
  12. if(buffer[len-1] == DELIM) // 将换行符去掉
  13. buffer[len-1] = 0;
  14. char *query = NULL;
  15. query = strtok(buffer, " ");
  16. while(query)
  17. {
  18. printf("%s\t1\n",query);
  19. query = strtok(NULL," ");
  20. }
  21. }
  22. return 0;
  23. }

reducer.c

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define BUFFER_SIZE     1024
  5. #define DELIM       "\t"
  6. int main(int argc, char * argv[])
  7. {
  8. char str_last_key[BUFFER_SIZE];
  9. char str_line[BUFFER_SIZE];
  10. int count = 0;
  11. *str_last_key = '\0';
  12. while( fgets(str_line,BUFFER_SIZE-1,stdin) )
  13. {
  14. char * str_cur_key = NULL;
  15. char * str_cur_num = NULL;
  16. str_cur_key = strtok(str_line,DELIM);
  17. str_cur_num = strtok(NULL,DELIM);
  18. if(str_last_key[0] =='\0')
  19. {
  20. strcpy(str_last_key,str_cur_key);
  21. }
  22. if(strcmp(str_cur_key, str_last_key))// 前后不相等,输出
  23. {
  24. printf("%s\t%d\n",str_last_key,count);
  25. count = atoi(str_cur_num);
  26. }else{// 相等,则加当前的key的value
  27. count += atoi(str_cur_num);
  28. }
  29. strcpy(str_last_key,str_cur_key);
  30. }
  31. printf("%s\t%d\n",str_last_key,count);
  32. return 0;
  33. }

二、编译

gcc mapper.c -o mapper

gcc reducer.c -o reducer

三、运行

(一)启动hadoop后将待统计单词的输入文件放到 input文件夹中:bin/hadoop fs -put 待统计文件 input

(二)使用contrib/streaming/下的jar工具调用上面的mapper\reducer:

bin/hadoop jar /home/huangkq/Desktop/hadoop/contrib/streaming/hadoop-streaming-0.20.203.0.jar -mapper /home/huangkq/Desktop/hadoop2/mapper -reducer /home/huangkq/Desktop/hadoop2/reducer -input input -output c_output -jobconf mapred.reduce.tasks=2

说明:hadoop-streaming-0.20.203.0.jar是一个管道工具

(三)查看结果:bin/hadoop fs -cat c_output/*

Hadoop 上使用C 语言编程【转】的更多相关文章

  1. 在Linux上使用C语言编程获取IPv4地址及子网掩码

    在Linux上(如Ubuntu或CentOS), 获取某个Network Interface比如eth0的IP地址等信息,我们可以使用ifconfig或者ip addr show命令. $ ifcon ...

  2. 课上补做:用C语言编程实现ls命令

    课上补做:用C语言编程实现ls命令 一.有关ls ls :用来打印当前目录或者制定目录的清单,显示出文件的一些信息等. ls -l:列出长数据串,包括文件的属性和权限等数据 ls -R:连同子目录一同 ...

  3. MapReduce编程模型及其在Hadoop上的实现

    转自:https://www.zybuluo.com/frank-shaw/note/206604 MapReduce基本过程 关于MapReduce中数据流的传输过程,下图是一个经典演示:  关于上 ...

  4. JVM 平台上的各种语言的开发指南

    JVM 平台上的各种语言的开发指南 为什么我们需要如此多的JVM语言? 在2013年你可以有50中JVM语言的选择来用于你的下一个项目.尽管你可以说出一大打的名字,你会准备为你的下一个项目选择一种新的 ...

  5. 个人c语言编程风格总结

    总结一下我个人的编程风格及这样做的原因吧,其实是为了给实验室写一个统一的C语言编程规范才写的.首先声明,我下面提到的编程规范,是自己给自己定的,不是c语言里面规定的. 一件事情,做成和做好中间可能隔了 ...

  6. Linux下C语言编程实现spwd函数

    Linux下C语言编程实现spwd函数 介绍 spwd函数 功能:显示当前目录路径 实现:通过编译执行该代码,可在终端中输出当前路径 代码实现 代码链接 代码托管链接:spwd.c 所需结构体.函数. ...

  7. 混合语言编程:启用CLR(公共语言运行时编译)让C#调用C++

    前言 关于混合C#和C++的编程方式,本人之前写过一篇博客(参见混合语言编程:C#使用原生的Directx和OpenGL),在之前的博客中,介绍了在C#的Winform和WPF下使用原生的Direct ...

  8. Linux基础与Linux下C语言编程基础

    Linux基础 1 Linux命令 如果使用GUI,Linux和Windows没有什么区别.Linux学习应用的一个特点是通过命令行进行使用. 登录Linux后,我们就可以在#或$符后面去输入命令,有 ...

  9. LINUX下C语言编程基础

    实验二 Linux下C语言编程基础 一.实验目的 1. 熟悉Linux系统下的开发环境 2. 熟悉vi的基本操作 3. 熟悉gcc编译器的基本原理 4. 熟练使用gcc编译器的常用选项 5 .熟练使用 ...

随机推荐

  1. C语言版本:单链表的实现

    slist.h #ifndef __SLIST_H__ #define __SLIST_H__ #include<cstdio> #include<malloc.h> #inc ...

  2. 作业6小学生四则运算测试APP的NABCD模型

    小学生四则运算测试NABCD模型 组员:李新,朱浩龙,叶煜稳,陈俊金,林德麟 (1)  N (Need 需求) 需求分析: 四则运算是小学生学习数学的核心和基础,必须经过大量的练习才能熟练掌握,但是一 ...

  3. Jmeter put 方法总结

    1.百度到很多关于jmeter put 方法的使用 ,但觉得都完全 下面我大致总结下 : >1.放入 url 中 如:www.*****.com?a=1&b=2 ; >2.放入到p ...

  4. 随web应用启动而自启动的后台线程

    当前遇到一个需求: 需要在web应用启动的时候就启动一个线程定时的来做某项工作. 有两种解决方法: 1.增加一个监听器Listener来实现相关功能. 2.增加一个随项目启动的servlet来实现相关 ...

  5. delphi Timage 加上滚动条方法

    elphi Timage 加上滚动条方法 1:将  Timage 放入 TScrollBox内,即   [1]设image1.parent:= ScrollBox1;   [2]在Object Ins ...

  6. appium获取Toast内容的方法

    做自动化测试的时候,可能需要根据弹出的Toast提示来做下一步判断.这里记录一下获取Toast内容的方法,同时巩固一下显示等待的方法之一WebDriverWait. from selenium.web ...

  7. Java中public、private、protect对数据成员或成员函数的访问限制

    Java类中对数据成员.成员函数的访问限制修饰有:public.protect.private.friendly(包访问限制) public修饰的数据成员或成员函数是对所有用户开放的,所有用户可以直接 ...

  8. oracle存储过程批量插入测试数据

    前几天测试中债时,自定义资产有一级类型和二级类型,一级类型下有很多分类,每个分类下又有很多二级分类,而要做的是每种类型都要建立一个自定义资产,并做一笔交易,然后测试是否出值,于是写了一个存储过程批量插 ...

  9. luogu2038 [NOIp2014]无线网络发射器选址 (前缀和)

    貌似不用做前缀和也能过? #include<bits/stdc++.h> #define pa pair<int,int> #define CLR(a,x) memset(a, ...

  10. POJ 3436 ACM Computer Factory (网络流,最大流)

    POJ 3436 ACM Computer Factory (网络流,最大流) Description As you know, all the computers used for ACM cont ...