按照任务划分:只有map任务、map、reduce任务都有
数据ETL的过程
map阶段:分片处理,将一个大任务拆分
-》数据过滤
-》数据补全
比如:根据IP得到省市区信息
-》字段格式化
对某个字段进行格式化
时间:
dd/MM/yyyy:HH:mmss
timestamp
1522233.123秒
1522233123毫秒
标准格式:yyyy-MM-dd HH:mm:ss
域名处理:
URL地址得到域名
reduce阶段:合并处理
合并
Sqoop本质就是一个MapReduce程序,但是只有Map任务
sql +hadoop
管理子节点
处理客户端发过来的请求
管理元数据
元数据在哪里???存放在哪里???
存储在HDFS??死循环
为了加快访问,元素在NameNode所在机器的内存上
内存读写速度快,可以加快请求
但是在内存中,不大安全,关机了怎么办
结论:
(1)存储在内存中,也存在磁盘中,也就是一个文件,这个文件的名称fsimage
(2)/opt/modules/hadoop-2.7.3/data/tmpData/dfs/name/current
加载Fsimage中内容到内存中去,后续HDFS的变化(文件上传、修改、删除)在想办法进行同步
辅助nameNode同步本地元数据
fsimge(old) + edits = fsimage(new)
edits:该文件很重要,记录了HDFS的修改操作,不能丢失
可以通过edits日志文件信息,可以解析得到元数据
在合并的过程中,先合并到fs.temp文件,合并完成之后,修改名字为fsimage,删除fs.temp
分区:
决定当前key交由那个reduce进行处理
默认:按照Key的hash值 对 reduce 个数 取余
HashPartitioner
分组:
将相同的key进行合并
排序:
按照key对每一组keyvalue进行排序,字典排序
图片转自:https://blog.csdn.net/h1025372645/article/details/94757137
spill:溢写
每一个map处理之后结果进入 环形缓冲区(内存100M)
分区:对每一条keyvalue进行分区(打标签)
排序:将相同分区的数据进行分区内排序
当整个环形缓冲区达到阈值80%,开始溢写,将当分区排序之后的数据写入到磁盘中,变成file文件,最终生成很多个小文件。
merge:合并,将spill生成的多个小文件进行合并
file1: file2:
排序:将相同分区的数据进行排序
end_file
map task就结束了,通知app Master,AppMaster通知reduce过来拉取数据
图片转自:https://blog.csdn.net/h1025372645/article/details/94757137
map task1:
map task2
reduce启动多个线程通过 网络 到每台机器上去拉取属于自己分区的数据
merge:合并,将每个Map task的结果中拉取的数据进行合并,并且进行排序
排序:对整个属于我分区 数据进行排序
reduce1:
分组:对相同key的value进行合并
hive, <1,1,1,1>
spark,<1,1,1,1>
在map阶段提前进行了一次合并,一般来讲等同于提前执行了reduce操作。
好处:可以降低reduce的压力,
在map阶段的进行合并是 并行的(分布式的)。
job.setCombinerClass(WordCountReducer.class);
注意:并不是所有的程序都适合combiner:测试
设置combiner之和和之后的结果要一致,不能因为性能优化导致结果不对
A + (B +C) = (A+B) + C
大大减少磁盘IO以及网络IO
输入的就是一个压缩文件
map shuffle中合并成一个大文件,对该文件进行压缩,reduce过来取数据就是压缩之后的数据
reduce输出
检查本地库支持哪些压缩:
bin/hadoop checknative
修改压缩库,只需要替换native包即可
常用用的压缩格式
snappy,lzo,lz4
输入:
一般不配置
map的中间结果:
mapreduce.map.output.compress = true;
mapreduce.map.output.compress.codec=org.apache.hadoop.io.compress.Lz4Codec
压缩方式的寻找:DefaultCodec -》找打该类的目录-》其他压缩类和他在同一个目录下
reduce输出
mapreduce.output.fileoutputformat.compress = true;
mapreduce.output.fileoutputformat.compress.codec= org.apache.hadoop.io.compress.Lz4Codec
配置方式:
方式一:main方法中Configuration
Configuration configuration = new Configuration();
configuration.set("mapreduce.output.fileoutputformat.compress","true");
configuration.set("mapreduce.output.fileoutputformat.compress.codec",
"org.apache.hadoop.io.compress.Lz4Codec");
方式二:在配置文件中
全局修改,所有MapReduce都生效
方式三:运行的时候通过自定义配置
bin/yarn jar xxx.jar -DXX=yy -Daa=bb MianClass input_path output_Path
检查是否配置成功
8088 -》history -》Configuration-》查看对应配置参数
配置前:
配置后:
Map output materialized bytes