热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

从wordcount开始mapreduce(C++\hadoopstreaming模式)

序:终于开始接触hadoop了,从wordcount开始1.采用hadoopstreamming模式优点:支持C++pathonshell等多种语言,学习成本较低,不需要了解had

序:终于开始接触hadoop了,从wordcount开始

1. 采用hadoop streamming模式

 优点:支持C++ pathon shell 等多种语言,学习成本较低,不需要了解hadoop内部结构

 调试方便:cat input | ./map | sort | ./reduce > output

 hadoop 就是提供了一个分布式平台实现了上述脚本的功能,这是一次mapreduce的过程

 一个例子:

 1 #!/bin/bash
 2 source build.env
 3 $hadoop_bin fs -rmr $env_root    
 4 $hadoop_bin fs -mkdir $env_root 
 5 $hadoop_bin fs -copyFromLocal ./txt  $env_root/txt
 6 $hadoop_bin streaming \
 7         -jobconf mapred.job.name="word count fuck you man~!" \
 8         -input  $env_root/txt \       //map程序的输入:cat input | ./map
 9         -output $env_root/outputxt \  //reduce程序的输出 : ./reduce > output
10         -mapper "./wordcount_map"\
11         -reducer "./wordcount_reducer"\
12         -file    ./wordcount_map\
13         -file    ./wordcount_reducer\
14         -jobconf mapred.job.map.capacity=1000 \
15         -jobconf mapred.job.reduce.capacity=1000 \
16         -jobconf mapred.child.ulimit=20000000 \
17         -jobconf mapred.job.queue.name=ns-webgis \
18         -jobconf mapred.job.priority=HIGH \
19         -jobconf mapred.map.tasks.speculative.execution=false \
20         -jobconf mapred.map.tasks=10 \
21         -jobconf mapred.reduce.tasks=2 
22 if [ $? -ne 0 ]
23 then
24     echo "error~~~~" >&2
25     exit -1
26 fi
27 $hadoop_bin fs -get $env_root/outputxt .

2. map :cat input | ./map >> temp

   1)hadoop平台做了什么:

   a.切分文件:把input文件按照一定的策略切割分成若干个小文件

   b.将若干个小文件分别分发到不同节点上

   c. 每个节点上都有一个map程序,然后将任务分发到不同的节点上

   2)自己要写的wordcount_map要做什么:

   wordcount_map从input中按行进行读取,然后按照业务逻辑将读取到的内容拼成 key \t value的形式  ,这个输出将会作为reduce程序的输入

   在这里输出的是 word 1  此处 word是key  1是value

   注意:此处是标准输出、输入 std::cout std::cin  in C++

   key与value之间用\t分割,第一个\t之前的值作为key,之后的都作为value 注意:这个key会被hadoop平台用到 平台不关注value值

 1 #include
 2 #include<string>
 3 #include
 4 using namespace std;
 5 void split(string src,vector<string>& dest,string separator)
 6 {
 7    string str = src;
 8    string substring;
 9    string::size_type start = 0, index;
10 
11    do
12    {
13        index = str.find_first_of(separator,start);
14        if (index != string::npos)
15        {    
16          substring = str.substr(start,index-start);
17          dest.push_back(substring);
18          start = str.find_first_not_of(separator,index);
19          if (start == string::npos) return;                                                                         }    
20    }while(index != string::npos);
21    substring = str.substr(start);
22    dest.push_back(substring);
23 }
24 void map()
25 {
26     string line;
27     vector<string> vec(2);
28     while(cin>>line)
29     {
30         vec.clear();
31         split(line,vec," ");
32         vector<string>::iterator it=vec.begin();
33         for(;it!=vec.end();++it)
34         {
35             cout<<*it<<"\t"<<"1"<<"\t"<<"fuck"<<endl;
36         }
37     }
38 }
39 int main()
40 {
41     map();
42 }
wordcount_map

   3. reduce: sort  |  ./reduce > output

   等到所有的map任务都结束:

   1)hadoop平台做了这些事情

        a.将所有的map程序的输出结果中key相同的key value pair 放到相同的节点上,这点很重要,这是保证最终输出结果正确的保证,后面会按照key进行hash , 并且相同                 key之间不会有其他的key,其实是按照key值做了一个排序

          注意:相同的key一定在一个节点上,但是一个节点上不止有一个个key

        b 然后在各个节点上开始reduce任务

   2)自己写的wordcount_map做了什么

        a. 读取这些具有相同key的键值对,处理自己的业务逻辑,此处就是将统计相同的key值的键值对一共出现了几次,然后将结果输出,此处也是标准输入和标准输出

        

#include
#include
#include<string>
#include
using namespace std;
void reduce()
{
    string key;
    string value;
    string value1;
    //vector vec(2);
    map<string,int> mapTemp;
    while(cin>>key>>value>>value1)
    {        
        if(mapTemp.find(key)!=mapTemp.end())
            mapTemp[key]+=1;
        else
            mapTemp[key]=1;
    }
    map<string,int>::iterator it = mapTemp.begin();
    for(;it!=mapTemp.end();++it)
    {
        cout<first<<"\t"<second<<endl;
    }
}
int main()
{
    reduce();
}
wordcount_reduce

    

          

 

 

 


