前言
在学习大数据之前,先要了解他解决了什么问题,能给我们带来什么价值。一方面,以前IT行业发展没有那么快,系统的应用也不完善,数据库足够支撑业务系统。但是随着行业的发展,系统运行的时间越来越长,搜集到的数据也越来越多,传统的数据库已经不能支撑全量数据的存储工作;另一方面,数据越来越多,单机的计算已经成为瓶颈。因此,基于分布式的大数据系统崭露头角。
在存储上,hdfs的分布式存储可以任意水平扩展,可以解决数据存储的难题。在计算上,从最初的MapReduce,把任务水平拆分,多台机器并行计算,再汇总结果;到基于Spark的内存计算,改造Mapreduce每次数据落盘以及编程方式的痛点。
有了存储和计算框架,周边就衍生出了很多管理、缓存相关的技术,比如:
- yarn解决多租户资源调度的难题,
- flume解决数据传输的难题,
- sqoop解决分布式存储数据与传统DB数据之间的转换,
- azkaban解决了大数据计算任务的调度,
- kafka提供了发布订阅机制的消息队列,
- zookeeper可以帮助用户完成主备的选举,
- hive在hdfs的基础上提供了数仓的功能,
- hbase则基于hdfs实现列式数据库....
上面都是hadoop生态的,由于hadoop中计算模型普遍是mapreduce,但是它的编程风格和计算机制让很多人使用不便。因此后来spark逐渐代替了mapr成为主流的计算框架。Spark也有它自己的生态,但是由于hadoop更多更早的被应用到企业,所以spark也可以无缝的集成hadoop生态中的产品。spark更多只是扮演一个计算的框架,在这个框架上,提供了基本的计算模块core,基于sql的计算引擎spark sql,对接实时数据的流式计算spark streaming,算法相关的mlib以及图计算相关的graphx。
这些框架都在这个大数据生态中扮演了自己重要的角色,他们协同工作就可以帮助我们解决很多难题。由于我也是接触不久,所以就按照自己学习和工作涉及的内容,在下面按照各个章节进行介绍,后续也会持续的更新。
hdfs
hdfs是大数据系统的基础,它提供了基本的存储功能,由于底层数据的分布式存储,上层任务也可以利用数据的本地性进行分布式计算。hdfs思想上很简单,它的基本架构包括client、namenode、datanode以及secondary namenode,namenode负责数据存储位置的记录(目录树)以及block块与datanode的映射关系,datanode负责实际block数据的存储。下载(读)文件时,client会先访问namenode询问数据存在哪,然后去datanode并行地读取数据;上传(写)文件也基本类似,会先在namenode上询问写到哪,然后客户端和datanode之间建立pipeline,数据以packet(64KB)的形式存储到对应的datanode上。所以namenode作为整个系统的灵魂,一旦它挂掉了,整个系统也就无法使用了。在运维中,针对namenode的高可用变得十分关键。
mapreduce
hadoop中负责计算的框架,它将用户写的硬编码和自身的组件整合起来,形成可以运行的MR程序。优点在于maptask和reducetask都是并行执行的,所以程序执行效率很高,但由于每次内存中的环形缓冲区空间不够就需要溢写磁盘,磁盘IO次数太多,自然效率也就降低了。mapreduce可以分成三个阶段 map阶段和reduce阶段,在他们中间还有shuffle阶段。学习的时候我们可以结合yarn,按照整个作业提交并运行,资源调度分配的流程进行学习。注意:在mr中,会启动三个进程MrAppMaster、MapTask以及ReduceTask
yarn
yarn是hadoop2.x版本才出现的,在2.x版本之前hadoop中的资源管理和调度是由mapreduce负责的。yarn的基本架构包括三个部分:resource manager、node manager、MrAppMaster以及container。resource manager相当于master负责整个集群资源的管理和调度,node manager相当于slave负责单个节点资源的管理,MrAppMaster负责向resource manager申请资源,并分配给container容器,container是对集群资源的解耦,具体资源包括CPU、网络、磁盘等。
在企业中,大数据的基础平台往往是多个用户共用的,那么如何管理资源的分配,就需要yarn来处理了。Yarn默认提供了三种资源分配的策略:
- FIFO:先进先出,即按照用户提交任务的时间分配资源
- Capacity:按照队列设置队列的大小
- Fair Share:也是基于队列,只不过资源的粒度更小。
常见可以用于分配的资源可以是节点的数量,内存的大小,也可以是CPU核数。
hive
hive基于hdfs构建了数据仓库系统,它以hdfs作为存储,依赖于数据库(嵌入式的数据库derby或者独立的数据mysql或oracle)存储表schema元数据信息,并完成基于sql自动解析创建mapreduce任务(由于mapreduce计算效率比较差,目前官方推荐的是底层计算模型采用tez或者spark)。所以hive可以理解为:hdfs原始存储+DB Schema信息存储+SQL解析引擎+底层计算框架组成的数据仓库。
spark
spark是现在大数据中应用最多的计算模型,它与java8的stream编程有相同的风格。封装了很多的计算方法和模型,以延迟执行的方式,在真正需要执行的时候才进行运算。既可以有效的做计算过程的容错,也可以改善我们的编程模型。因为spark底层使用的是scala编写的,最好学习一下scala这门语言。
sqoop
sqoop支持基于sql或者表名把关系型数据库中的数据存储到分布式文件系统中,数据库支持oracle\mysql等等,分布式文件系统可以是hdfs,hive,hbase等等,数据的导入时双向的,比如你可以读取oracle中的数据存储(导入)到hdfs,也可以把hdfs的数据导出到oracle。
hbase
HBase是基于Hdfs之上的列式数据库,基于文件分割以及rowkey的顺序存储,能快速索引查询数据。我这边是在推荐系统中,作为推荐结果存储引擎,不过由于内容比较碎片化,Hbase写入时间比较随意,因此总会出现大量超时现象,还在持续优化中
zookeeper
从名字来说他是动物园的管理员,实际上他是各个组件的协调者。可以实现类似主从选举、分布式事务、负载均衡等多种功能,比如HDFS HA方案、HBase的Metastore、Kafka里面的offset维护等等,由此可以见,zookeeper的重要性。
不过激发我学习zookeeper的主要原因还是因为它里面涉及了很多分布式协议的东西,从而能更好的理解分布式中的一些概念。所以,就跟着我一起深入浅出的学习吧!
主要参考:官方文档 《从Paxos到zookeeper分布式一致性原理与实践》
最后
上面是我从对大数据组件的一些理解,希望各位不吝赐教。