版权声明: https://blog.csdn.net/weixin_37254888/article/details/79704126
一、MapReduce Shuffle
-》MapReduce运行五个阶段
input
fileinputformat.setinputpaths(job,new Path(args[0]))
默认:输入key是行的偏移量,value是行的内容
job.setinputFormatClass(Textinputformat.class)
map:分片处理,实现map方法
hadoop 1
hadoop 1
hive 1
spark 1
hbase 1
shuffle :
分区
排序
分组
hadoop ,{1,1}
hbase ,{1}
hive,{1}
spark,{1}
reduce:合并处理,实现reduce方法
hadoop 2
hbase 1
hive 1
spark 1
output:同input
-》shuffle的功能:
-》分区:决定当前的key交给哪个reduce进行处理
默认:按照key的hash值取余的方式进去区分
reduce的个数=结果文件的个数
-》排序:默认按照key的字典顺序进行排序
-》分组:默认按照key进行分区
-》流程
-》input
256M文件 =》 block1、block2 =》 keyvalue =》 split1,split2
-》map
split1 => map task1 => 调用map方法 =》 输出当前的keyvalue
split2 => map task2
-》shuffle过程
-》第一种版本:
-》map端的shuffle
-》缓冲区:map的输出会进入一个环形缓冲区100M(内存)
-》分区:根据hash值对reduce的个数取余,为keyvalue打标签
-》对每一条keyvalue进行分区
hadoop 1 --- reduce1
hive 1 --- reduce2
hbase 1 --- reduce1
hadoop 1 --- reduce1
spark 1 --- reduce2
-》对每个分区的数据会进行排序
hadoop 1 --- reduce1
hadoop 1 --- reduce1
hbase 1 --- reduce1
hive 1 --- reduce2
spark 1 --- reduce2
hadoop 1 --- reduce1
hadoop 1 --- reduce1
hbase 1 --- reduce1
hive 1 --- reduce2
spark 1 --- reduce2
-》溢写:当环形缓冲区存储达到80%,开始将缓冲区中的数据溢写
到磁盘,变成多个小文件
-》合并:将每个小文件合并到一起
-》对每个分区的数据进行排序
hadoop 1 --- reduce1
hadoop 1 --- reduce1
hadoop 1 --- reduce1
hadoop 1 --- reduce1
hbase 1 --- reduce1
hbase 1 --- reduce1
hive 1 --- reduce2
hive 1 --- reduce2
spark 1 --- reduce2
spark 1 --- reduce2
-》reduce端的shuffle
-》reduce1和reduce2分别到每个map shuffle的输出中去取
取属于自己分区的数据
-》reduce1到map task1和map task2中取属于自己分区的数据
map task1 shuffle :
hadoop 1 --- reduce1
hadoop 1 --- reduce1
hadoop 1 --- reduce1
hadoop 1 --- reduce1
hbase 1 --- reduce1
hbase 1 --- reduce1
map task2 shuffle :
hadoop 1 --- reduce1
hadoop 1 --- reduce1
hadoop 1 --- reduce1
hadoop 1 --- reduce1
hbase 1 --- reduce1
hbase 1 --- reduce1
-》合并
-》将获取到的所有数据进行合并
-》对所有数据进行排序
hadoop 1 --- reduce1
hadoop 1 --- reduce1
hadoop 1 --- reduce1
hadoop 1 --- reduce1
hadoop 1 --- reduce1
hadoop 1 --- reduce1
hadoop 1 --- reduce1
hadoop 1 --- reduce1
hbase 1 --- reduce1
hbase 1 --- reduce1
hbase 1 --- reduce1
hbase 1 --- reduce1
-》分组:
hadoop ,{1,1,1,1,1,1,1,1}
hbase ,{1,1,1,1}
-》第二种版本
-》spill(溢写)
-》分区
-》排序
-》spill
-》merge(合并)
-》合并
-》排序
-》merge(合并)
-》合并
-》排序
-》分组
-》reduce
-》output
-》程序中设置shuffle过程
//shuffle
//partition
job.setPartitionerClass(null);
//sort
job.setSortComparatorClass(null);
//group
job.setGroupingComparatorClass(null);
-》shuffle的优化
-》combiner:相当于Mapper端的聚合reduce
一般情况下,combiner的类与reduce的类是同一个类
不是所有的MapReduce程序都可以使用、
map:
hadoop 1
hadoop 1
hive 1
hbase 1
hive 1
shuffle:
hadoop {1,1}
hbase {1}
hive {1,1}
reduce:
hadoop 2
hbase 1
hive 2
map:
hadoop 1
hadoop 1
hive 1
hbase 1
hive 1
一个maptask执行完的shuffle:combiner
hadoop {2}
hbase {1}
hive {2}
整个shuffle结束
hadoop {2,2,1} => {1,1,1,1,1}
hbase {1,2}
hive {2,3}
reduce:
hadoop 5
hbase 3
hive 5
//set combiner class
job.setCombinerClass(null);
一般情况下,combiner的类与reduce的类是同一个类
当map的输出类型与reduce的输出类型一致时,可以使用
map 输出 = combiner 的输入
combiner = reduce
combiner输出 = reduce的输入
-》compress:压缩
-》map处理数据交给shuffle
map端shuffle处理以后的数据可以配置压缩
mapreduce.map.output.compress=true
mapreduce.map.output.compress.codec
-》reduce读取数据处理以后存储输出也可以配置压缩
输出结果压缩
mapreduce.output.fileoutputformat.compress=true
mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.DefaultCodec
org.apache.hadoop.io.compress.DefaultCodec:不压缩
org.apache.hadoop.io.compress.SnappyCodec:Snappy压缩
org.apache.hadoop.io.compress.lz4Codec:lz4压缩
-》代码中设置压缩
conf.set("mapreduce.output.fileoutputformat.compress","true");
conf.set("mapreduce.output.fileoutputformat.compress.codec","org.apache.hadoop.io.compress.SnappyCodec");
-》job处理任务运行过程
-》一般DataNode与NodeManager在同一台机器
-》处理任务时,优先处理自己机器上的数据块
-》hadoop运行时配置
-》代码开发中:configuration对象中
conf.set("fs.defaultFS","hdfs://hostname:8020");
-》default配置文件:hadoop的默认配置文件
core-default.xml
hdfs-default.xml
mapred-default.xml
yarn-default.xml
-》site配置文件:用户自定义配置文件
core-site.xml
hdfs-site.xml
mapred-site.xml
yarn-site.xml
-》整个hadoop在运行过程中:
-》加载所有默认配置选项
-》加载用户自定义配置
用户自定义配置替换默认配置
三、分布式集群部署
-》虚拟机:三台
-》内存:8G
-》主节点:2.5G
-》从节点:1.5G
-》集群划分:
NameNode,DataNode,ResourceManager,NodeManager,JobhistoryServer
Node1:DataNode NodeManager NameNode ResourceManager JobhistoryServer
Node2:DataNode NodeManager
Node3:DataNode NodeManager
-》部署过程
-》Linux部署
-》每台网络:防火墙、selinux、ip
Node1:192.168.134.221
Node2:192.168.134.222
Node3:192.168.134.223
-》主机名的修改
-》临时修改:hostname bigdata-training02.hpsk.com
-》永久修改:vim /etc/sysconfig/network
-》每台本地域名解析/etc/hosts
192.168.134.221 bigdata-training01.hpsk.com
192.168.134.222 bigdata-training02.hpsk.com
192.168.134.223 bigdata-training03.hpsk.com
-》免密钥登录:每台机器之间可以互相登录
ssh-keygen -t rsa
ssh-copy-id bigdata-training01.hpsk.com
ssh-copy-id bigdata-training02.hpsk.com
ssh-copy-id bigdata-training03.hpsk.com
-》ntp时间同步
-》配置ntp:有延迟,十分钟左右才开始同步成功
server机器:Node1 -》 时钟服务器进行同步
Node1:
sudo vim /etc/ntp.conf
--允许谁同步我
restrict 192.168.134.0 mask 255.255. 255.0 nomodify notrap
--我跟谁同步
server 202.112.10.36
--取消注释
server 127.127.1.0 # local clock
fudge 127.127.1.0 stratum 10
-》启动ntp服务
sudo service ntpd start
sudo chkconfig ntpd on
-》查看同步状态
ntpstat
client机器:Node2,Node3
server 192.168.134.221
-》第一次手动同步
ntpdate –u 192.168.134.221
-》启动服务
sudo service ntpd start
sudo chkconfig ntpd on
-》准备方法:
sudo date -s "2018-03-20 16:07:00"
sudo vim /etc/ntp.conf
-》jdk
-》Hadoop部署
-》在1上面解压配置hadoop
-》env:JAVA_HOME
-》core-site
hdfs地址
hadoop临时目录
-》hdfs-site
副本数 3
权限关闭
-》mapred-site
运行框架在yarn
jobhistoryserver
-》yarn-site
mapreduce运行方式
resourcemanager的地址
日志聚集
-》slaves
-》将hadoop分发到其他两台机器
1 to 2 :
scp -r hadoop-2.7.3 [email protected]:/opt/modules/
3 from 1:
scp -r [email protected]:/opt/modules/hadoop-2.7.3 /opt/modules/
-》在1主节点上格式化
bin/hdfs namenode -format
-》启动测试
-》MapReduce运行五个阶段
input
fileinputformat.setinputpaths(job,new Path(args[0]))
默认:输入key是行的偏移量,value是行的内容
job.setinputFormatClass(Textinputformat.class)
map:分片处理,实现map方法
hadoop 1
hadoop 1
hive 1
spark 1
hbase 1
shuffle :
分区
排序
分组
hadoop ,{1,1}
hbase ,{1}
hive,{1}
spark,{1}
reduce:合并处理,实现reduce方法
hadoop 2
hbase 1
hive 1
spark 1
output:同input
-》shuffle的功能:
-》分区:决定当前的key交给哪个reduce进行处理
默认:按照key的hash值取余的方式进去区分
reduce的个数=结果文件的个数
-》排序:默认按照key的字典顺序进行排序
-》分组:默认按照key进行分区
-》流程
-》input
256M文件 =》 block1、block2 =》 keyvalue =》 split1,split2
-》map
split1 => map task1 => 调用map方法 =》 输出当前的keyvalue
split2 => map task2
-》shuffle过程
-》第一种版本:
-》map端的shuffle
-》缓冲区:map的输出会进入一个环形缓冲区100M(内存)
-》分区:根据hash值对reduce的个数取余,为keyvalue打标签
-》对每一条keyvalue进行分区
hadoop 1 --- reduce1
hive 1 --- reduce2
hbase 1 --- reduce1
hadoop 1 --- reduce1
spark 1 --- reduce2
-》对每个分区的数据会进行排序
hadoop 1 --- reduce1
hadoop 1 --- reduce1
hbase 1 --- reduce1
hive 1 --- reduce2
spark 1 --- reduce2
hadoop 1 --- reduce1
hadoop 1 --- reduce1
hbase 1 --- reduce1
hive 1 --- reduce2
spark 1 --- reduce2
-》溢写:当环形缓冲区存储达到80%,开始将缓冲区中的数据溢写
到磁盘,变成多个小文件
-》合并:将每个小文件合并到一起
-》对每个分区的数据进行排序
hadoop 1 --- reduce1
hadoop 1 --- reduce1
hadoop 1 --- reduce1
hadoop 1 --- reduce1
hbase 1 --- reduce1
hbase 1 --- reduce1
hive 1 --- reduce2
hive 1 --- reduce2
spark 1 --- reduce2
spark 1 --- reduce2
-》reduce端的shuffle
-》reduce1和reduce2分别到每个map shuffle的输出中去取
取属于自己分区的数据
-》reduce1到map task1和map task2中取属于自己分区的数据
map task1 shuffle :
hadoop 1 --- reduce1
hadoop 1 --- reduce1
hadoop 1 --- reduce1
hadoop 1 --- reduce1
hbase 1 --- reduce1
hbase 1 --- reduce1
map task2 shuffle :
hadoop 1 --- reduce1
hadoop 1 --- reduce1
hadoop 1 --- reduce1
hadoop 1 --- reduce1
hbase 1 --- reduce1
hbase 1 --- reduce1
-》合并
-》将获取到的所有数据进行合并
-》对所有数据进行排序
hadoop 1 --- reduce1
hadoop 1 --- reduce1
hadoop 1 --- reduce1
hadoop 1 --- reduce1
hadoop 1 --- reduce1
hadoop 1 --- reduce1
hadoop 1 --- reduce1
hadoop 1 --- reduce1
hbase 1 --- reduce1
hbase 1 --- reduce1
hbase 1 --- reduce1
hbase 1 --- reduce1
-》分组:
hadoop ,{1,1,1,1,1,1,1,1}
hbase ,{1,1,1,1}
-》第二种版本
-》spill(溢写)
-》分区
-》排序
-》spill
-》merge(合并)
-》合并
-》排序
-》merge(合并)
-》合并
-》排序
-》分组
-》reduce
-》output
-》程序中设置shuffle过程
//shuffle
//partition
job.setPartitionerClass(null);
//sort
job.setSortComparatorClass(null);
//group
job.setGroupingComparatorClass(null);
-》shuffle的优化
-》combiner:相当于Mapper端的聚合reduce
一般情况下,combiner的类与reduce的类是同一个类
不是所有的MapReduce程序都可以使用、
map:
hadoop 1
hadoop 1
hive 1
hbase 1
hive 1
shuffle:
hadoop {1,1}
hbase {1}
hive {1,1}
reduce:
hadoop 2
hbase 1
hive 2
map:
hadoop 1
hadoop 1
hive 1
hbase 1
hive 1
一个maptask执行完的shuffle:combiner
hadoop {2}
hbase {1}
hive {2}
整个shuffle结束
hadoop {2,2,1} => {1,1,1,1,1}
hbase {1,2}
hive {2,3}
reduce:
hadoop 5
hbase 3
hive 5
//set combiner class
job.setCombinerClass(null);
一般情况下,combiner的类与reduce的类是同一个类
当map的输出类型与reduce的输出类型一致时,可以使用
map 输出 = combiner 的输入
combiner = reduce
combiner输出 = reduce的输入
-》compress:压缩
-》map处理数据交给shuffle
map端shuffle处理以后的数据可以配置压缩
mapreduce.map.output.compress=true
mapreduce.map.output.compress.codec
-》reduce读取数据处理以后存储输出也可以配置压缩
输出结果压缩
mapreduce.output.fileoutputformat.compress=true
mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.DefaultCodec
org.apache.hadoop.io.compress.DefaultCodec:不压缩
org.apache.hadoop.io.compress.SnappyCodec:Snappy压缩
org.apache.hadoop.io.compress.lz4Codec:lz4压缩
-》代码中设置压缩
conf.set("mapreduce.output.fileoutputformat.compress","true");
conf.set("mapreduce.output.fileoutputformat.compress.codec","org.apache.hadoop.io.compress.SnappyCodec");
-》job处理任务运行过程
-》一般DataNode与NodeManager在同一台机器
-》处理任务时,优先处理自己机器上的数据块
-》hadoop运行时配置
-》代码开发中:configuration对象中
conf.set("fs.defaultFS","hdfs://hostname:8020");
-》default配置文件:hadoop的默认配置文件
core-default.xml
hdfs-default.xml
mapred-default.xml
yarn-default.xml
-》site配置文件:用户自定义配置文件
core-site.xml
hdfs-site.xml
mapred-site.xml
yarn-site.xml
-》整个hadoop在运行过程中:
-》加载所有默认配置选项
-》加载用户自定义配置
用户自定义配置替换默认配置
三、分布式集群部署
-》虚拟机:三台
-》内存:8G
-》主节点:2.5G
-》从节点:1.5G
-》集群划分:
NameNode,DataNode,ResourceManager,NodeManager,JobhistoryServer
Node1:DataNode NodeManager NameNode ResourceManager JobhistoryServer
Node2:DataNode NodeManager
Node3:DataNode NodeManager
-》部署过程
-》Linux部署
-》每台网络:防火墙、selinux、ip
Node1:192.168.134.221
Node2:192.168.134.222
Node3:192.168.134.223
-》主机名的修改
-》临时修改:hostname bigdata-training02.hpsk.com
-》永久修改:vim /etc/sysconfig/network
-》每台本地域名解析/etc/hosts
192.168.134.221 bigdata-training01.hpsk.com
192.168.134.222 bigdata-training02.hpsk.com
192.168.134.223 bigdata-training03.hpsk.com
-》免密钥登录:每台机器之间可以互相登录
ssh-keygen -t rsa
ssh-copy-id bigdata-training01.hpsk.com
ssh-copy-id bigdata-training02.hpsk.com
ssh-copy-id bigdata-training03.hpsk.com
-》ntp时间同步
-》配置ntp:有延迟,十分钟左右才开始同步成功
server机器:Node1 -》 时钟服务器进行同步
Node1:
sudo vim /etc/ntp.conf
--允许谁同步我
restrict 192.168.134.0 mask 255.255. 255.0 nomodify notrap
--我跟谁同步
server 202.112.10.36
--取消注释
server 127.127.1.0 # local clock
fudge 127.127.1.0 stratum 10
-》启动ntp服务
sudo service ntpd start
sudo chkconfig ntpd on
-》查看同步状态
ntpstat
client机器:Node2,Node3
server 192.168.134.221
-》第一次手动同步
ntpdate –u 192.168.134.221
-》启动服务
sudo service ntpd start
sudo chkconfig ntpd on
-》准备方法:
sudo date -s "2018-03-20 16:07:00"
sudo vim /etc/ntp.conf
-》jdk
-》Hadoop部署
-》在1上面解压配置hadoop
-》env:JAVA_HOME
-》core-site
hdfs地址
hadoop临时目录
-》hdfs-site
副本数 3
权限关闭
-》mapred-site
运行框架在yarn
jobhistoryserver
-》yarn-site
mapreduce运行方式
resourcemanager的地址
日志聚集
-》slaves
-》将hadoop分发到其他两台机器
1 to 2 :
scp -r hadoop-2.7.3 [email protected]:/opt/modules/
3 from 1:
scp -r [email protected]:/opt/modules/hadoop-2.7.3 /opt/modules/
-》在1主节点上格式化
bin/hdfs namenode -format
-》启动测试