Hadoop 基础知识
大数据已经火了很长很长时间了,从最开始是个公司都说自己公司的数据量很大,我们在搞大数据。到现在大数据真的已经非常成熟并且已经在逐渐的影响我们的生产生活。你可能听过支付宝的金融大数据,滴滴的出行大数据以及其他的诸如气象大数据等等,我们每个人都是数据的制造者,以后又将享受大数据技术所带来的生活的便利。
作为一个IT相关的从业人员,你肯定听过Hadoop,Spark了。毕竟技术在发展,现在大家上班下班地铁公交都交流啥,机器学习,人工智能,AI,搞大数据都不太敢说话。为啥,因为技术实在是发展太快了。。。有点跟不上节奏。但是现在大数据已经非常成熟了,而且是所谓的机器学习,人工智能的基础。所以,如果有想法赶紧学习学习吧。
大数据到底是啥?大数据是一个概念也是一门技术,它是在以Hadoop为代表的大数据平台框架上进行各种数据分析的技术。大数据包括以Hadoop和Spark为代表的基础大数据框架,还包括实时数据处理,离线数据处理,数据分析,数据挖掘和用机器算法进行预测分析等技术。 说通俗点,就是大量数据进行 数据存储,数据清洗,数据分析,数据处理,数据应用 的技术就是大数据。
我曾拜读过云戒大神的全栈大数据一书,该书中简单概要的描述了互联网的发展,大数据是其中非常重要的一环。大家可以看下图哈。
由图片看到啊,互联网往小了发展是移动互联网,之前移动互联网多么火造就了多少独角兽公司就不用多介绍了吧。现在的物联网也是站在了风口之上,各种可穿戴设备层出不穷。互联网往大了发展呢,第一步是云计算。云计算相信大家都用过,阿里云,aws,虽然收费越来越贵但是确实解决了很多问题。然后就是大数据了。所以大数据还是顺应了技术发展的潮流,也不枉他在我们IT圈口口相传火了这么多年。所以大数据是一个很有钱途的方向。
我们在介绍大数据的定义的时候反复的提到了Hadoop框架,那么作为大数据的代表性技术框架,我们必须要学好,用好它。接下来,我们就来简单看一下Hadoop框架。
-
Hadoop是一个开源的大数据框架
-
Hadoop是一个分布式计算的解决方案
-
Hadoop = HDFS(分布式存储服务) + MapReduce (分布式计算框架)
我们可以看出啊Hadoop包括两个核心,一个是HDFS一个是MapReduce。
问:假如你有一个10M的文件,你想过滤出含有Hadoop字符串的行,你会怎么做。
作为一个程序猿的你这时候就要秀一波操作了,你可能会用linux的grep命令。也可能去写几行代码搞一把。10M并不能让你感觉到绝望,那么10G呢,10T呢,甚至是10P呢。你会不会感觉到绝望?而Hadoop这两个核心就分别解决了上述的问题,HDFS解决了10T或者10P的数据存储的问题,MapReduce解决了分布式计算的问题,强强联手啊,能比较轻松的搞定令你感觉到绝望的问题。
HDFS
HDFS为什么是Hadoop的核心? 嗯,这个问题问得好。 因为存储是大数据的核心。 如果连数据存储都搞不定,你拿设么分析计算呢。要知道当我们入了大数据的门,我们接触的数据规模不局限于GB级了,我们可能会处理TB甚至是PB的数据,单机去存储几T的数据已经非常多了。如果是几PB的话单机是肯定搞不定的,所以HDFS帮你解决了这个问题。
我们都知道Hadoop的一大优点就是利用多个廉价的机器组成集群,HDFS就是将大量的数据存储到这成百上千的廉价的机器上,但是你访问的时候就跟使用本地文件一样的简单。比如你要访问一个/tmp/file1的文件,这个文件可能存储到了很多机器上。但是你是用户啊,用户就是上帝,你根本就不用管他怎么存的,存在哪。你只需要告诉HDFS你要这个文件就可以了。
对于HDFS啊,我这里只介绍三个重要的概念:数据块、NameNode、DataNode
数据块
如果我们对Hadoop有过了解的话我们都知道存储在HDFS上的数据都是按块存的。
数据块是什么?数据块是一个抽象的概念。
比如我们设置数据块的大小为128m,我们要存一个10m的文件,因为是按块存的 所以我们这个文件就独占了一个数据块。如果我们存储大小为300m的文件,那就会分成三个块进行存储。
那么按块存到底有什么好处呢, 首先 他屏蔽了文件这个概念,比如你存了一个200T的文件,这个文件大于你任意一个磁盘单个的大小,这种情况下你可以将整个文件分成n个数据块,然后存储到各个磁盘。这样就简化了存储系统的设计, 而且 我们知道为了保证数据安全我们肯定是要备份的, 而数据块它就非常适合用于数据备份,进而提供数据容错能力和可用性。
那么我们到底选择设置多大的数据块呢?数据块的默认大小是64M,一般我们会将他设置成128M。如果数据块的大小设置太小的话,那么对于一般的文件我们可能也需要按块进行存储了,这样的话当我们查询一个文件的时候就需要检索多个数据块的地址,这样效率不高,而且对NameNode的内存是一种极大的浪费。因为我们是通过NameNode去检索数据的,NameNode的内存中存储了数据块与文件和DataNode的映射,这个我们后面会提到。如果数据块设置太大的话,我们可能会遇到一些系统层面的问题,比如系统重启的时候需要重新加载数据,数据块越大恢复需要的时间越长。而且数据块过大对于并行的支持很差。 所以,一般我们都将其设置成128M。
NameNode 和 DataNode
我们都知道HDFS是分布式文件系统,既然是分布式那么一般是主从模式,那么谁是主,谁是从呢?NameNode就是主,而DataNode就是从。所以HDFS是由一个NameNode(Master)和多个DataNode(Slave)组成的。
NameNode 做了哪些工作
-
管理文件系统的NameSpace
-
维护着文件系统树以及文件树中所有的文件和文件夹的元数据(这些数据存储在内存中,也会持久化存储到磁盘)
-
记录着每个文件中各个块所在数据节点的位置信息,这些信息在DataNode启动的时候会发送给NameNode
DataNode 做了哪些工作
-
DataNode是文件系统的工作节点
-
负责存储和检索数据,并且将他所存储的块的列表发送给NameNode
既然有主从模式我们都要考虑如果Master也就是NameNode挂掉了怎么办,Hadoop2之后呢我们可以配置两个NameNode,一个处于active状态,一台处于standby状态。这样如果处于active状态的NameNode挂掉了,另外一台可以快速无缝的接手后续的工作。很大的程度上避免了单点问题的存在。
通过我们上面对HDFS进行的介绍,我们来总结一下HDFS的优缺点:
优点:
- 适合大数据存储,并有副本策略
- 可以构建在廉价的机器上,提供容错和恢复机制
- 提供流式文件访问,一次性写入,多次读取
那对应这三个优点呢 自然就会发现他的三个缺点:
- 不适合大量小文件存储
- 不适合并发写入,文件随机修改等场景, 一个文件只能有一个writer 只支持append
- 不适合随机读等低延时数据访问的场景。 本来就不是为这种场景设计的。
所以说,用不用Hadoop这头神象还是要根据具体的场景,具体的需求来考虑。 在合适的需求下用合适的工具才能达到合适的效果!
(未完待续,下节是HDFS的读写流程)