优化&算法-1
hdfs的副本的配置
修改hdfs-site.xml文件
<property>
<name>
dfs.namenode.secondary.http-address
</name>
<value>hd-02:50090</value>
</property>
需要同步到其它机器:
scp hdfs-site.xml hd-02:$PWD
hadoop启动方式
1)启动hdfs集群
$ start-dfs.sh
2)启动yarn集群
$ start-yarn.sh
3)启动hadoop集群
$ start-all.sh
大数据干什么的?
1)海量数据的存储(mysql/orcale)
分布式文件系统hdfs
dfs->Hdfs
mapreduce->mapreduce
bigtable->hbase
分而治之!
2)海量数据的计算
分布式计算框架mapreduce
配置checkpoint时间
<property>
<name>dfs.namenode.checkpoint.period</name>
<value>7200</value>
</property>
hadoop2.8.4安装部署
1)准备工作
设置主机名:vi /etc/hostname
注意:需要重启 reboot
设置映射:vi /etc/hosts
设置免密登录:ssh-keygen
ssh-copy-id hd-01
...
2)安装jdk
上传安装包
CRT:alt+p
解压
tar -zxvf .tar.gz
配置环境变量
export JAVA_HOME=/root/hd/jdk1.8.0_141
export PATH=$PATH:$JAVA_HOME/bin
注意:需要source /etc/profile
分发jdk
scp jdk hd-02:/root/hd
scp /etc/profile hd-02:/etc/
source /etc/profile
3)安装hadoop
上传安装包
alt + p
解压
tar -zxvf .tar.gz
修改配置文件
core-site.xml
hdfs-site.xml
mapred-site.xml
yarn-site.xml
配置环境变量
export HADOOP_HOME=/
export PATH=$PAYH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
修改slaves文件加入从节点
格式化namenode
hadoop namenode -format
启动:start-all.sh
hadoopMapReduce
官方:Apache™Hadoop®项目开发了用于可靠,可扩展的分布式计算的开源软件。
Apache Hadoop软件库是一个框架,允许使用简单的编程模型跨计算机集群分布式处理
大型数据集。它旨在从单个服务器扩展到数千台计算机,每台计算机都提供本地计算和
存储。该库本身不是依靠硬件来提供高可用性,而是设计用于检测和处理应用层的故
障,从而在计算机集群之上提供高可用性服务,每个计算机都可能容易出现故障。
阿里的Flink(9000万欧元) Blink
MapReduce分布式计算程序的编程框架。基于hadoop的数据分析的应用。
MR优点:
1)框架易于编程
2)可靠容错(集群)
3)可以处理海量数据(1T+ PB+) 1PB = 1024TB
4)拓展性,可以通过动态的增减节点来拓展计算能力
MapReduce的思想
数据:海量单词
hello reba
hello mimi
hello liya
mimi big
需求:对每个单词出现的次数统计出来
思想:分而治之!
解决方式:
1)每个单词记录一次(map阶段)
<hello,1> <reba,1> <hello,1> <mimi,1>
2)相同单词的key不变,value累加求和即可(reduce阶段)
<hello,1+1+1>
对数据进行计算
对wordcount例子程序分析
1)整个wordcount分为几个阶段?
三个
2)有哪几个阶段?
mapper
reducer
driver
3)每个阶段有什么作用
mapper:对数据进行打散<hello,1><mimi,1>
reducer:对数据进行聚合<hello,1+1+1>
driver:提交任务
4)详解
Mapper阶段:
将数据转换为String
对数据进行切分处理
把每个单词后加1
输出到reducer阶段
Reducer阶段:
根据key进行聚合
输出key出现总的次数
Driver阶段:
创建任务
关联使用的Mapper/Reducer类
指定mapper输出数据的kv类型
指定reducer输出的数据的kv类型
指定数据的输入路径与输出路径
提交
hadoop数据类型
我们看到的wordcount程序中的泛型中的数据类型其实是hadoop的序列化的数据类
型。
为什么要进行序列化?用java的类型行不行?
Java的序列化:Serliazable太重。
hadoop自己开发了一套序列化机制。Writable,精简高效。海量数据。
hadoop序列化类型与Java数据类型
Java数据类型 Hadoop序列化类型
int IntWritable
long LongWritable
boolean BooleanWritable
byte ByteWritable
float FloatWritable
double DoubleWritable
String Text
wordcount测试
1)本地模式
2)集群模式
hadoop jar .jar wordcount /wc/in /wc/out
案例分析
需求:运营商流量日志
10086
计算每个用户当前使用的总流量
思路?总流量 = 上行流量+下行流量
三个字段:手机号 上行流量 下行流量
技术选型:PB+
数据分析:海量数据(存储hdfs)
海量数据计算(分布式计算框架MapReduce)
小文件优化
如果企业中存在海量的小文件数据
TextInputFormat按照文件规划切片,文件不管多小都是一个单独的切片,启动mapt
ask任务去执行,这样会产生大量的maptask,浪费资源。
优化手段:
小文件合并大文件,如果不动这个小文件内容。
自定义分区
需求:统计结果进行分区,根据手机号前三位来进行分区
总结:
1)自定义类继承partitioner<key,value>
2)重写方法getPartition()
3)业务逻辑
4)在driver类中加入
setPartitionerClass
5)注意:需要指定setNumReduceTasks(个数=分区数+1)
排序
需求:每个分区内进行排序?
总结:
1)实现WritableComparable接口
2)重写compareTo方法
combineTextInputFormat设置切片的大小 maptask
combiner 合并
1)combiner是一个组件
注意:是Mapper和Reducer之外的一种组件
但是这个组件的父类是Reduer
2)如果想使用combiner继承Reduer即可
3)通过编写combiner发现与reducer代码相同
只需在driver端指定
setCombinerClass(WordCountReduer.class)
注意:前提是不能影响业务逻辑<a,1><c,1> <a,2><a,1> = <a,3>
数学运算: (3 + 5 + 7)/3 = 5
(2 + 6)/2 = 4
不进行局部累加:(3 + 5 + 7 + 2 + 6)/5 = 23/5
进行了局部累加:(5+4)/2 = 9/2=4.5 不等于 23/5=4.6
数据压缩
为什么对数据进行压缩?
mapreduce操作需要对大量数据进行传输
压缩技术有效的减少底层存储系统读写字节数,hdfs。
压缩提高网络带宽和磁盘空间效率。
数据压缩节省资源,减少网络I/O。
通过压缩可以影响到mapreduce性能。(小文件优化,combiner)代码角度进行优化。
注意:利用好压缩提高性能,运用不好会降低性能。
压缩 -》 解压缩
mapreduce常用的压缩编码
压缩格式 是否需要安装 文件拓展名 是否可以切分
DEFAULT 直接使用 .deflate 否
bzip2 直接使用 .bz2 是
Gzip 直接使用 .gz 否
LZO 需要安装 .lzo 是
Snappy 需要安装 .snappy 否
性能测试
压缩格式 原文件大小 压缩后大小 压缩速度 解压速度
gzip 8.3GB 1.8GB 20MB/s 60MB/s
LZO 8.3GB 3GB 50MB/s 70MB/s
bzip2 8.3GB 1.1GB 3MB/s 10MB/s
数据压缩发生阶段
数据源
》数据传输 数据压缩
mapper
map端输出压缩
》数据传输 数据压缩
reducer
reduce端输出压缩
》数据传输 数据压缩
结果数据
设置map端输出压缩:
1)开启压缩
conf.setBoolean
2)设置具体压缩编码
conf.setClass
设置reduce端输出压缩:
1)设置reduce输出压缩
FileOutputFormat.setCompressOutput
2)设置具体压缩编码
FileOutputFormat.setOutputCompressorClass
hive数据仓库:mapreduce 用hsql处理大数据
压缩编码使用场景
1-> Gzip压缩方式
压缩率比较高,并且压缩解压缩速度很快;
hadoop自身支持的压缩方式,用gzip格式处理数据就像直接处理文本数据是完全一样
的;
在linux系统自带gzip命令,使用很方便简洁。
不支持split
使用每个文件压缩之后大小需要在128M以下(块大小)
200M-》设置块大小
2->LZO压缩方式
压缩解压速度比较快并且,压缩率比较合理;
支持split
在linux系统不可以直接使用,但是可以进行安装。
压缩率比gzip和bzip2要弱,hadoop本身不支持。
需要安装。
3->Bzip2压缩方式
支持压缩,具有很强的压缩率。hadoop本身支持。
linux中可以安装。
压缩解压缩速度很慢。
4->Snappy压缩方式
压缩解压缩速度很快。而且有合理的压缩率。
不支持split
数据倾斜
reduce join
Hadoop中有哪些组件?
HDFS:数据的分布式存储
MapReduce:数据的分布式计算
Yarn:资源调度(cpu/内存...)
Yarn节点:resourceManager
nodeManager
优化
MapReduce程序的编写过程中考虑的问题
优化目的:提高程序运行的效率
优化方案:
存储和处理海量数据,如何优化MR
影响MR程序的因素
1)硬件
压缩
CPU/磁盘(固态、机械)/内存/网络...
2)I/O优化
传输
-》maptask与reducetask合理设置个数
-》数据倾斜(reducetask-》merge)
避免出现数据倾斜
-》大量小文件情况 (combineTextInputFormat)
-》combiner优化(不影响业务逻辑)
具体优化方式:
MR(数据接入、Map、Reduce、IO传输、处理倾斜、参数优化)
数据接入:小文件的话 进行合并 ,namenode存储元数据信息,sn。
解决方式:CombineTextInputFormat
Map:会发生溢写,如果减少溢写次数也能达到优化。
溢写内存增加这样就减少了溢写次数。
解决方式:mapred-site.xml
属性:mapreduce.task.io.sort.mb
100
调大
mapreduce.map.sort.spill.percent
0.8
调大
combiner:map后优化
Reduce:reduceTask设置合理的个数
写mr程序可以合理避免写reduce阶段
设置map/reduce共存
属性:mapred-site.xml
mapreduce.job.reduce.slowstart.completedmaps
0.05
减少
IO传输:压缩
数据倾斜:避免出现数据倾斜,map端合并。手动的对数据进行分段处理,合理的
分区。
JVM重用:
不关JVM
一个map运行一个jvm,开启重用,在运行完这个map后JVM继续运行其它map。
线程池
属性:mapreduce.job.jvm.numtasks
20
启动40%运行时间