设计MapReduce程序

设计MapReduce程序

按照任务划分:只有map任务、map、reduce任务都有

map and reduce

数据ETL的过程

map阶段:分片处理,将一个大任务拆分

      -》数据过滤

      -》数据补全

比如:根据IP得到省市区信息

      -》字段格式化

对某个字段进行格式化

时间:

      dd/MM/yyyy:HH:mmss

timestamp

       1522233.123秒

       1522233123毫秒

标准格式:yyyy-MM-dd HH:mm:ss

域名处理:

      URL地址得到域名

reduce阶段:合并处理

合并

 

map

Sqoop本质就是一个MapReduce程序,但是只有Map任务

sql +hadoop

 

SecondaryNameNode

NameNode功能是干嘛

管理子节点

处理客户端发过来的请求

管理元数据

元数据在哪里???存放在哪里???

存储在HDFS??死循环

为了加快访问,元素在NameNode所在机器的内存上

内存读写速度快,可以加快请求

但是在内存中,不大安全,关机了怎么办

结论:

(1)存储在内存中,也存在磁盘中,也就是一个文件,这个文件的名称fsimage

(2)/opt/modules/hadoop-2.7.3/data/tmpData/dfs/name/current

 

nameNode启动过程

加载Fsimage中内容到内存中去,后续HDFS的变化(文件上传、修改、删除)在想办法进行同步

SecondaryNameNode功能

辅助nameNode同步本地元数据

fsimge(old) + edits = fsimage(new)

edits:该文件很重要,记录了HDFS的修改操作,不能丢失

可以通过edits日志文件信息,可以解析得到元数据

在合并的过程中,先合并到fs.temp文件,合并完成之后,修改名字为fsimage,删除fs.temp

 

shuffle过程

实现功能

分区:

决定当前key交由那个reduce进行处理

默认:按照Key的hash值 对 reduce 个数 取余

HashPartitioner

分组:

将相同的key进行合并

排序:

按照key对每一组keyvalue进行排序,字典排序

执行过程

map端shuffle

图片转自: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过来拉取数据

reduce端shuffle

图片转自: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>

 

 

shuffle过程的优化

combiner合并

在map阶段提前进行了一次合并,一般来讲等同于提前执行了reduce操作。

好处:可以降低reduce的压力,

在map阶段的进行合并是 并行的(分布式的)。

        job.setCombinerClass(WordCountReducer.class);

注意:并不是所有的程序都适合combiner:测试

设置combiner之和和之后的结果要一致,不能因为性能优化导致结果不对

A + (B +C)  =  (A+B) + C 

compress压缩

大大减少磁盘IO以及网络IO

MapReduce有很多地方都可以压缩

输入的就是一个压缩文件

map shuffle中合并成一个大文件,对该文件进行压缩,reduce过来取数据就是压缩之后的数据

reduce输出

Hadoop常见的压缩格式

检查本地库支持哪些压缩:

bin/hadoop checknative

修改压缩库,只需要替换native包即可

常用用的压缩格式

snappy,lzo,lz4

 

hadoop中设置压缩

输入:

一般不配置

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

猜你喜欢

转载自blog.csdn.net/qq_35315363/article/details/94762783