部署mr app 官网:
https://github.com/apache/hadoop
https://github.com/apache/project
临时测试启动:
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}
【Map task 个数由什么东西决定的?】
切片的数量决定的 input mapreduce output
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
总结:
4.Reduce task 个数由什么东西决定的?
1.mr 用户自己决定
2.默认reduce task个数是 1
3.reduce task 个数 最终文件输出的时候 就有多少个文件
5.分区
”把相同的key拉倒一起“
key按照某个规则进行分发到 一起
总结
1.文件能被切分
1.文件大小小于128m
就有一个切片【一个maptask 】
2.文件大小大于 128M
fileszie/splitsize = num 切片数
filesize剩余的部分:比较大小 splitsize * 10%
filesize-splitsize
大 那么就会额外开启一个切片
小 不会开启切片
2.不能切分的文件
某些压缩文件
例如
input 130M
130/128=1
130-128=2m 128M*10%=12.8M
1.reduce task个数 > partitions 会有空文件
2.reduce task个数 < partitions 会报错
3.reduce task个数 = partitions 没问题
4.reduce task个数1 就是默认值 最终会有一个文件产生
sql和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;
3.order by
mr:
1.全局排序:
reduce task 1
2.分区排序
reduce task 4
mr: k 每个阶段都是有排序的功能
map kv
reduce kv
k: intwritebale
重写里面的compare to 这个方法实现排序
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:
deptno,emp表字段
deptno,dept表字段
reduce:
deptno,<(emp表字段),(dept表字段)>
emp表字段,dept表字段 =>需求