1、hadoop的产生?
是指传统的数据处理应用软件不足以处理(存储和计算)他们的大而复杂的数据
2、单位的衡量:bit 、byte、KB、MB、GB、TB、PB、EB、ZB、YB、BB、NB、DB
据国际数据公司(IDC)统计,全球数据总量预计 2020 年达到 44ZB,中国数据量将达到 8060EB,
占全球数据总量的 18%
3、大数据特点:容量大、种类多、速度快、价值高
总结:
1、数据量大,处理难度大,但是蕴含价值也大
2、数据种类多样,更加个性化,针对不同数据源进行多样化的方式处理,结果更精确
3、要求对数据进行及时处理,追求更极致更完善的用户体验
4、数据成为新的资源,掌握数据就掌握了巨大的财富
大数据崛起的根本原因:
1、数据生成的速度呈指数式爆炸增长
2、数据的存储成本指数下降
3、流动数据增加,云端数据增加
4、企业可用数据资源增大
4、hadoop是什么?
是 Apache 旗下的一套开源软件平台。利用服务器集群,根据用户的自定义业务逻辑,对海量数据进行分
布式处理。核心组件有:
A .Common (基础 功能 组件)(工具包,RPC 框架)JNDI 和 RPC
B .HDFS (Hadoop Distributed File System 分布式文件系统)
C .YARN (Yet Another Resources Negotiator 运算资源调度系统)
D .MapReduce (Map 和 和 Reduce 分布式运算编程框架)
重点组件:
HDFS:Hadoop 的分布式文件存储系统
MapReduce:Hadoop 的分布式程序运算框架,也可以叫做一种编程模型
Hive:基于 Hadoop 的类 SQL 数据仓库工具
HBase:基于 Hadoop 的列式分布式 NoSQL 数据库
ZooKeeper:分布式协调服务组件
Mahout:基于 MapReduce/Flink/Spark 等分布式运算框架的机器学习算法库
Oozie/Azkaban:工作流调度引擎
Sqoop:数据迁入迁出工具
Flume:日志采集工具
5、各个组件之间的作用
hadoop的主要的计算引擎是MapReduce,MapReduce的实现需要用代码进行编写,对开发人员的代码编写能力要求比较高,所有出现了HIve,hive是对MapReduce 的简化,简化成一种类似于MySQL的查询语句(MySQL 的计算引擎是executor)。使用简单的语句就可以完成大量的代码。HDFS是hadoop的文件存储系统,其中的文件大多为文档类型的,而hive的存储是结构化数据,可以由二维表的格式描述。
但是HDFS中的数据,只允许读取,追加,删除而不允许修改,HIve中的数据又都是结构化数据,而现实中有很多的数据使用二维表的格式会浪费很多存储空间(数据中有很多NULL值),也就是半结构化数据,于是就有了HBase,HBase兼容两者的缺陷,其中的数据可以修改,其存储的格式是列簇和行键。
在实际的应用中,会将采集到的原始数据先存储在HDFS中,原始数据经过稍微处理后还会再存储一份到HDFS中。原始数据预处理完成会存储到HBase中,再将hive整合到HBase上,实时的进行查询。
flume-------->HDFS(两份)--------->Hbase---------->Hbase整合hive
6、MapReduce的执行过程
1)maptask(每一个brock会产生一个maptask)会采集map()产生的K-V对值,放到环形缓冲缓冲区中
2)环形缓冲区的默认内存是100M,阈值是0.8,是一个字节数组,其中有一个赤道,将环形缓冲区分为两个部分,上半部分存放原始数据,下半部分存放元数据。原始数据就是K-V数据,每一个数据的字节数是不定的。元数据是由K的起始位置、V的起始位置、V的长度和分区的信息四部分组成,每一部分都是16个字节,每一个元数据就是16*4字节。默认情况下每一个brock是128M,环形缓冲区能写的最大的值是80M,每写入一个原始数据就会有一个相对应的元数据,理论上会写入的原始数据可能只有40M,当写入达到最大的值时就会产生溢出文件(将环形缓冲区的数据写入到磁盘中),在写入磁盘之前会先根据分区进行排序(对元数据用快速排序),再根据K排序,一个brock的大小是128M,数据写入40M左右就会溢出,理论一个brock块会产生三个溢出文件,分区的个数需要自己指定
缓冲区的大小可以通过参数调整,参数:mapreduce.task.io.sort.mb 默认 100M
缓冲区的溢写比也可以通过参数调整,参数:mapreduce.map.sort.spill.percent 默认 0.8
3)一个brock溢出的三个小文件会合并成一个大文件,也会先根据分区进行排序,再根据K排序(使用归并排序)
4)每一个brock都会产生一个大文件,reducetask会根据自己的分区号,主动的抓取所有大文件的相应分区数据,同一个分区来自不同的文件,也会进行合并排序
5)reducetask每个分区产生一个输出文件,这个就是最终的文件
一个分区------->一个reduceTask(默认一个)----------->一个输出文件
自定义分区返回值:return N--------------------> 对应文件是part-r-0000N (N=0,1,2.......)
若有N个连续的返回值,则必须定义reducetask的个数是N,若小于N就会有数据丢失
若有N个不连续的返回值,则必须定义reducetask的个数是N个数中最大值