大数据主要解决海量数据采集、存储和分析计算问题。
1、Volume(大量):海量数据存储
2、Velocity(高速):快速计算
3、Variety(多样):数据多样,海量数据采集
4、Value(低价值密度):快速对有价值数据“提纯”
Hadoop是一个由Apache基金会所开发的分布式系统基础架构,主要解决 海量数据的存储和 海量数据的分析计算问题。
Hadoop优势
1、高可靠性:hadoop底层维护多个数据副本;
2、高扩展性:在集群中分配任务数据,可方便的拓展数以千计的结点;
3、高效性:在MapReduce的思想下,hadoop是并行工作的,以加快任务处理速度;
4、高容错性:能够自动将失败的任务重新分配。
hadoop1.x组成:MapReduce(计算+资源调度)
hadoop2.x组成:MapReduce(计算)+yarn(资源调度)
HDFS架构
定义:
hadoop Distributed File System,简称HDFS,是一个分布式文件系统。用于存储文件,通过目录树来定位文件;它是分布式的,由很多服务器联合起来实现其功能,集群中的服务器有各自的角色。
使用场景:适合一次写入,多次读出的场景。一个文件经过创建、写入和关闭之后就不需要改变。
数据存储在什么位置?
1、NameNode(nn):存储文件的元数据,如文件名、文件目录结构、文件属性(生成时间、副本数、文件权限)、以及每个文件的快列表和块所在的DataNode等。
2、DataNode:在本地文件系统存储文件块数据、以及块数据的校验和。
3、secondaryNameNode(2nn):每隔一段时间对NameNode元数据备份。并非NameNode的热备。当NameNode挂掉的时候,它并不能马上替换NameNode并提供服务
HDFS中的文件在物理上是分块存储(Block),块的大小可以通过配置参数(dfs.blocksize)来规定,默认大小在hadoop2.X/3.X中是128M,1.X版本中是64M。寻址时间为传输时间的1%时为最佳状态。
为什么快的大小不能设置太大或太小?
- HDFS的块设置的太小,会增加寻址时间,程序一直在找块的开始位置;
- 快太大,从磁盘传输数据的时间会明显大于定位这个块开始位置所需的时间。导致程序在处理这块数据时会非常慢。
- HDFS快的大小主要取决于磁盘传输速率
HDFS写数据流程:
HDFS优缺点
优点
- 高容错性:数据自动保存多个副本;某一个副本丢失后,可以自动回复。
- 适合处理大数据:数据规模大,文件规模多。
- 可架构在廉价的机器上,通过多幅本机制提高可靠性。
缺点
- 不适合低延时数据访问
- 无法高效的对大量小文件进行存储:会占用NameNode大量的内存来存储文件目录和块信息;小文件存储的寻址时间会超过读取的时间,违反了HDFS的设计目标。
- 不支持并发写入、文件随机修改:一个文件只能有一个写,不允许多个线程同时写;仅支持数据的append(追加),不支持文件的随机修改。
HDFS的shell操作
基本语法
$ hadoop fs 具体命令
$ hdfs dfs 具体命令
两者完全一样
上传
1、-moveFormLocal:本地剪切粘贴到HDFS
$hadoop fs -moveForLocal 本地文件路径 HDFS路径
2、-copyFromLocal:从本地文件系统中拷贝文件到HDFS路径去
$hadoop fs -copyForLocal 本地文件路径 HDFS路径
3、-put:等同于copyFromLocal,生产环境更习惯用put,与-copyFromLocal一样
$hadoop fs -put 本地文件路径 HDFS路径
4、-appendToFile:追加一个文件到已经存在的文件末尾
$hadoop fs -appendToFile 本地文件路径 HDFS路径
下载
1、-copyToLocal:从HDFS拷贝到本地
$hadoop fs -copyToLocal HDFS路径 本地文件路径
2、-get :等同于copyToLocal,生产环境更习惯用get
$hadoop fs -get HDFS路径 本地文件路径
HDFS直接操作
1、-ls:显示目录信息
$hadoop fs -ls HDFS路径
2、-cat:显示文件内容
$hadoop fs -cat HDFS路径
3、-chgrp、-chmod、-chown:Linux文件系统中的用法一样,修改文件所属权限
$hadoop fs -chmod 666 HDFS路径
$hadoop fs -chown 用户:用户组 文件或文件夹
4、-mkdir:创建路径
$hadoop fs -makdir HDFS路径
5、-cp:从HDFS的一个路径拷贝到HDFS的另一个路径
$hadoop fs -cp 源路径 目标路径
6、-mv:在HDFS目录中移动文件
$hadoop fs -mv 源路径 目标路径
7、-tail:显示一个文件的末尾1Kb的数据
$hadoop fs -tail 文件路径
8、-rm:删除文件或文件夹
$hadoop fs -rm 文件路径
9、-rm -r :递归删除目录及目录里面的内容
$hadoop fs -rm -r 文件路径
10、-du统计文件夹的大小信息
查看文件夹总大小
$hadoop fs -du -s -h 文件夹路径
查看文件夹具体大小信息
$hadoop fs -du -h 文件夹路径
11、-setrep:设置HDFS中文件的副本数量
文件设置10个副本
$hadoop fs -setrep 10 文件路径
设置的副本数只是记录在NameNode的元数据中,是否真的有那么多副本,还得看DataNode的数量。因为目前只有3台设备,最多3个副本,只有结点数的副本增加到10台时,副本数才能达到10。
HDFS的API操作
yarn架构
yet Another Resource Negotiator简称yarn,另一种资源协调者,是hadoop的资源管理器,管理cpu和内存。
1、resourceManager(RM):管理整个集群资源(内存,CPU等)
2、NodeManage(NM):管理单个节点服务器资源
3、ApplicationMaster(AM):管理单个任务运行
4、Container:容器,相当于一台独立的服务器,里面封装了任务运行所需要的资源,如内存、cpu、磁盘、网络等。、
MapReduce架构
MapReduce是一个分布式运算程序的编程框架,是用户开发“基于Hadoop的数据分析应用”的核心。核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个Hadoop集群上
优点:
1、易于编程:用户只关心业务逻辑。实现框架的接口;
2、良好的扩展性:可以动态增加服务器,解决计算资源不够问题;
3、高容错性:任何一台机器挂掉,可以将任务转移到其他结点。
4、适合海量数据计算(TB/PB)、几千台服务器共同计算。
缺点:
1、不擅长实时计算,Mysql擅长
2、不擅长流式计算,Sparkstreaming、flink擅长
3、不擅长DAG有向无环图计算,spark擅长
MapReduce将计算过程分为两个阶段:Map和Reduce
1、Map阶段并行处理输入数据;
2、Reduce阶段对Map结果进行汇总
MapReduce进程
一个完整的MapReduce程序在分布式运行时有三类实例进程:
(1)MrAppMaster:负责整个程序的过程调度及状态协调;
(2)MapTask:负责Map阶段的整个数据处理流程;
(3)ReduceTask:负责Reduce阶段的整个数据处理流程。
常用数据类型:
MapReduce编程规范
用户编写的程序分成三个部分:Mapper、Reducer和Driver。
Mapper阶段:
(1)用户自定义的Mapper要继承自己的父类;
(2)Mapper的输入数据是KV对的形式(KV的类型可自定义);
(3)Mapper中的业务逻辑写在map()方法中; (4)Mapper的输出数据是KV对的形式(KV的类型可自定义);
(5)Map()方法(MapTask进程)对每一个<K,V>调用一次。
Reducer阶段:
(1)用户自定义的Reducer要继承自己的父类;
(2)Reducer的输入数据类型对应Mapper的输出数据类型,也是KV;
(3)Reducer的业务逻辑写在reducer()方法中;
(4)ReduceTask进程对每一组相同的<k,v>组调用一次reduce()方法。
Driver阶段:
相当于YARN集群的客户端,用于提交我们整个程序到YARN集群,提交的是封装了MapReduce程序相关运行参数的job对象。
排序
MapTask和ReduceTask均会对数据按照key进行排序。该操作属于Hadoop的默认行为。任何应用程序中的数据均会被排序,而不是逻辑上是否需要。(默认排序是按照字典顺序排序,且实现该排序的方法是快速排序)
大数据技术生态体系
HBase
Apache Hbase(hadoop database)是以hdfs(不能够修改数据,只能删除重写或追加写)为数据存储基础的,一种分布式、可拓展的NoSQL数据库。
Hbase数据模型
HBase数据模型的关键在于稀疏、分布式、多维、排序的映射。其中映射map指代非关系型数据库中的key-Value结构。
- Hbase的设计理念依据Google的BigTable论文。Bigtable是一个稀疏的、分布式的、持久的多维排序map;
- 对于map映射解释:该映射由行键、列键和时间戳索引;映射中的每个值都是一个未解释的字节数组。
- HBase使用与Bigtable非常相似的数据模型。用户将数据行存储在带标签的表中。数据行具有可排序的键和任意数量的列。该表存储稀疏,因此同一表中的行可以具有疯狂变化的列。
HBase物理存储结构
- 由于hdfs不能够修改数据,只能删除重写或追加写,所以可以通过不同版本的数据根据Timestamp(时间戳)进行区分读取数据默认读取最新的版本。
- Type对于删除操作,其 类型为DeleteColumn 。
数据模型
- Name Space命名空间
类似于数据库中database概念,每个命名空间下有多个表。HBase有两个自带的命名空间,分别是hbase和default,hbase中存放的是HBase内置的表,default表示用户默认使用的命名空间。- Table
类似于关系数据库中表的概念。不同的是,HBase定义表时只需要声明列族即可,不需要声明具体的列。因为数据存储时是稀疏的,所有往HBase写入数据时,字段可以动态、按需指定。- Row
HBase表中的每一行数据都由一个RowKey和多个Column(列)组成,数据时按照RowKey的字典顺序存储的,并且查询数据时只能根据RowKey进行检索。- Column
HBase中的每个列都由column family(列族)和列限定符(列名column Qualifier)进行限定,列如info:name,info:age。建表时,只需要指明列族,而列名无须预先定义。- Time Stamp
用于标识数据的不同版本(version),每条数据写入时,系统会自动为其加上字段,其值为写入HBase的时间。- cell
由{rowkey、column family:column Qualifier,timestamp}唯一确定的单元。
基础架构
Spark任务
Spark是一种由Scala语言开发的基于内存的快速、通用、可扩展的大数据分析计算引擎,主要功能主要用于数据计算。
MapReduce由于其设计初衷并不是为了满足循环迭代式数据流处理,因此在多并行的数据可复用场景中存在诸多计算效率等问题。所以Spark应运而生,Spark就是在传统的MapReduce计算框架的基础上,利用其计算过程的优化,从而大大加快了数据分析、挖掘的运行和读写速度,并将计算单元缩小到更合适并行计算和重复使用的RDD计算模型。
hadoop:
spark:
Spark和hadoop的根本差异是多个作业之间的数据通信问题:Spark多个作业之间数据通信时基于内存的,Hadoop是基于磁盘。但是Spark是基于内存的,所以在实际的生产环境中,由于内存的限制,可能会由于内存资源不够导致Job执行失败,此时,MapReduce其实是一个更好的选择,所以Spark并不能完全代替MR。