ETL:是Extract-Transform-Load的缩写,用来描述将数据从来源端经过 抽取(Extract)、转换(Transform)、加载(Load) 至目的端的过程。
ETL较常用于数据仓库,但其对象并不限于数据仓库。
在运行核心业务MapReduce之前,往往需要先对数据进行清洗,清理掉不符合用户要求的数据。清理的过程往往只需要运行Mapper程序,而不需要运行Reducer程序。
例如,我们需要对文本文件中,过滤掉字段数量不足的数据行。
可以在Mapper中获取一行数据,split切割后判断字段数量是否满足要求,不满足要求就不再交给context。
因为这些步骤都在Mapper中,所以我们可以设置ReduceTask数量为0。
常见的匹配规则:
[\u4e00-\u9fa5][a-zA-Z][0-9]^[\u4e00-\u9fa5_a-zA-Z0-9]+$^[\u4e00-\u9fa5_a-zA-Z0-9]{4,10}(?!_)(?!.?_$)[a-zA-Z0-9_\u4e00-\u9fa5]+^[a-zA-Z_\u4e00-\u9fa5]^\w+$^[\u4e00-\u9fa5]{1,7}$|^[\dA-Aa-z_]{1,14}$[^x00-xff]ns*r^s*|s*$String str = ""; // 要判断的字符串
String reg = ""; // 正则表达式
if(str.matches(reg)) {
// .....
}
优点:减少磁盘IO、减少占用的磁盘存储空间
缺点:增加CPU开销。
原则:
压缩算法对比:
| 压缩格式 | Hadoop自带 | 算法 | 文件扩展名 | 是否可切片 | 转成压缩后,是否需要修改原始程序 |
|---|---|---|---|---|---|
| DEFLATE | 是,可以直接使用 | DEFLATE | .deflate | 否 | 和文本处理一样,不需要修改程序 |
| Gzip | 是,可以直接使用 | DEFLATE | .gz | 否 | 和文本处理一样,不需要修改程序 |
| bzip2 | 是,可以直接使用 | bzip2 | .bz2 | 是 | 和文本处理一样,不需要修改程序 |
| LZO | 否,需要安装 | LZO | .lzo | 是 | 需要建索引,还需要指定输入格式 |
| Snappy | 是,可以直接使用 | Snappy | .snappy | 否 | 和文本处理一样,不需要修改程序 |
LZO的压缩率不如Gzip、biz2,但是压缩速度、解压速度非常快。支持split切片,但是切片需要额外创建索引。
Gzip压缩率 比较高,压缩/解压速度一般般。
bzip2压缩率非常高,可以将一个大文件压缩成一个很小的文件,但是压缩速度、解压速度非常缓慢。支持split切片
Snappy设计的目的也不是为了高压缩率,而是为了非常快的速度和合理的压缩。在 64位i7 处理器环境,snappy的压缩速度可以达到每秒250Mb,解压速度每秒500Mb。
Snappy是谷歌开源的,在谷歌内部被广泛用于 BigTable、MapReduce等内部 RPC 系统。
压缩可以在MapReduce作用的任意阶段启动,一般分为:

为了支持多种压缩/解压格式,Hadoop引入了编码/解码器:
| 压缩格式 | 对应的编码/解码器 |
|---|---|
| deflate | org.apache.hadoop.io.compress.DefaultCodec或者:org.apache.hadoop.io.compress.DeflateCodec |
| gzip | org.apache.hadoop.io.compress.GzipCodec |
| bzip2 | org.apache.hadoop.io.compress.BZip2Codec |
| LZ4 | org.apache.hadoop.io.compress.Lz4Codec |
| zstd | org.apache.hadoop.io.compress.ZStandardCodec |
| LZO | com.hadoop.compression.lzo.LzopCodec |
开启压缩需要配置相关的参数:
| 配置文件 | 参数 | 默认值 | 压缩阶段 | 建议 |
|---|---|---|---|---|
| core-site.xml | io.compression.codecs | 无需要使用命令 hadoop checknative查看支持的本地库压缩方式 | 输入阶段 | Hadoop使用文件扩展名判断是否支110持某种编码/解码器 |
| mapred-site.xml | mapreduce.map.output.compress | false | mapper输出 | 这个参数设置为true启动压缩 |
| mapred-site.xml | mapreduce.map.output.compress.codec | org.apache.hadoop.io.compress.DefaultCodec | mapper输出 | 企业中多使用 LZO 或者 Snappy 编码/解码器在此阶段压缩数据 |
| mapred-site.xml | mapreduce.output.fileoutputformat.compress | false | reducer输出 | 这个参数设置为true启用压缩 |
| mapred-site.xml | mapreduce.output.fileoutputformat.compress.codec | org.apache.hadoop.io.compress.DefaultCodec | reducer输出 | 使用标准工具或者编码/解码器,例如gzip/biz2 |
也可以在 Java 程序中,对某个MapReduce开启压缩:(即:不在xml中配置,而是在configuration对象中添加配置信息)
// 开启mappper端输出压缩
configuration.setBoolean("mapreduce.map.output.compress", true);
// 设置mappper输出的压缩方式
configuration.setClass("mapreduce.map.output.compress.codec", BZip2Codec.class, CompressionCodec.class);
// 也可以通过FileOutputFormat工具进行配置,(实际上也是对configuration对象添加了配置项)
// 设置reduce端输出压缩开启
FileOutputFormat.setCompressOutput(job, true);
// 设置压缩的方式
FileOutputFormat.setOutputCompressorClass(job, BZip2Codec.class);