• Hadoop之MapReduce分布式计算


    简单介绍一下项目背景——很简单,作死去接下老师的活,然后一干就是半个月,一直忙着从零基础到使用Hadoop中的MapReduce来解决一个实际问题,也就是用来计算一个数据量较大的二度朋友关系。

    那么首先是我的上一篇博文:Hadoop之初体验

    上一篇博文是将所有的准备前的环境搭建起来了,接下来就HDFS的一些基本的命令操作,那么这些命令如果是想要使用Hadoop的话,那么你就应当熟练的使用(类似于Linux中的命令,那么使用时稍微参考一下,时间不长就能够熟悉)

    下边开始介绍MapReduce。

    为了介绍MapReduce,我在这里提出来三个问题

    问题一:如何统计一个字符串中出现的所有的小写字母出现的次数?

    问题二:如何统计一个文件中所有单词出现的次数?

    问题三:如何统计多个文件中所有单词出现的一个次数?

    好的面对问题一我设计了一个c语言的程序代码,同时将其运行结果展示出来

     1 #include <iostream>
     2 #include <stdlib.h>
     3 #include <string>
     4 #include <string.h>
     5 
     6 #define MAX_LENGH 100
     7 using namespace std;
     8 char str[MAX_LENGH];
     9 int count[26];
    10 int main()
    11 {
    12     for(int i = 0;i < MAX_LENGH;i++){
    13 
    14         str[i] = (char)('a' + rand()%26);
    15         cout<<str[i];
    16     }
    17     str[MAX_LENGH] = '
    ';
    18     cout<<str<<endl<<"下面开始匹配"<<endl;
    19     ///将结果初始化
    20     for(int i = 0;i < 26;i++)count[i] = 0;
    21     for(int i = 0;str[i]!='
    ';i++){
    22         count[str[i] - 'a']++;
    23     }
    24     cout<<"Every char and it's time(s):"<<endl;
    25     for(int i = 0;i < 26;i++){
    26         cout<<(char)('a'+i)<<" : "<<count[i]<<endl;
    27     }
    28     return 0;
    29 }
    phqghumeaylnlfdxfircvscxggbwkfnqduxwfnfozvsrtkjprepggxrpnrvystmwcysyycqpevikeffm
    znimkkasvwsrenzkycxfphqghumeaylnlfdxfircvscxggbwkfnqduxwfnfozvsrtkjprepggxrpnrvy
    stmwcysyycqpevikeffmznimkkasvwsrenzkycxf
    
    下面开始匹配
    Every char and it's time(s):
    a : 2
    b : 1
    c : 5
    d : 2
    e : 5
    f : 8
    g : 5
    h : 2
    i : 3
    j : 1
    k : 6
    l : 2
    m : 4
    n : 6
    o : 1
    p : 5
    q : 3
    r : 6
    s : 6
    t : 2
    u : 2
    v : 5
    w : 4
    x : 5
    y : 6
    z : 3
    
    Process returned 0 (0x0)   execution time : 0.149 s
    Press any key to continue.

    可以看到,代码的一个关键之处就将ascii对应的小写字母和数组的下标进行了一个简单的映射,最后使得统计起来极为方便,只要通过数组下标来访问就可以成功了。

    关键代码:

    for(int i = 0;str[i]!=' ';i++){ count[str[i] - 'a']++; } cout<<"Every char and it's time(s):"<<endl; for(int i = 0;i < 26;i++){ cout<<(char)('a'+i)<<" : "<<count[i]<<endl; }

    好的,我们接着处理问题二:

    如何统计一个文件中的所有单词的一个数量。

    如何统计呢?我们就会设想,能不能像上一个问题的处理方式一样,也直接使用下标的方式来访问,然后每次对应一个就加一?显然不行,在我们的语法中没有这种形式???有的,在C++中或者在Java中,我们可以使用一个map容器,其中有一个键值对,也就是说来保存一个key和一个value的键值对,最后如同上一题一样将问题处理好

    第三问:如何面对同一个问题,我们对多个文件进行处理呢?

    在这里我就不提出一个很好的答案了,因为我自己也不知道。我只能给大家一些馊主意,比如说,多次运行上一个程序,一个个的访问文件,将文件中的所有的单词都统计完。或者呢,将所有的文件拼成一个文件,最后再对这个文件进行访问。

    好的问题提出来了,然后也给解决了,那么现在就来提出我们一个MapReduce的背景

    大计算量,然后短时间计算出结果,同时可以处理一些复杂的问题。

    下边我将会从概念,实现步骤和简单的实例对其进行介绍

    概念

    不想说太多,网上随便找找就有非常多的案例

    MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算。概念"Map(映射)""Reduce(归约)",是它们的主要思想,都是从函数式编程语言里借来的,还有从矢量编程语言里借来的特性。它极大地方便了编程人员在不会分布式并行编程的情况下,将自己的程序运行在分布式系统上。 当前的软件实现是指定一个Map(映射)函数,用来把一组键值对映射成一组新的键值对,指定并发的Reduce(归约)函数,用来保证所有映射的键值对中的每一个共享相同的键组。

    那么这里我要推荐两个东西,第一个是相对比较生活化的介绍MapReduce,也就是《给老婆讲讲什么是MapReduce》,好像挺火的一篇博问,随便百度一下就能找到

    然后第二个就是谷歌,为啥提谷歌呢,毕竟是MapReduce的爸爸吧,谷歌的三篇论文中有一个就是专门讲解MapReduce的

    好的,我来说一下实现步骤

    这里我上传一些图片供大家参考

    这张图片要注意的就是一个控制的命令流,还有一个就是数据流,两个流的一个流向

    这张图片是MapReduce的一个简单案例,wordcount的实现原理

    第一步:程序将数据拆分成splits,由于测试用的数据较小,所以每个文件就是一个split,并将文件拆分成<key,value>键值对,这里的key是包括回车在内的字符数的偏移量,value的值为一行文字。 第二步:将分割好的<key,value>键值对交由map()方法进行处理,生成新的键值对<'',1>(其中的''表示的是一个单词) 第三步:得到map()方法输出的<world,1>对,Mapper会将他们按照key值进行排序,并执行Combine过程,将key值相同的value值进行相加,得到Mapper的最终结果 第四步:Reduce先对从Mapper接收的数据进行排序,再交由用户自定义的reduce方法按照相同的键值把数形成累加,新成新的键值对

    Shuffle过程优化
        Map端的shuffle优化
        Reduce端的shuffle优化
    任务执行
        推测执行
        任务jvm重用
        跳过坏的记录
        任务执行的信息
    故障处理
        任务失败(分为map或reduce任务失败及子进程jvm突然退出)
        TaskTracker失败
        JobTracker失败
        任务失败重试的处理方法
    作业调度
        先进先出调度器
        能力调度器
        公平调度器
    MapReduce编程接口
    MapReducer编程开发

    好的,最后介绍一个具体的数据操作

    第一步是我们的wordcount

    那么首先我们是使用在Hadoop中的一个默认的一个example中的jar包进行wordcount实验

    [root@master wordcount_in]# cat *
    hello
    world
    hello hadoop
    hello nice to meet you
    my name is zhangjie
    以上步骤均为准备输入数据文件

    好的,今天先写到这里,后期有时间我将简单为大家介绍一下我那个二度人脉的统计项目

    我要坚持一年,一年后的成功才是我想要的。
  • 相关阅读:
    机器学习笔记—Logistic回归
    Python 数据处理----对定长数据的处理
    python从Microsoft Excel文件中导入数据
    python 处理CSV数据
    Android学习(十八)Toast的使用
    Android Studio 快捷键(转)
    Android学习(十六) 通过GestureOverlayView进行手势识别
    Android学习(十七)自定义View控件 TopBar
    Android学习(十六) 通过GestureDetector进行手势识别
    Android学习(十五) 系统服务
  • 原文地址:https://www.cnblogs.com/tianxia2s/p/5546368.html
Copyright © 2020-2023  润新知