分布式计算:批处理引擎 MapReduce(第二部分)

第一:MapReduce Java高级编程

一:Grep问题(多个MR串行运行)

  1. 背景介绍
    一批TB或者PB量级的文档,需要完成以下功能:

    • 搜索符合某种规则(正则表达式(单词中包含字符a))的单词或者句子;
    • 统计相应的单词或者句子的数目;
    • 按照数目对其进行排序,并输出最终结果。
  2. 解决思路
    分为两个作业:

    • 作业一:wordCount
      统计符合条件的单词数目
    • 作业二:sort
      按照单词数目进行全排序,依赖于前一个作业的输出结果
  3. 编程代码
package com.dev4free.hadoop;

import java.io.IOException;
import java.util.StringTokenizer;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.SequenceFileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.SequenceFileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;



/**
 * 
 * @author syd
 *  - 搜索符合某种规则(正则表达式(单词中包含字符a))的单词或者句子;
 - 统计相应的单词或者句子的数目;
 - 按照数目对其进行排序,并输出最终结果。
 *
 */
public class MyWordCountSort {



     static Path tempDir = new Path("/mywordcountsort_temp");

    /**
     * wordCount的mapper阶段
     * @author syd
     *
     */
    public static class MyWordCountMapper extends Mapper<Object, Text, Text, LongWritable>{
        private static final LongWritable one = new LongWritable(1);
        private Text word = new Text();
        public void map(Object key, Text value,Context context) throws IOException,InterruptedException{
            StringTokenizer stringTokenizer = new StringTokenizer(value.toString());
            while (stringTokenizer.hasMoreTokens()) {
                word.set(stringTokenizer.nextToken());
                context.write(word, one);
            }
        }
    }


      /**
       * WordCount的Reducer阶段
       * @author syd
       *
       */
    public static class MyWordCountRedecer extends Reducer<Text, LongWritable, Text, LongWritable>{
        private LongWritable result = new LongWritable();
        public void reduce(Text key,Iterable<LongWritable> values,Context context) throws IOException,InterruptedException{
            long sum = 0;
            for (LongWritable value:values) {
                sum = sum + value.get();
            }
            result.set(sum);
            context.write(key, result);
        }
    }




    /**
     * MySort的mapper阶段处理
     * @author syd
     *
     */
    public static class MySortMapper extends Mapper<Text, LongWritable, LongWritable, Text>{
        public void map(Text key,LongWritable value,Context context) throws IOException,InterruptedException{
            context.write(value, key);
        }
    }





    public static void main(String[] args) throws Exception {



        /**
         * wordcount阶段
         */
        Configuration configuration = new Configuration();
        String[] otherArgs = new GenericOptionsParser(configuration,args).getRemainingArgs();
        if (otherArgs.length != 2) {
            System.out.println("error input");
            System.exit(2);
        }
        Job jobWordCounter = Job.getInstance(configuration,"MyWordCountSort-WordCount");
        jobWordCounter.setJarByClass(MyWordCountSort.class);
        jobWordCounter.setMapperClass(MyWordCountMapper.class);
        jobWordCounter.setReducerClass(MyWordCountRedecer.class);
        jobWordCounter.setOutputFormatClass(SequenceFileOutputFormat.class);
        jobWordCounter.setOutputKeyClass(Text.class);
        jobWordCounter.setOutputValueClass(LongWritable.class);
        FileInputFormat.addInputPath(jobWordCounter, new Path(otherArgs[0]));
        FileOutputFormat.setOutputPath(jobWordCounter, tempDir);
        jobWordCounter.waitForCompletion(true);



        /**
         * Sort阶段
         */
        Job jobSort = Job.getInstance(configuration,"MyWordCountSort-Sort");
        jobSort.setJarByClass(MyWordCountSort.class);
        jobSort.setMapperClass(MySortMapper.class);
        jobSort.setInputFormatClass(SequenceFileInputFormat.class);
        jobSort.setNumReduceTasks(1);
        FileInputFormat.addInputPath(jobSort, tempDir);
        FileOutputFormat.setOutputPath(jobSort, new Path(otherArgs[1]));
        jobSort.setSortComparatorClass(LongWritable.DecreasingComparator.class);
        System.exit(jobSort.waitForCompletion(true)?0:1);
    }


}
  1. 执行命令
[hadoop@hadoopa conf]$ hadoop jar /home/hadoop/hadoop-0.0.1-SNAPSHOT.jar com.dev4free.hadoop.MyWordCountSort /text1.txt /syd
  1. 实验结果

[hadoop@hadoopa test]$ hdfs dfs -cat /text1.txt
i love my country
my country is china
[hadoop@hadoopa test]$ hdfs dfs -cat /mywordcountsort_temp/part-r-00000
SEQorg.apache.hadoop.io.Text!org.apache.hadoop.io.LongWritable▒▒U▒▒\Oꗺ▒-▒^chincountry
i
love
    myPuTTYPuTTY[hadoop@hadoopa test]$ PuTTYPuTTY
-bash: PuTTYPuTTY: command not found
[hadoop@hadoopa test]$ hdfs dfs -cat /syd/part-r-00000
2       my
2       country
1       love
1       is
1       i
1       china
[hadoop@hadoopa test]$

二:编写Partitioner(暂略)
1. 背景介绍
2. 解决思路
3. 编程代码
4. 执行代码
5. 实验结果

第二:MapReduce 多语言编程

  1. Hadoop Streaming介绍
    • 与Linux管道机制一致
    • 通过标准输入输出实现进程间通信
    • 标准输入输出是任何语言都有的
  2. Hadoop Streaming与Java编程比较
    1. Java编程
      • Hadoop最原始开发语言
      • 支持所有功能,是其他编程语言的基础。
    2. Streaming编程
      • 仅用于开发Mapper和Reducer,其他组件需采用Java实现;
      • 天生支持文本格式,但二进制格式支持较弱;
      • 通常用于简单的文本数据处理,加快开发效率

第三:MapReduce调优小技巧

  1. 内存参数调优
  2. -Dmapreduce.map.memory.mb=5120
  3. -Dmapreduce.reduce.memory.mb=5120
  4. -Dmapreduce.map.java.opts=”-Xms4096m -Xmx4096m”
  5. -Dmapreduce.reduce.java.opts=”-Xms4096m -Xmx4096m”

  6. 容错参数

  7. mapreduce.map.maxattempts:map task重试次数,默认为4
  8. mapreduce.reduce.maxattempts:reduce task重试次数,默认为4
  9. mapreduce.map.failures.maxpercent:允许最大的map失败率默认为0
  10. mapreduce.reduce.failures.maxpercent:允许最大的reduce失败率默认为0
  11. 推测执行
  12. mapreduce.map.speculative
  13. mapreduce.reduce.speculative
  14. 调整作业的任务数目
  15. mapreduce.input.fileinputformat.split.minsize:每个map task处理的数据量(大于一个block块,以减少map task的任务数)

第四:项目实战

  1. 项目介绍

    • 原始数据:/flume/record/2017-03-10/2220/transaction_log.1489155600805。共有12列。
      现在将第4列(1489155672)转换成标准时间格式(2017-03-10 22:20:24),然后删除第11列和第12列。
    • 使用python编写的etl.py。通过Hadoop Streaming完成该数据清洗工作
  2. 项目编码

[hadoop@hadoopa test]$ cat /home/hadoop/etl.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys,time


def timestamp_datetime(value):
    format = '%Y-%m-%d %H:%M:%S'
    value = time.localtime(value)
    dt = time.strftime(format,value)
    return dt

# input comes from STDIN (standard input)
for line in sys.stdin:
    # remove leading and trailing whitespace
    columns = line.split(",");

    if len(columns) != 12:
        continue

    for i in range(len(columns)):
        columns[i] = columns[i].strip()

    columns[3]=timestamp_datetime(int(columns[3]))
    print columns[0]+","+columns[1]+","+columns[2]+","+columns[3]+","+columns[4]+","+columns[5]+","+columns[6]+","+columns[7]+","+columns[8]+","+columns[9]
  1. 运行命令

[hadoop@hadoopa ~]$ hadoop jar /home/hadoop/hadoop-2.7.3/share/hadoop/tools/lib/hadoop-streaming-2.7.3.jar -D mapred.reduce.tasks=0 -input /flume/record/2017-03-10/2220/transaction_log.1489155600805 -output /mapred/etl -mapper /home/hadoop/etl.py -file /home/hadoop/etl.py
  1. 运行结果

[hadoop@hadoopa ~]$ hdfs dfs -tail /flume/record/2017-03-10/2220/transaction_log.1489155600805
,5503894278515942,ZHONGTONG,217.90.43.20,xh
0000099993,00000080,00000533,1489155672,456,QingHai,GuiZhou,TAOBAO,4011118331878,SHENTONG,80.173.222.62,mhr
0000099994,00000451,00000349,1489155672,858,HuNan,YunNan,JUHUASUAN,869939198450453,EMS,230.67.36.151,pl
0000099995,00000234,00000122,1489155672,516,JiangSu,ZheJiang,JUHUASUAN,3528806766166620,SHENTONG,8.75.11.240,hu
0000099996,00000407,00000433,1489155672,579,FuJian,JiangXi,TIANMAOCHAOSHI,5259670539139763,SHUNFENG,185.39.72.37,pl
0000099997,00000703,00000626,1489155673,911,GuiZhou,ChongQing,TIANMAOCHAOSHI,372175703839365,EMS,133.87.61.178,fo
0000099998,00000160,00000790,1489155673,113,BeiJing,GuiZhou,TIANMAO,6011159707661458,EMS,119.92.119.128,nl
0000099999,00000049,00000675,1489155673,831,JiLin,JiLin,JUHUASUAN,210016971056835,EMS,61.107.157.41,bhb
0000100000,00000785,00000546,1489155673,175,JiLin,SiChuan,TIANMAO,4173227824100,YUNDA,140.128.83.70,ik
0000100001,00000078,00000609,1489155673,921,HeiLongJiang,ChongQing,TIANMAO,30324255590133,YUNDA,60.193.159.6,ko



[hadoop@hadoopa ~]$ hdfs dfs -tail /mapred/etl/part-00000
9771,00000603,00000434,2017-03-10 22:20:23,839,Aomen,QingHai,TIANMAOCHAOSHI,869996644225012,SHUNFENG
0000099772,00000497,00000718,2017-03-10 22:20:24,475,JiangXi,TianJin,TAOBAO,676262630509,YUNDA
0000099773,00000668,00000997,2017-03-10 22:20:24,717,ShanXi3,XiangGang,TIANMAO,639034920186,SHENTONG
0000099774,00000597,00000571,2017-03-10 22:20:24,965,XiangGang,GuiZhou,TIANMAO,630456160567,YUANTONG
0000099775,00000106,00000630,2017-03-10 22:20:24,262,XiangGang,HeiLongJiang,JUHUASUAN,30122789425358,YUNDA
0000099776,00000473,00000433,2017-03-10 22:20:24,186,XinJiang,AnHui,TIANMAOCHAOSHI,4638479668871500,EMS
0000099777,00000135,00000089,2017-03-10 22:20:24,249,TianJin,ChongQing,TAOBAO,30084958874818,SHENTONG
0000099778,00000737,00000471,2017-03-10 22:20:24,846,HuBei,ZheJiang,TIANMAO,060445261658,YUNDA
0000099779,00000343,00000563,2017-03-10 22:20:25,219,XiZang,Aomen,TIANMAOCHAOSHI,340317530427282,EMS
0000099780,00000963,00000319,2017-03-10 22:20:25,881,AnHui,FuJian,TIANMAOCHAOSHI,6011023388923241,SHENTONG
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
⼤数据--第⼀章⼤数据概述笔记分享 ⼤数据--第⼀章 ⼤数据概述笔记分享 ⼀、⼤数据时代 1.三次信息化浪潮 信息化浪潮 信息化浪潮 发⽣时间 发⽣时间 标志 标志 解决问题 解决问题 代表企业 代表企业 第⼀次浪潮 1980年前后 个⼈计算机 信息处理 Intel、AMD、IBM、苹果、微软、戴尔、惠普等 第⼆次浪潮 1995年前后 互联⽹ 信息传输 雅虎、⾕歌、阿⾥巴巴、百度、腾讯等 第三次浪潮 2010年前后 物联⽹、云计算、⼤数据 信息爆炸 将涌现出⼀批新的市场标杆企业 2.第三次信息化浪潮的⽀持 技术⽀撑 § 存储:存储设备容量不断增加 § 计算:CPU处理能⼒⼤幅度提升 § ⽹络:⽹络带宽不断增加 数据产⽣⽅式发⽣变化 3.数据产⽣⽅式的变⾰促成⼤数据时代的来临 运营式系统阶段——数据产⽣⽅式是被动的 ⽤户原创内容阶段——数据产⽣⽅式是主动的 感知式系统阶段——⼤数据的产⽣(物联⽹、云计算和⼤数据) 物联⽹底层是感知层,如:摄像头、传感器、⼀卡通 4.⼤数据发展的三个阶段 萌芽期 成熟期 ⼤规模应⽤期 ⼆、⼤数据概念 4V特性: § 数据量⼤(Volume) § 处理速度快(Velocity) § 数据类型繁多(Variety) § 价值密度低(value) 三、⼤数据的影响 1、图灵获奖者、著名数据库专家Jim Gray博⼠观察并总结⼈类⾃古以来,在科学研究上,先后历经了实验、理论、计算和数据四种范式。 2、在思维⽅式⽅⾯,⼤数据完全颠覆了传统的思维⽅式: § 全样⽽⾮抽象 § 效率⽽⾮精确 § 相关⽽⾮因果 四、⼤数据的应⽤ 1、⼤数据⽆处不在 2、典型的⼤数据应⽤实例 1.影视剧拍摄 2.⾕歌流感趋势 五、⼤数据的关键技术 1、⼤数据的关键技术 2、⼤数据的两⼤核⼼技术 数据的存储和数据的处理 3、两⼤核⼼技术 数据的存储 数据的存储 分布式存储 分布式存储 GFS\HDFS 、Big Table\Hbase、NoSQL、NewSQL GFS\HDFS 、Big Table\Hbase、NoSQL、NewSQL 数据的处理 分布式处理 MapReduce 六、⼤数据计算模式 1、MapReuce是基于磁盘的离线计算,需要进⾏批处理,不能满⾜实时需求,它是⼀批⼀批处理的,不能实现秒级响应。Spark是基于内存的迭代计算,Spark 处理速度⽐MapReuce快。 2、批处理是对数据批量处理,流计算是实时计算。 3、图计算针对⼤规模图结构数据的处理。 4、查询分析计算是⼤规模数据的存储管理和查询分析。 七、⼤数据与云计算、物联⽹的关系 1、⼤数据、云计算和物联⽹代表了IT领域最新的计算发展趋势,三者相辅相成,既有联系⼜有区别。 2、云计算 云计算概念:云计算实现了通过⽹络与服务的⽅式为⽤户提供可伸缩的、廉价的分布式计算能⼒,⽤户只需要在具备⽹络接⼊条件的地⽅,就可以随时随地 获得所需的各种廉价的IT资源。 云计算关键技术:虚拟化、分布式存储、分布式计算、多租户等。 云计算数据中⼼是云计算的重要载体,为云计算提供计算、存储、带宽等各种硬件资源,为各种平台和应⽤提供运⾏⽀撑环境。 3、物联⽹ 物联⽹是物物相连的互联⽹,是互联⽹的延伸,它利⽤局部⽹络或互联⽹等通信技术把传感器、控制器、机器、⼈员和物等通过新的⽅式联在⼀起,形成⼈ 与物、物与物相联,实现信息化和远程管理控制。 应⽤层:包括很多应⽤,⽐如智能交通 处理层:包括各种数据处理的应⽤,将数据处理好后传给上⼀层 ⽹络层:在物联⽹中起到数据传输的作⽤ 感知层:物联⽹的最底层 物联⽹应⽤举例——智能交通 物联⽹关键技术 物联⽹中的关键技术包括识别和感知技术(⼆维码、RFID芯⽚、传感器等)、⽹络与通信技术、数据挖掘与融合技术等。 物联⽹应⽤ 物联⽹已经⼴泛应⽤于智能交通、智慧医疗、智能家居等领域。 4、云计算、⼤数据、物联⽹三者的关系,既有区别⼜有联系

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值