文章目录
第一章 大数据概率
大数据特点
数据量大,数据类型繁多,处理速度快,价值密度低
三次信息浪潮
第一次::计算机
第二次:互联网
第三次:物联网、大数据、云计算
数据存储单位
Byte(字节)、KB(千字节)、MB(兆字节)、GB(吉字节)、TB(太字节)、PB(拍字节)、EB(艾字节)、ZB(泽字节)
第二章 分布式文件系统
系统结构
1、HDFS默认的一个块是64MB
2、名称节点:负责文件和目录的创建、删除、重命名,同时管理着数据节点和文件块的映射关系,名称节点处于安全模式时只对外面提供读服务。
3、数据节点:负责数据的存储和读取,采用流式数据进行读取
4、第二名称节点:完成Editlog和FsImage合并操作:第二名称节点会定时向名称节点通信,要求暂停使用FsImage文件,然后将FsImage文件和Editlog文件拉回到本地,加载到内存中进行合并,在内存中逐条执行Editlog内容,使Fslmage的数据保持最新;最后使用最新的FsImage进行替换,从而减少Editlog文件的大小;;作为名称节点的检查点,当名称节点发生故障时,就可以使用第二名称节点的记录的元数据信息进行系统恢复,第二名称节点是冷备份。
HDFS的局限性
应用局限性
不适合低延迟数据访问、无法高效存储大量小文件、不支持多用户写入及任意修改文件。
体系结构的局限性
1、命名空间有限,名称节点在内存中,因此容纳的对象会受空间的限制
2、性能的瓶颈:分布式文件系统的吞吐量受限于单个名称节点的吞吐量
3、隔离问题:集群只有一个名称节点及命名空间,所以不能对不同的应用进行隔离
4、集群可用性:集群唯一的名称节点发生故障之后,会导致整个集群不可用。
数据存取策略
机架感知:HDFS中的文件块会同时被保存到3个地方,有两份副本保存在同一机架上的不同机器上,第三个副本存放在不同机架上。
优点:可以获得很高的数据可靠性,一个机架上发生故障时,位于其他机架上副本数据仍然可以使用;其次,读取数据的时候可以在多个机架上并行读取数据;最后,更容易的实现系统内部负载均衡和错误的处理。
高可用
原理
HA集群中,一般设置两个名称节点,一个处于活跃状态一个处于待命状态,处于活跃状态下的名称节点负责对外处理所有客户端的请求,而等待节点对元数据进行热备份。热备份过程:活跃节点将更新的数据写入到共享存储系统,然后待命的名称节点把共享存储系统的数据进行读取,加载到内存中。对存储位置的映射进行设备份,给数据节点配置两个名称节点的地址,并把块的位置信息和心跳信息同时发送到两个名称节点。Zookeeper可以确保任意时刻只有一个名称节点对外提供服务。
联邦机制
原理
在HDFS联邦机制中,设计多个相互独立的名称节点,使得HDFS的命名服务能够水平扩展,所有名称节点会共享底层的数据节点作为存储资源。每个名称节点的管理自己的一个块池,每个块池中的各个块实际上是存储在各个不同的数据节点中。
优点
1、HDFS可扩展性,多个名称节点各自管理一部分目录,不像HDFS1.0那样受内存空间的限制制约文件的数目
2、性能更高:多个节点同时对外进行服务,将为用户提供更高的读写吞吐率。
3.良好的隔离性:用户可以根据不同的业务需求将业务数据交给不同的名称节点进行管理。
缺点:不能解决单节点的宕机问题。
第三章 YARN资源管理
YARN的体系结构
YARN体系结构中包含三个组件:ResourceManage、ApplicationMaster和NodeManager。
ResourceManage
RM是一个全局的资源管理器,负责整个资源的分配和调度,主要有调度器(Scheduler)和应用程序管理器(Applications Manager),调度器负责资源的管理和分配,调度器接收来自ApplicationMaster的应用程序资源请求,把集群中的资源以“容器”的形式分配给应用程序,容器的选择通常会考虑应用程序所要处理的数据位置,从而实现由计算向数据靠拢。应用程序管理器负责系统中所有应用程序的管理工作,主要包括应用程序提交、与调度器协商资源以启动ApplicationMaster、监控 ApplicationMaster程序运行状态并在失败的时候重新启动等.
ApplicationMaster
当用户提交作业时,ApplicationMaster与ResourceManager协商获取资源,获取资源;把获取的资源进一步分配给各个任务(Map和Reduce任务);与NodeManager保持通信,控制应用程序的状态,监控任务的执行情况和资源的使用情况,对失败任务进行恢复;定时的向ResourceManager发送“心跳”消息,报告资源和任务的情况;当任务执行完之后ApplicationsMaster向ResourceManager注销容器。
NodeManager
主要负责容器生命周期管理,监控容器资源的使用情况,向ResourceManager发送心跳机制,还接收来自ApplicationMaster的启动/停止容器的各种要求,NodeManager只负责与容器相关的事情。
第四章 Flume
定义
Flume是一个分布式、可靠、高可用的海量日志采集系统
特点
事务、可靠性、可扩展性、可管理型、 功能可扩展性
事务
event是Flume传输数据的基本单位,也是事务的基本单位,Flume使用两个独立的事务负责从Source到channel及从Channel到sink的事务传递,从Channel到Sink过程由于某种原因使得事务无法记录的时,事务将回滚,所有的事务仍然保留在Channel中重新等待传递。
Flume架构
Flume由三部分组成,source是用来采集数据 ,Channel是用来暂时保存数据到硬盘,Sink是将数据写到某种介质当中去,比如HDFS、数据库、文件。
File Channel具有持久性,事件写入到File Channel 后,即使Agent重新启动之后,事件也不会丢失;Memmory Channel不具有持久性,具有较高的吞吐量
第五章 HBase数据库
概述
Hbase是谷歌BigTable的开源实现。Hbase是一个高可靠、高性能、面向列、可伸缩的分布式数据库,主要用来存储非结构化和半结构化的松散数据。HBase的目标是处理一个非常庞大的表。Hbase以HDFS为底层进行存储。
与传统数据库的比较
数据类型
HBase把不同的格式的结构化数据和非结构的数据都序列化为字符串类型进行保存下来
数据操作
关系型数据库会涉及复杂的多表连接因而对表进行增删改查比较麻烦。HBase设计上避免了复杂的表与表之间的关系,增删改查非常简单
存储模式
HBase是基于列进行存储的,每个列族都由几个文件保存,不同列族的文件是分离的;支持多用户并发查询;同一列族的文件会被压缩在一起
数据索引
关系型数据库会针对不同的列构建复杂的多个索引。HBase只有一个索引——行键,访问HBase中的行可以通过单个行键、行键区间、全表扫描进行访问,还可以使用MapReduce来快速生成索引表
数据维护
HBase在更新数据的时候,并不会删除旧的数据版本,而是生成新的版本
可伸缩性
HBase可以通过在集群中增加和减少硬件数量来实现性能的伸缩。Hbase的扩展性主要体现在两个方面,一个是基于上层处理能力(RegionServer)的扩展,一个是基于存储的扩展(HDFS)。
数据坐标
HBase是一个稀疏、多维度、排序的映射表。HBase的数据表包括列族、列限定符、时间戳、单元格、行。HBase定位一个单元格需要用四维坐标进行定位[行键、列族、列限定符、时间戳]视为一个键。
HBase的运行原理
zookeeper
每个region服务器都需要到zookeeper中进行注册,zookeeper会实时监控每个Region服务器的运行状态并通知给Master;HBase可以启动多个Master,zookeeper可以保证任意时刻总有一个唯一的Master运行,可以避免单点失效;zookeeper保存了-ROOT-表的地址。
Region:HBase数据量非常大,需要分布式存储在不同的机器上,因此需要根据行键的值进行分区,每个行区间构成一个分区,被称为Region,包含了值域内的所有数据,它是负载均衡和数据分发的基本单位,默认的大小是100MB-200MB.
每个Region会运行在Region的服务器上,每个Region当存储量达到一定限度时会进行分裂。每个Region运行一个Region的集合大概10—1000个Region.
层次
层次 | 名称 | 作用 |
---|---|---|
第一层 | Zookeeper文件 | 记录了-ROOT-表的位置信息 |
第二层 | -ROOT-表 | 记录了.META.表的Region位置信息-ROOT-表只能有一个Region。通过-ROOT-表,就可以访问.META.表中的数据 |
第三层 | .META.表 | 记录了用户数据表的Region位置信息,.META.表可以有多个Region,保存了HBase中所有用户数据表的Region位置信息 |
Master
主服务器Master主要负责表和Region的管理工作:
–管理用户对表的增加、删除、修改、查询等操作
–实现不同Region服务器之间的负载均衡
–在Region分裂或合并后,负责重新调整Region的分布
–对发生故障失效的Region服务器上的Region进行迁移
Region服务器的工作原理
Region服务器是HBase最核心的一部分,复杂维护自己的Region,并响应用户的读写请求。 Hbase本身不具有数据复制和维护副本的功能,而HDFS可以为HBase提供这些支持(机架感知)。
Region服务器管理着一系列Region的对象和一个HLog文件(在硬盘),HLog记录着所有对数据的操作。每个Region对象由多个store组成,一个store对应着表中的一个列族的存储,每个store又包含一个MemStore和StoreFile,MemStore是在内存中的缓存,保存着最近的更新数据。StoreFile是存储在硬盘的文件,这些文件都是以树结构的,方便快速读取,采用压缩方式存储。
当用户进行读写操作的时候都先在MenStore进行操作,然后再去StoreFile中进行操作,HLog进行记录。MemStore的容量有限,会周期性的将内容写入到磁盘的StoreFile中,HLog会记录写入操作,每次进行缓存的写入时都会生成新的StoreFile文件。当Store中的StoreFile数量足够多的时,Store会进行合并成一个大的StoreFile,当多个StoreFile进行合并的时候,StoreFile达到一定的阈值之后就会进行分类,从而一个Region会被分裂成两个Region,Master会将新生成的Region对象分配到相应的服务器上。
每个服务器上只有一个HLog文件,他是一个预写式文件,对数据进行更新的时候都必须先写在HLog上,然后才能写入缓存。zookeeper进行Region服务器监控的时,发现服务器出现故障,会想Master进行报告,Master会对故障服务器里面的HLog信息进行处理,把Region和相应的HLog进行拆分然后分配到有空闲的服务器上面进行运行。
第六章 MapReduce
MapReduce是由java实现的,但其应用程序比一定由java实现
适用场景
批处理、非实时、数据密集型
模型简介
MapReduce擅长处理大数据,MapReduce的思想就是“分而治之”。
(1)Mapper负责“分”,即把复杂的任务分解为若干个“简单的任务”来处理。“简单的任务”包含三层含义:
一是数据或计算的规模相对原任务要大大缩小;二是就近计算原则,即任务会分配到存放着所需数据的节点上进行计算;三是这些小任务可以并行计算,彼此间几乎没有依赖关系。
(2)Reducer负责对map阶段的结果进行汇总。至于需要多少个Reducer,用户可以根据具体问题,通过在mapred-site.xml配置文件里设置参数mapred.reduce.tasks的值,缺省值为1。
MapReduce的处理流程
这里以WordCount单词计数为例,介绍map和reduce两个阶段需要进行哪些处理。单词计数主要完成的功能是:统计一系列文本文件中每个单词出现的次数,如图所示:
(1)map任务处理
(2)reduce任务处理
Shuffle过程
Map
Map的输出结果不是直接写入 硬盘,而是先写入缓存区,缓存区的大小默认是100MB,当缓存的占有量达到80%时,就会启动溢写操作。
分区:运用hash函数
排序:按照英文字母进行排序
合并:对键相同的的数值进行相加
Reduce
执行归并操作,若只有一个Map任务并且只有一个溢写文件的时候shuffle的输出就是Reduce的输出;若有多个Map任务或多个溢写文件将进行归并之后在执行合并操作。
Mapreduce编程实践
Map
public static class TokenizerMapper extends Mapper<Object,Text,Text,IntWritable>{ //map输入类型/输出类型
private static final IntWritable one = new IntWritable(1); // 在map输出时单词的标记
private Text word = new Text();
public TokenizerMapper(){
}
public void map(Object key,Text value,Mapper<Object,Text,Text,IntWritable>.Context context) throws IOException,InterruptedException{
StringTokenizer itr = new StringTokenizer(value.toString()); //StringTest类自带的方法将文本中的行进行拆分
while(itr.hasMoreTokens()){
this.word.set(itr.nextToken());
context.write(this.word,one);
}
}
}
Reduce
public static class IntSumReduce extends Reducer<Text,IntWritable,Text,IntWritable>{
private IntWritable result = new IntWritable();
public IntSumReducer(){
}
public void reduce (Text key,Iterable<IntWritable> values,Reducer<Text,IntWritable,Text,IntWritable>.Context context) throws IOException,InterruptedException{
int sum = 0;
IntWritable val;
for (Iterator i = values.iterator();i.hasNext();sum +=val.get()){
val = (IntWritable)i.next();
}
this.result.set(sum);
context.write(key,this.result);
}
}
第七章 hive操作
概念
数据仓库是一个面向主题、集成的、相对稳定的、反映历史变化的数据集合,用于支持管理决策
OLTP和OLAP的区别
1)、OLTP对数据的实时性非常高而OLAP对数据的实时性不算太高
2)、OLTP的数据量不是很大,OLAP处理的数据量很大
3)、OLTP是对确定的事务进行存取,并发性高;OLAP重点是通过数据提供决策支持
系统架构
用户接口模块包括:HWI、JDBC、ODBC、Thrift、Server
驱动模块:负责把HSQL语句转化位MapReduce作业
元数据存储模块:是一个独立的关系型数据库
数据类型
基本数据类型
类型 |
---|
TINYINT |
SMALLINT |
INT |
BIGINT |
FLOAT |
DOUBLE |
BOOLEAN |
STRING |
TIMESTAMP |
BINARY |
集合数据类型
类型 |
---|
ARRAY |
MAP |
STRUCT |
第八章 Spark
特点
运行速度快:Spark使用先进的有向无环图执行引擎,在内存中运算
容易使用:Scala、Java、Python、R
通用性
运行模式多样
Spark和Hadoop对比
hadoop缺点 | Spark优点 |
---|---|
表达能力有限 | 除了MapReduce操作还多种数据集操作类型 |
磁盘IO开销大 | Spark在内存中计算 |
延迟高 | 采用DAG的任务调度机制 |
Spark可以对批量数据、流数据进行处理,还可以对历史数据进行查询;设计理念:一个软件栈满足不同的应用场景
Spark的架构设计
Executor优点
1)、利用多线程来执行具体任务,减少任务的启动开销
2)、Executor中有一个BlockManager存储模块,会将内存和磁盘共同作为存储设备,有效减小IO开销;在交互式查询场景下,预先将表存储到存储系统上可以提高I/O的性能
在spark中一个应用对应一个控制节点和若干个作业,一个作业由多个阶段构成,一个阶段由多个任务构成;以Executor形式请求资源,资源包括代码和文件等等
RDD
1)、RDD是只读记录分区的集合,不能直接修改;
2)、RDD支持数据运算的操作:行动(Action)和转化(Transformation)两种类型;行动操作执行运算并指定输出的形式,转换操作指定RDD之间的关系
3)、转换操作(map、filter、groupBy、join)接受RDD并返回RDD;行动操作(count、collect)接收RDD返回非RDD(输出特定的值)
4)、RDD比较适合对集中的数据集中的元素执行相同操作的批处理式应用。
5)、RDD的特性
- 高容错性:RDD不需要通过数据冗余的方式实现容错,只需要通过RDD父子依赖重新计算得到丢失的数据
- 中间结果持久化到内存
- 存放的数据可以是Java对象,避免不必要的对象的序列化和反序列化的开销
6)、RDD之间的依赖关系 - 宽依赖:一子对多父,主要操作GroupBy、join
- 窄依赖:一父对一子,主要操作filter、join、map、union
7)、RDD的阶段划分:在DAG中进行反向解析,遇到宽依赖进行断开,遇到窄依赖尽量规划到一个阶段中