推荐阅读
  • 在Linux系统中,网络配置是至关重要的任务之一。本文详细解析了Firewalld和Netfilter机制,并探讨了iptables的应用。通过使用`ip addr show`命令来查看网卡IP地址(需要安装`iproute`包),当网卡未分配IP地址或处于关闭状态时,可以通过`ip link set`命令进行配置和激活。此外,文章还介绍了如何利用Firewalld和iptables实现网络流量控制和安全策略管理,为系统管理员提供了实用的操作指南。 ... [详细]
  • 手指触控|Android电容屏幕驱动调试指南
    手指触控|Android电容屏幕驱动调试指南 ... [详细]
  • 在处理大规模数据数组时,优化分页组件对于提高页面加载速度和用户体验至关重要。本文探讨了如何通过高效的分页策略,减少数据渲染的负担,提升应用性能。具体方法包括懒加载、虚拟滚动和数据预取等技术,这些技术能够显著降低内存占用和提升响应速度。通过实际案例分析,展示了这些优化措施的有效性和可行性。 ... [详细]
  • ### 优化后的摘要本文对 HDU ACM 1073 题目进行了详细解析,该题属于基础字符串处理范畴。通过分析题目要求,我们可以发现这是一道较为简单的题目。代码实现中使用了 C++ 语言,并定义了一个常量 `N` 用于字符串长度的限制。主要操作包括字符串的输入、处理和输出,具体步骤涉及字符数组的初始化和字符串的逆序操作。通过对该题目的深入探讨,读者可以更好地理解字符串处理的基本方法和技巧。 ... [详细]
  • 在对WordPress Duplicator插件0.4.4版本的安全评估中,发现其存在跨站脚本(XSS)攻击漏洞。此漏洞可能被利用进行恶意操作,建议用户及时更新至最新版本以确保系统安全。测试方法仅限于安全研究和教学目的,使用时需自行承担风险。漏洞编号:HTB23162。 ... [详细]
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
  • 本文详细介绍了定时器输入捕捉技术的原理及其应用。通过配置定时器通道的引脚模式为输入模式,并设置相应的捕获触发条件,可以实现对外部信号的精确捕捉。该技术在实时控制系统中具有广泛的应用,如电机控制、频率测量等场景。文中还提供了具体的配置步骤和示例代码,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 2018 HDU 多校联合第五场 G题:Glad You Game(线段树优化解法)
    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6356在《Glad You Game》中,Steve 面临一个复杂的区间操作问题。该题可以通过线段树进行高效优化。具体来说,线段树能够快速处理区间更新和查询操作,从而大大提高了算法的效率。本文详细介绍了线段树的构建和维护方法,并给出了具体的代码实现,帮助读者更好地理解和应用这一数据结构。 ... [详细]
  • 经过两天的努力,终于成功解决了半平面交模板题POJ3335的问题。原来是在`OnLeft`函数中漏掉了关键的等于号。通过这次训练,不仅加深了对半平面交算法的理解,还提升了调试和代码实现的能力。未来将继续深入研究计算几何的其他核心问题,进一步巩固和拓展相关知识。 ... [详细]
  • 洛谷 P4035 [JSOI2008] 球形空间生成器(高斯消元法 / 模拟退火算法)
    本文介绍了洛谷 P4035 [JSOI2008] 球形空间生成器问题的解决方案,主要使用了高斯消元法和模拟退火算法。通过这两种方法,可以高效地求解多维空间中的球心位置。文章提供了详细的算法模板和实现代码,适用于 ACM 竞赛和其他相关应用场景。数据范围限制在 10 以内,确保了算法的高效性和准确性。 ... [详细]
  • 如何利用Java 5 Executor框架高效构建和管理线程池
    Java 5 引入了 Executor 框架,为开发人员提供了一种高效管理和构建线程池的方法。该框架通过将任务提交与任务执行分离,简化了多线程编程的复杂性。利用 Executor 框架,开发人员可以更灵活地控制线程的创建、分配和管理,从而提高服务器端应用的性能和响应能力。此外,该框架还提供了多种线程池实现,如固定线程池、缓存线程池和单线程池,以适应不同的应用场景和需求。 ... [详细]
  • 在洛谷 P1344 的坏牛奶追踪问题中,第一问要求计算最小割,而第二问则需要找到割边数量最少的最小割。通过为每条边附加一个单位权值,可以在求解最小割时优先选择边数较少的方案,从而同时解决两个问题。这种策略不仅简化了问题的求解过程,还确保了结果的最优性。 ... [详细]
  • 本文探讨了 Kafka 集群的高效部署与优化策略。首先介绍了 Kafka 的下载与安装步骤,包括从官方网站获取最新版本的压缩包并进行解压。随后详细讨论了集群配置的最佳实践,涵盖节点选择、网络优化和性能调优等方面,旨在提升系统的稳定性和处理能力。此外,还提供了常见的故障排查方法和监控方案,帮助运维人员更好地管理和维护 Kafka 集群。 ... [详细]
  • 寒假作业解析:第三周 2月12日 第7题
    尽快完成之前的练习任务!每日一练2.1 Problem A Laurenty and Shop 的题目要求是选择两条不同的路线以最小化总的等待时间。简要分析:通过对比不同路线的等待时间,可以找到最优解。此问题可以通过动态规划或贪心算法来解决,具体取决于路线的复杂性和约束条件。 ... [详细]
  • 在解决区间相关问题时,我发现自己经常缺乏有效的思维方式,即使是简单的题目也常常需要很长时间才能找到解题思路,而一旦得到提示便能迅速理解。题目要求对一个包含n个元素的数组进行操作,并给出一个参数k,具体任务是…… ... [详细]
author-avatar
邵子轩一号
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有