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

MapReduceJoin案例、ETL、压缩简介

Join案例MapReduce里的join跟SQL很类似,本质上还是联表查询,即我们最终需要的信息存储在两张表里,两张表有一个相同的字段

Join案例

MapReduce里的join跟SQL很类似,本质上还是联表查询,即我们最终需要的信息存储在两张表里,两张表有一个相同的字段,从而可以关联起来。MapReduce里的join动作可以再Reduce端做也可以在Map端做,数据量大时则最好在Map阶段做。

先看需求:有一个订单表和一个商品表,订单表里只有商品id,没有商品名称,商品名称在商品表里,现在需要将订单表里的商品id替换为商品名称显示出来。

 如果是在Reduce端做join操作,最好定义一个TableBean(名称随意,随便取,只要实现Writable接口即可),Map阶段的输出的key就是商品id(通过商品id将两张表关联起来),输出的value就是这个TableBean。在map阶段也要区分好每次读取的内容来自哪个文件,可以通过setup的方法来完成,setup方法会针对每个分片执行一次,因此可以获取源文件路径:

FileSplit fileSplit = (FileSplit) context.getInputSplit();
String fileName = fileSplit.getPath().getName();

然后在map方法中,根据fileName(可定义为类的私有变量)来判断读的是订单表还是商品表,如果是订单表,设置这个TableBean的订单id、商品id、数量信息,并且把标志位记为订单,如果是商品表,设置这个TableBean的商品id、商品名称,并且把标志位记为商品。然后相同key(即相同商品id)的TableBean会进入到同一个reduce,此时只要将商品TableBean的商品名称设给订单TableBean即可,直接输出。

这种在reduce阶段进行join的操作可能会给reduce带来很大的压力,因此推荐在map阶段就进行join。因为商品表数据不会很多,所以考虑把商品表缓存起来,在job提交阶段,设置缓存文件为商品表:

job.addCacheFile(new URI("xxx"));

同时也要设置ReduceTask数量为0:

job.setNumReduceTasks(0);

在setup方法中获取缓存文件并读取:

URI[] cacheFiles = context.getCacheFiles();
FsDataInputStream fis = FileSystem.get(context.getConfiguration()).open(new Path(cacheFiles[0]))
BufferedReader reader = new BufferedReader(new InputStreamReader(fis, "UTF-8"));
String line;
while(StringUtils.isNotEmpty(line = reader.readLine())) {
String[] fields = line.split("\t");
map.put(fields[0], fields[1]);
}
IOUtils.closeStream(reader);

ETL

ETL,即Extract Transform Load,描述数据从抽取(Extract)、转换(Transform)、加载(Load)到目的端的过程,这期间往往需要数据清洗,即清理掉不需要的数据。数据清洗一般只需要允许map程序,不需要允许reduce程序,一般配合正则表达式使用。


数据压缩

在map阶段的输入、输出(即reduce阶段的输入)、reduce阶段的输出,文件格式通常为压缩文件,这样可以节省磁盘空间、减少IO,但是也增加了CPU的开销,这种利弊需要在具体项目中进行权衡。常见的压缩算法对比:

 这些算法的压缩性能比较:

可以看出,snappy压缩/解压速度最快,但是压缩率不高,bzip2压缩率最高,但是速度最慢。压缩算法的选择可以参考下图:

要想在hadoop中开启压缩,需要配置如下参数:

 

例如,在map端输出开启压缩:

conf.setBoolean("mapreduce.map.output.compress", true);
conf.setClass("mapreduce.map.output.compress.codec", BZip2Codec.class, CompressionCodec.class);

这个设置之后可能没效果,因为这只是map的输出压缩格式,reduce端会自动解压,修改reduce输出端的压缩格式才会看到输出的是压缩文件:

FileOutputFormat.setCompressOutput(job, true);
FileOutputFormat.setOutputCompressorClass(job, BZip2Codec.class);
FileOutputFormat.setOutputCompressorClass(job, GzipCodec.class);
FileOutputFormat.setOutputCompressorClass(job, DefaultCodec.class);

Snappy的压缩格式需要结合Linux8使用,如果在windows环境会报错。


推荐阅读
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • Todayatworksomeonetriedtoconvincemethat:今天在工作中有人试图说服我:{$obj->getTableInfo()}isfine ... [详细]
  • 本文介绍了在Android开发中使用软引用和弱引用的应用。如果一个对象只具有软引用,那么只有在内存不够的情况下才会被回收,可以用来实现内存敏感的高速缓存;而如果一个对象只具有弱引用,不管内存是否足够,都会被垃圾回收器回收。软引用和弱引用还可以与引用队列联合使用,当被引用的对象被回收时,会将引用加入到关联的引用队列中。软引用和弱引用的根本区别在于生命周期的长短,弱引用的对象可能随时被回收,而软引用的对象只有在内存不够时才会被回收。 ... [详细]
  • Spring框架《一》简介
    Spring框架《一》1.Spring概述1.1简介1.2Spring模板二、IOC容器和Bean1.IOC和DI简介2.三种通过类型获取bean3.给bean的属性赋值3.1依赖 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
author-avatar
手机用户2502889731
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有