16_hadoop_reduce
Posted 走多远才算远
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了16_hadoop_reduce相关的知识,希望对你有一定的参考价值。
16_hadoop
问题:
3.Map task 个数由什么东西决定的? 切片的数量决定的
4.Reduce task 个数由什么东西决定的?
5.什么是shuffle? ok
1.部署mr app
官网:
hadoop.apache.org
源码在github管理
https://github.com/apache/hadoop
https://github.com/apache/project
服务器上运行jar文件:
[hadoop@bigdata32 wc]$ hadoop jar
Usage: hadoop jar <jar> [mainClass] args...
临时测试:
hadoop jar /home/hadoop/project/wc/wc.jar com.bigdata.mapreduce.WCAPP \\
/wc/input /wc/output
shell脚本:
if [ $# -lt 2 ];then
echo "Usage: WCAPP <in> <out>"
echo "<in> hdfs input path"
echo "<out> hdfs output path"
echo "eg:$0 /wc/input /wc/out"
fi
inputpath=$1
outputpath=$2
hadoop jar /home/hadoop/project/wc/wc.jar com.bigdata.mapreduce.WCAPP \\
$inputpath $outputpath
3.Map task 个数由什么东西决定的?
input mapreduce output
数据:
文件 数据库db
mr里面的核心类:
input:InputFormat =》 如何加载数据
1.getSplits:获取数据的切片数量
2.createRecordReader 读取数据内容
map:Mapper
map
reduce:Reducer
reducer
output:OutputFormat =》 指定数据输出
input:
文件:
FileInputFormat:
TextInputFormat:<LongWritable, Text>
key:读取文件内容的位置
value:一行一行内容
1.isSplitable =》 判断你的文件是否可以被切分
1.可以被切分
分片数量 等同于 maptask的数据
补充: map task数据由 input 的切片数量决定的
2.不可以被切分
切片数量就是1 对应一个map task
2.createRecordReader
一个文件加载的时候会形成几个切片?
1.前提 文件可以被切分
split 切片 =》 splitsize 切片数量
120M
block 文件块 1块 :
128M 进行划分 1个块
split input :
按照blocksize = splitsize 128M
120M =》 1个切片 =》一个maptask
总结:
1.文件能被切分
1.文件大小小于128m
就有一个切片 =》 一个maptask
2.文件大小大于 128M
fileszie/splitsize = num 切片数
filesize剩余的部分:比较大小 splitsize * 10%
filesize-splitsize
大 那么就会额外开启一个切片
小 不会开启切片
2.不能切分的文件
某些压缩文件
eg:
input 130M
130/128=1
130-128=2m 128M*10%=12.8M
input 160M => 2个
128+32
1
32 128M*10%=12.8M 1
input 560M 5个切片
560M/128M = 4
48m 128M*10% =1
2022-11-21 10:18:04,798 INFO input.FileInputFormat: Total input files to process : 1
2022-11-21 10:18:04,839 INFO mapreduce.JobSubmitter: number of splits:1
number of splits:5
idea 本地环境:
splitsize 32M
160M
160M/32 =5
4.Reduce task 个数由什么东西决定的?
1.mr 用户自己决定
2.默认reduce task个数是 1
3.reduce task 个数 最终文件输出的时候 就有多少个文件
5.分区
”把相同的key拉倒一起“
key按照某个规则进行分发到 一起
某个规则:
默认 hash
需求:
基于phone结果数据,进行分文件存储
13开头的结果数据 存储到 一个文件中
15开头的结果数据 存储到 一个文件中
其他结果数据 存储到 一个文件中
1.reduce task 3
2.分区需要自定义
总结:
1.reduce task个数 > partitions 会有空文件
2.reduce task个数 < partitions 会报错
3.reduce task个数 = partitions 没问题
4.reduce task个数1 就是默认值 最终会有一个文件产生
sql vs mr:
1.sql :
group by
distinct
join
order by
1.group by => mr
map =>
reduce =>
2.distinct
emp :
ename job sql
select
distinct(ename)
from emp ;
select
name
from user_info
group by name;
name:
zs
zs
zs
map:
zs
zs
zs
reduce:
zs,<null,null,null>
3.order by
mr:
1.全局排序:
reduce task 1
2.分区排序
reduce task 4
mr: k 每个阶段都是有排序的功能
map kv
reduce kv
k: intwritebale
重写里面的compare to 这个方法实现排序
需求:
基于phone统计流量结果 ,要求按照总流量降序排序
map:
k =》 all
v => other
reducer
k
v
4.join
emp dept deptno
select
a.,
b.
from emp as a left join dept as b
on a.deptno=b.deptno
join:
1.普通的join
map
reduce
2.map join
map
shuffle:
生产上能不用shuffle的操作就不用shuffle
input :
emp.log
dept.log
map:
dept:10,ACCOUNTING,NEW YORK
emp: 7369,SMITH,CLERK,7902,1980-12-17 00:00:00,800.00,,20
on key
deptno,emp表字段
deptno,dept表字段
reduce:
deptno,<(emp表字段),(dept表字段)>
emp表字段,dept表字段 =>需求
作业:
1.mapreduce 理论、核心类
2.code 练习
以上是关于16_hadoop_reduce的主要内容,如果未能解决你的问题,请参考以下文章