GitChat 做者:Lee
原文:一步一步学习大数据:Hadoop 生态系统与场景
关注公众号:GitChat 技术杂谈,一本正经的讲技术html
究竟是业务推进了技术的发展,仍是技术推进了业务的发展,这个话题放在何时都会惹来一些争议。node
随着互联网以及物联网的蓬勃发展,咱们进入了大数据时代。IDC预测,到2020年,全球会有44ZB的数据量。传统存储和技术架构没法知足需求。在2013年出版的《大数据时代》一书中,定义了大数据的5V特色:Volume(大量)、Velocity(高速)、Variety(多样)、Value(低价值密度)、Veracity(真实性)。git
当咱们把时间往回看10年,来到了2003年,这一年Google发表《Google File System》,其中提出一个GFS集群中由多个节点组成,其中主要分为两类:一个Master node,不少Chunkservers。以后于2004年Google发表论文并引入MapReduce。2006年2月,Doug Cutting等人在Nutch项目上应用GFS和 MapReduce思想,并演化为Hadoop项目。算法
Doug Cutting曾经说过他很是喜欢本身的程序被千万人使用的感受,很明显,他作到了;下图就是本尊照片,帅气的一塌糊涂sql
2008年1月, Hadoop成为Apache的开源项目。数据库
Hadoop的出现解决了互联网时代的海量数据存储和处理,其是一种支持分布式计算和存储的框架体系。假如把Hadoop集群抽象成一台机器的话,理论上咱们的硬件资源(CPU、Memoery等)是能够无限扩展的。编程
Hadoop经过其各个组件来扩展其应用场景,例如离线分析、实时处理等。缓存
本文主要是依据Hadoop2.7版本,后面没有特殊说明也是按照此版本安全
HDFS,Hadoop Distributed File System (Hadoop分布式文件系统)被设计成适合运行在通用硬件(commodity hardware)上的分布式文件系统。它和现有的分布式文件系统有不少共同点,例如典型的Master/Slave架构(这里不许备展开介绍);然而HDFS是一个高度容错性的系统,适合部署在廉价的机器上。数据结构
关于HDFS主要想说两点。
只有深入理解了这两点才能理解为何Hadoop有着高度的容错性,高度容错性是Hadoop能够在通用硬件上运行的基础。
Yarn,Yet Another Resource Negotiator(又一个资源协调者),是继Common、HDFS、MapReduce以后Hadoop 的又一个子项目。Yarn的出现是由于在Hadoop1.x中存在以下几个问题:
Yarn经过拆分原有的JobTracker为:
由Yarn专门负责资源管理,JobTracker能够专门负责做业控制,Yarn接替 TaskScheduler的资源管理功能,这种松耦合的架构方式 实现了Hadoop总体框架的灵活性。
Hive的是基于Hadoop上的数据仓库基础构架,利用简单的SQL语句(简称HQL)来查询、分析存储在HDFS的数据。而且把SQL语句转换成MapReduce程序来数据的处理。
Hive与传统的关系数据库主要区别在如下几点:
HBase,是Hadoop Database,是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统。它底层的文件系统使用HDFS,使用Zookeeper来管理集群的HMaster和各Region server之间的通讯,监控各Region server的状态,存储各Region的入口地址等。
HBase是Key-Value形式的数据库(类比Java中的Map)。那么既然是数据库那确定就有表,HBase中的表大概有如下几个特色:
面向列:面向列(族)的存储和权限控制,列(族)独立检索。
Spark是由伯克利大学开发的分布式计算引擎,解决了海量数据流式分析的问题。Spark首先将数据导入Spark集群,而后再经过基于内存的管理方式对数据进行快速扫描 ,经过迭代算法实现全局I/O操做的最小化,达到提高总体处理性能的目的,这与Hadoop从“计算”找“数据”的实现思路是相似的。
Phoneix
基于Hbase的SQL接口,安装完Phoneix以后能够适用SQL语句来操做Hbase数据库。
Sqoop
Sqoop的主要做用是方便不一样的关系数据库将数据迁移到Hadoop,支持多种数据库例如Postgres,Mysql等。
规划这件事情并无最优解,只是在预算、数据规模、应用场景下之间的平衡。
Raid
首先Raid是否须要,在回答这个问题以前,咱们首先了解什么是Raid0以及Raid1。
Raid0是提升存储性能的原理是把连续的数据分散到多个磁盘上存取,这样,系统有数据请求就能够被多个磁盘并行的执行,每一个磁盘执行属于它本身的那部分数据请求。这种数据上的并行操做能够充分利用总线的带宽,显著提升磁盘总体存取性能。(来源百度百科)
当Raid0与Hadoop结合在一块儿会产生什么影响呢?
优点:
然而在Hadoop系统中,当Raid0中的一块磁盘数据出现问题(或者读写变得很慢的时候)时,你须要从新格式化整个Raid,而且数据须要从新恢复到DataNode中。整个周期会随着数据的增长而逐步增长。
其次Raid0的瓶颈是Raid中最慢的那一块盘,当你须要替换其中最慢的那一块盘的时候就会从新格式化整个Raid而后恢复数据。
RAID 1经过磁盘数据镜像实现数据冗余,在成对的独立磁盘上产生互 为备份的数据。当原始数据繁忙时,可直接从镜像拷贝中读取数据,所以RAID 1能够提升读取性能。RAID 1是磁盘阵列中单位成本最高的,但提供了很高的数据安全性和可用性。当一个磁盘失效时,系统能够自动切换到镜像磁盘上读写,而不须要重组失效的数据。(来源百度百科)
因此Raid1的本质是提升数据的冗余,而Hadoop自己默认就是3个副本,因此当存在Raid1时候,副本数将会变成6,将会提升系统对于硬件资源的需求。
因此在Hadoop系统中不建议适用Raid的,其实更加推荐JBOD,当一块磁盘出现问题时,直接unmount而后替换磁盘(不少时候直接换机器的)。
集群规模及资源
这里主要依据数据总量来推算集群规模,不考虑CPU以以及内存配置。
通常状况来讲,咱们是根据磁盘的的需求来计算须要机器的个数。
首先咱们须要调研整个系统的当量以及增量数据。
举个例子来讲,假如如今系统中存在8T的数据,默认副本数为3,那么所须要的存储=8T*3/80% = 30T左右。
每台机器存储为6T,则数据节点个数为5。
加上Master节点,不考虑HA的状况下,大概是6台左右机器。
根据业务需求是否须要配置HA方案进行划分,因为实际场景复杂多变,下面方案仅供参考。
1.非HA方案
通常考虑将全部的管理节点放在一台机器上,同时在数据节点上启动若干个Zookeeper服务(奇数)。
2.HA方案
在HA方案中,须要将Primary Node 与Standby Node 放在不一样的机器上,通常在实际场景中,考虑到节省机器,可能会将不一样的组件的Master节点进行交叉互备,如A机器上有Primary NameNonde 以及 Standby HMaster ,B机器上有Standby NameNode 以及 Primary Master。
其实在上面的Hadoop概要上咱们就能够看到Hadoop当初的设计目标是什么。Hadoop在不少场合下都是大数据的代名词。其主要是用来处理半结构以及非结构数据(例如MapReduce)。
其本质也是经过Mapreduce程序来将半结构化或者非结构化的数据结构化继而来进行后续的处理。
其次因为Hadoop是分布式的架构,其针对的是大规模的数据处理,因此相对较少的数据量并不能体现Hadoop的优点。例如处理GB级别的数据量,利用传统的关系型数据库的速度可能相对较快。
基于上述来看Hadoop的适用场景以下:
Hadoop由主要由两部分组成:
HDFS主要由NameNode(Master)以及DataNode(Slave)组成。前者主要是对命名空间管理:如对HDFS中的目录、文件和块作相似 文件系统的建立、修改、删除、列表文件和目录等基本操做。后者存储实际的数据块,并与NameNode保持必定的心跳。
MapReduce2.0的计算框架本质是有Yarn来完成的,Yarn是关注点分离的思路,由Yarn专门负责资源管理 ,JobTracker能够专门负责做业控制,Yarn接替 TaskScheduler的资源管理功能,这种松耦合的架构方式 实现了Hadoop总体框架的灵活性。
MapReduce可谓Hadoop的精华所在,是用于数据处理的编程模型。MapReduce从名称上面能够看到Map以及Reduce两个部分。其思想相似于先分后合,Map对与数据进行抽取转换,Reduce对数据进行汇总。其中须要注意的是Map任务将输出结果存储在本地磁盘,而不是HDFS。
在咱们执行MapReduce的过程当中,根据Map与数据库的关系大致上能够分为三类:
从上述几种能够看出来,假设一个MapReduce过程当中存在大量的数据移动对于执行效率来讲是灾难性。
从数据流来看MapReduce的关系大致能够分为如下几类:
然而不管什么MapReduce关系如何,MapReduce的执行流程都以下图所示:
其中在执行每一个Map Task时,不管Map方法中执行什么逻辑,最终都是要把输出写到磁盘上。若是没有Reduce阶段,则直接输出到HDFS上。若是有Reduce做业,则每一个Map方法的输出在写磁盘前线在内存中缓存。每一个Map Task都有一个环状的内存缓冲区,存储着Map的输出结果,默认100m,在每次当缓冲区快满的时候由一个独立的线程将缓冲区的数据以一个溢出文件的方式存放到磁盘,当整个Map Task结束后再对磁盘中这个Map Task产生的全部溢出文件作合并,被合并成已分区且已排序的输出文件。而后等待Reduce Task来拉数据。
上述这个过程其实也MapReduce中赫赫有名的Shuffle过程。
原始的数据文件是普通的文本文件,每一行记录中存在一个年份以及改年份中每一天的温度。
Map过程当中,将每一行记录都生成一个key,key通常是改行在文件中的行数(Offset),例以下图中的0,106表明第一行、第107行。其中粗体的地方表明年份以及温度。
该过程当中获取所要的记录组成键值对{年份,温度}。
将上一步过程当中的相同key的value组成一个list,即{年份,List<温度>},传到Reduce端。
Reduce端对list进行处理,获取最大值,而后输出到HDFS中。
上述过程进行总结下来流程以下: