在课程前面声明:
首先要说的是,本课程是根据
本课程专注于HADOOP运维相关知识,但也涉及到简单开发,主要目的是能够帮助运维人员快速上手hadoop运维,并解决相当一部分问题,请专业大数据开发人员不要误入歧途
下面我们会用几个课时来介绍hadoop的原理知识,为了保证知识的可信度和尽量减少因为个人理解造成的误区,我们原理部分的讲义几乎全部来自hadoop官网及hadoop权威指南这本书
Hadoop原理对于初次接触hadoop的工程师来说尤为重要,原理是枯燥的,但往往枯燥的才是不经过渲染的精华,但我仍然会尽量通过使用恰当的例子和画图的方式来帮助大家理解,本教程中自己创作的图片超过50张
同时博主正在做500台Hadoop集群的搭建工作,我们会拿出100台来为大家展示大规模CDH集群的搭建及维护细节,详见后面文章
大数据其实我们可以简单的理解为大量数据
为什么会有大数据诞生呢?因为之前处理和存储数据的方式只适用于少量数据,当数据规模增大时,之前的方式及工具就会出现各种问题,甚至完全无法处理,那么在这个基础上我们出现了大规模数据的存储+分析+计算的工具→HADOOP
我们举个例子:
你家是开小卖部的,那你记账和总账就使用一根笔和一个笔记本就好了
但是如果你家开了一个小超市,那就需要使用计算器了
但是如果你家开了个连锁超市,那就需要使用收银系统了
对数据来说也是一样:
如果你写了一句话,我要求你统计下里面有多少句号,你可能数数就行了
如果你写了一个作文,我要求你统计下这本书里有多少句号,你可能就得多找两个人了
如果是四大名著呢?
存储 && 分析
Hadoop就是为了解决 大量数据的存储及分析的问题
数据结构分类
在详细介绍大数据之前,我们来说一下我们数字世界的数据种类:
数据种类分为:
结构化数据:mysql
mysql在数据库容量达到T级别,就会初显瓶颈,随着数据量增大,问题会越 来越多,这也从一个侧面体现了DBA的价值半结构化数据:
例如电子表格,它在结构上是由单元格组成的网格,但是每个单元格内部可以保存任意格式的数据非结构化数据:
例如日志信息(纯文本)、图片等
我们会碰到好多半结构化数据和非结构化数据,这些数据存储是个问题,例如日志,你要如何存储它?你不能把它存储在mysql中吧,我们现在有ELK,可以把日志通过索引的方式存储。
但是其他的非结构化数据与半结构化数据呢?
如何把这些数据存储下来,并且能够完成高效的按需检索功能呢?
如何存储与分析大量非结构化与半结构化数据呢?
在回答这个问题之前,我们给这个问题增加一个前置条件
这里的数据大小我们以PB为单位, 1PB=1000TB=1000000GB,你以为很多了吗??
我们来看一个数据,数据来源是《HADOOP权威指南》
2006年数字世界项目统计得出全球数据总量为0.18ZB,并预测2011年达到1.8ZB(相当于10亿TB)
相当于每个人都产生了1TB的数据容量
关键问题是现在是2017年。。。。。what the fuck
现在我让你来分析这个等级的数据,告诉我你用什么工具??
mysql??ELK??
再假如说mysql与ELK的软件性能没有问题,但是你用什么机器进行分析呢?
硬盘的限制: 1TB的硬盘目前是主流,但其数据传输速度约为100MB/s,
读完整个硬盘数据至少需要花2.5小时,写入就别提了
hadoop思想
分布式存储与并行读取的思想(HDFS)
一个很简单的提高读取速度的方式就是并行从多个硬盘上读取数据
试想,如果我们有100个硬盘,每个硬盘存储1%的数据,并行读取,那么不到2分钟就读取完了所有数据
这就像我们平常所说的raid0 一样
但是仅使用硬盘容量的1%是不是很浪费啊,但是我们可以存储100个不同类型的1T大小的数据,实现共享硬盘的读取,每个类型的数据我们称为数据集
虽然如此,但要对多个硬盘的数据并行读取,还有更多的问题需要解决
第一个问题:
硬件故障:按照上面的理论,我把1T数据分散在100块硬盘上,但是其中一块硬盘故障了怎么办呢?
为了解决这个问题,我们最常用的解决办法就是复制(replication),系统保存数据的副本,一旦有故障
就会使用另外的副本
比如说kafka、raid、ELK,这个在我发布的其他课程中都可以见到
hadoop 文件系统(HDFS hadoop Distributed FIleSystem)也是这一类的
第二个问题:
第二类问题是大多数分析任务是需要以某种方式结合大部分数据来共同完成分析,即从一块硬盘读取的数据
需要与从另外99块硬盘中读取的数据结合使用
mapreduce思想
按照上面的说法一块硬盘读取的数据需要与从另外99块硬盘中读取的数据结合使用之后才可以用来分析。
那么你分析下上面方式的痛点在哪里呢???
首先我们用好多台服务器来存储数据,HDFS又将数据分成不同的块,存储的不同的机器上,我们的服务器在机房内是按照机柜进行分隔的,如果我做一个简单运算都需要调用其他机柜服务器的数据,那么网络带宽是最大瓶颈。
网络带宽是数据中心最宝贵的资源(到处复制数据很容易耗尽网络带宽),
HADOOP 将mapreduce的输入数据划分成等长的小数据块,称为输入分片(input split),HADOOP 为每个分片构建一个map任务,并由该任务来运行用户自定义的map函数
Hadoop在存储有输入数据(HDFS中的数据)的节点上运行map任务,可以获得最佳性能,这就是我们所说的“”数据本地优化“”,(data locality optimization),因此它无需使用宝贵的集群带宽资源
mapreduce 尽量在计算节点上存储数据,以实现数据的本地快读访问,数据本地化(data locality)特性是mapreduce的核心特性,并因此而获得很好的性能。
mapreduce 提出一个编程模型,该模型抽象出这些硬盘读写问题,并将其转化为一个数据集的计算,这样的计算由map和reduce两部分组成
mapreduce形象举例
如果上面的文字比较晦涩难懂,希望下面的例子能够帮助你:
我们要数图书馆中的所有书。你数1号书架,我数2号书架。这就是“Map”。我们人越多,数书就更快。
现在我们到一起,把所有人的统计数加在一起。这就是“Reduce”。
总结
总而言之,hadoop为我们提供了一个可靠的共享存储及分析系统,HDFS实现了数据的存储,Mapreduce实现了数据的分析和处理,虽然hadoop还有其他功能,但HDFS与MAPREDUCE是它的核心价值