3.MapReduce简介
4.MapReduce运行流程
program——》master
assign map散——>worker——》split逻辑切分——》localwrite到 disks (先暂存,解耦)
assign reduce聚——》worker——》聚在一起——》output files
5.流程详解
1.pre-map:map前期准备
文件切分——》<k,v>
2.map: 打散
partition(hash值运算,按split进行划分)——》sort排序——》combine局部聚合
2.5shuffle:洗牌,神奇发生处
sort&merge(排序,partition合并)
3.reduce:聚
reduce全局聚合——》output
注意:combine局部聚合,为了减少全局聚合的压力
但也不一定哪都适用,不能局部计算的类型就不适合局部聚合
2.MapReduce Java Api 实现
2.1 Map类 (散)
对数据进行切分
重点:StringTokenizer st=new StringTokenizer(line,",");
在这就可以设置具体的切分方式
2.2 Reduce类 (聚)
Iterable<IntWritable> values,按key值将相同key对应的value形成一个聚合体,可以看成一个集合。
在迭代中,获取对应的value值。便可以进行各种计算。
所有Reduce类中 , 每次传来的就是 key 和 key对应value的集合,这个概念是求平均值的重点!
2.3 Driver类 (驱动)
可以设定有多少个环节,一般多操作job.setCombinerClass,局部聚合看情况添减。
3.如何判断输入数据的类型
3.1判断数组
1) 正则表达式
2) 强制转换
3) 现成的API
3.2 正则表达式
最为灵活强大
1)Pattern
创建正则表达式的对象,便能做操作
2)Matcher
1.matches() 全匹配
2.lookingAt() 前段匹配
3.find() 任意位置匹配
4.数据的分块存储和切分计算
任何文件都可以进行分块存储 (都是二进制)
但不一定都适合切分计算,比如一张图片切分成两段计算,就是两个废文件
5.压缩的本质
数据有一定的重复性和规律性
6.文件格式
1 .txt 可切分 便捷 成本大
2 .seq 可切分 kv存储,可压缩 不易查看数据
3 .rc 可切分 查询快,利用率高 每一项都不最高
(行列切分,行切分保证数据连贯完整,列切分保证数据相似性。便于减少寻址时间,提高压缩率)
4 .orc 可切分 rc的进一步提升
7.压缩格式
gz 最原生 不可切分 cpu要求高 <128最好
lzo 不原生 快,合理
bz2 原生 快,高
snappy 不原生 快,合理
1.文件输出格式
-Dmapred.output.compress=true \
-Dmapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec\
main方法中添加-
//参数解析器
GenericOptionsParser optionParser = new GenericOptionsParser(conf,args);
String[] remainingArgs = optionParser.getRemainingArgs();
if ((remainingArgs.length != 2)) {
System.err.println("Usage: yarn jar jar_path main_class_path -D参数列表 <in> <out>");
System.exit(2);
}
//指定输入数据的路径
FileInputFormat.addInputPath(job, new Path(remainingArgs[0]));
//指定输出路径,并要求该输出路径一定是不存在的
FileOutputFormat.setOutputPath(job, new Path(remainingArgs[1]));
gzip格式:.GzipCodec lzo格式:.lzo.LzopCodec bzip2格式:.BZip2codec
2.自定义Partition
-Dmapred.reduce.tasks=2 \ 定义reduce数量
/**
自定义Partition的定义
*/
publicstatic class MyHashPartitioner<K, V> extends Partitioner<K, V> {
/**Use {@link Object#hashCode()} to partition. */
public int getPartition(K key, V value, int numReduceTasks) {
return (key.toString().charAt(0) < 'q' ? 0 : 1) % numReduceTasks;
// return key.toString().charAt(0);
}
}
可以对key进行限制进行不同规则切分
3.外部配置文件-configuration
当需要将某个xx.txt文件内容传递到各个计算节点,可通过Configuration传递到Map中
覆写setup方法,需要的参数只初始化一次。
标记状态位,用于标记一次性初始化的用法。