小白学数据,只为记录学习进程,对每个问题有新的理解会及时更正。
一、HIVE中常用的存储格式
1.Textfile存储格式
textfile是按行存储的方式,没有进行压缩,磁盘开销大,并且上传文件到HDFS是通过put方式
2.ORC存储格式
ORC是按行和按列结合的存储格式,若有1w条数据,ORC模式先把1w行的表拆分成100行一个的小表,再对每个小表进行按列存储。
create table test_orc
(
id int,
name string,
price float
)
row format delimited fields terminated by '\t'
stored as orc
3.Parquet存储格式
支持较好的查询,压缩,但是写入速度较慢
create table test_orc
(
id int,
name string,
price float
)
row format delimited fields terminated by '\t'
stored as parquet
占用内存从大到小:textfile > parquet > orc
sql读取速度: orc > parquet > textfile
二、mapreduce的运行流程
1.map端按照块的大小对数据进行拆分,默认一个块是128M,设分成了n个块
2.对每个拆分数据,启动一个MapTask任务,每个MapTask任务并发进行,互不干扰
3.每个MapTask任务把数据处理成一个个键值对,然后按照键值,把每个拆分后的数据分区,每个map有m个分区,这样便形成了n组分区好的数据,每组里面有m个分区
4.reduce阶段,每个reduce去拉不同map产生的相同分区的数据,产生m个reduce
5.每个reduce启动一个ReduceTask任务去处理这些数据,各个ReduceTask也是并发进行,互不干扰
6.将每个ReduceTask产生的数据合并输出
三、MapTask任务详解
1、Read(读取)阶段:默认使用TextInputFormat,读取切分好的数据,并将数据解析成键值对,输入到map阶段
2、Map阶段:根据业务逻辑重新计算键值对,形成新的键值对,并将数据输出到环形缓冲区
3、Collect(收集)阶段:将输入的键值对,执行分区排序,根据key,value和reduce的数量,来进行分区,再在区内排序,对key值按照字典顺序排序,排序方法:快排
4、溢写阶段:当环形缓冲区被占用了80%,这些数据会被溢写到磁盘中,不影响后续的数据进入环形缓冲区
5、Combine(合并)阶段:将多个溢出的文件进行合并排序,排序方法:归并排序
四、ReduceTask任务详解
当所有的Map任务结束后,开启Reduce任务
1、Copy(拷贝)阶段:Reduce端主动去拷贝Map端处理好的数据到ReduceTask本地磁盘,优先拷贝到内存中,当超出内存阈值,拷贝到磁盘中
2、Merge(合并)阶段:去内存和磁盘中的数据进行合并,防止内存使用过多,或者磁盘文件过多
3、Sort(排序)阶段:将MapTask按照key局部排序好的数据,对key再进行全局归并排序,使得相同key的数据聚集在一起,把相同的key对应的数据,输入给一个reduce
4、Reduce阶段:根据业务逻辑,处理这些数据,并使用TextOutputFormat方法,,输出数据
五、Shuffle机制详解
Shuffle机制用于将MapTask任务产生的文件,传输到ReduceTask,介于Map和Reduce之间
1、Collect(收集)阶段:将MapTask产生的数据输出到一个大小为100M的环形缓冲区
2、溢写阶段:当环形缓冲区占用超过80%时,处罚溢写,在溢写之前,会对数据进行分区排序
3、merge(合并)阶段:合并多次溢写出来的数据,采用归并排序
4、压缩阶段:把每个MapTask产生的数据进行压缩
5、Copy(拷贝)阶段:Reduce端拷贝压缩的数据到内存中,如果内存不够,拷贝到磁盘中
6、Merge(合并)阶段:把不同分区的数据进行合并,磁盘和磁盘合并,内存和内存合并
7、Sort(排序)阶段:在合并的同时进行排序操作,因为采用的是归并排序,最终形成一个分区对应一块数据