大数据简介 & 架构 (一)
随着近年来,信息技术迅猛发展,尤其以移动互联网、物联网等为代表的技术,通过各种终端设备收集大量的用户信息、操作行为等日志,数据的来源和数量正以前所未有的速度增长。可通过对这些数据进行分析、挖掘、机器学习,实现个性化营销、智能推荐等应用场景,为公司挖掘更多的商业价值,为用户带来更好的体验。
大数据概述
普通的互联网服务是,通过调研市场、运营,结合产品经理的分析,设计产品的需求和功能,然后实现一个系统、软件、服务。而大数据是反过来的,通过对现有数据分析,挖掘潜在的用户需求,实现个性化的服务。
1. 技术发展史
Google在2004年发表三篇论文,也就是大数据“三驾马车”,分布式文件系统GFS、大数据集市框架MapReduce和NoSQL数据库系统BigTable。其实也是因为google业务主要是搜索,搜索引擎要做事:网页抓取,索引构建与排序,在这个过程中有大量的数据要存储和计算。
2006年,Lucene开源项目创始人Doug cutting根据论文原理实现了类似功能,就是后来的Hadoop, 包含HDFS,MapReduce。
Hadoop发布后,Yahoo首先使用,随后2007年,百度和阿里开始使用。
2008年,Hadoop正式成为Apache顶级项目。同年,专门运营Hadoop商业公司Cloudera成立,得到进一步的商业支持。
Yahoo开发Pig脚本语言,使用类SQL语法进行大数据编程。之后,Facebook又发布了Hive, 支持使用SQL进行大数据计算,Hive会把SQL语句转化成MapReduce的计算程序。
众多Hadoop周边产品出现,大数据生态体系逐渐形成,包含:关系数据库中数据导入导出到Hadoop平台Sqoop;日志进行分布式收集、聚合、传输的Flume; MapReduce工作流调度引擎Oozie。
早期,MapReduce即是一个执行引擎,又是一个资源调度框架。一个新项目启动,将MapReduce执行引擎和资源调度分离,就是Yarn。2012年,Yarn成为一个独立项目,成为大数据平台上最主流的资源调度系统。
2012年,UC伯克利AMP实验室开发Spark开始兴起,主要MapReduce性能太差,尤其多次迭代计算,且主要使用磁盘作为存储介质。
实时计算需求,催生了大数据流计算,Storm, Flink, Spark Streaming等流计算框架。
NoSQL系统处理主要也是大规模海量数据的存储与访问。2011年非常火爆,出现了HBase, Cassandra等许多优秀的产品。
大数据处理的主要应用场景包含数据分析(Hive, Spark SQL)、数据挖掘与机器学习(TensorFlow, Mahout, MLib)。
2. 应用发展史
搜索引擎时代:Google为代表,分布式文件系统存储大规模的网页信息,然后使用MapReduce计算框架进行词频统计、网页排名。
数据仓库时代:Hive可用更低廉的价格获得比以往多得多的数据存储和计算能力,不就是老板、普通员工(产品,运营,工程师),只要有数据访问权限,都可以提出分析需求,从数仓中获取自己想要了解的数据分析结果。
数据挖掘时代:推荐商品,把商品与商品的关系,人和人的关系进行分析,然后进行推荐;使用标签组成用户画像,完整描绘出一个人。
机器学习时代:数据中蕴藏着规律,一旦找到这个规律,可按这个规律进行预测。有了大数据,可以把全部的历史数据都收集起来,统计器规律,形成模型,进而预测正在发生的事情。
3. 应用领域
医学方面:医学影像识别、智能诊疗等
智能语音:智能机器人、智能教学等
智能风控
舆情监控与分析
新零售
无人驾驶
HDFS
分布式文件系统,以流式数据访问模式(一次写入多次读取)存储超大文件,运行于商用硬件集群之上。需要解决问题包含:
i) 如何存储大文件?--- 大文件切成不同的单元块
ii) 如何快速读写存储文件?--- 一个文件包含多个块,块信息存在master服务器上
iii) 存储的安全/可靠性? --- 每一块存储chunk server, 多份数据块的复制
其实核心实现思想 与RAID技术的一致,只是RAID处理的是多块磁盘,而HDFS处理的是多服务器。
1. 系统架构
2. 不适合场景
低延迟的数据访问
大量小文件,因会超过NameNode的处理能力
多用户随机写入修改文件
3. 存储大文件 - 分布式文件系统
总的设计思想是分而治之,文件切成块(默认大小64M),以块为单位,每个块有多个副本存储在不同的机器上,副本数默认为3。包含NameNode主节点、DataNode数据节点。当文件创建、写入、关闭后不能修改文件内容。
NameNode节点:存储文件的元数据:文件名,文件目录结构,文件属性,每个文件的块列表、块所在的DataNode等;
DataNode:在本地文件系统存储文件块数据,块数据的校验和;以文件存储在磁盘上,包含:数据本身,元数据(数据块的长度、块数据校验和、时间戳), DataNode启动后向NameNode注册,通过后,周期性的向NameNode上报所有的块信息。集群运行中可安全加入/退出一些机器。
4. 可靠性设计 - 高可用
目标:假设节点失效是常态,任何一个节点失效,不影响HDFS服务;HDFS可自动完成副本的复制。
通过下面机制或策略保障高可用:
i) 一个名字节点,多个数据节点
ii) 数据复制(冗余机制),存放位置采用机架感知策略
iii) 故障检测
iv) DataNode的 心跳包(检测宕机)、块报告(安全模式下检测)、数据完整性检测(校验和比较)
v) NameNode的 日志文件、镜像文件
vi) 空间回收机制
写文件
读文件
节点失效处理
i) DataNode中磁盘挂了
DataNode正常服务,坏掉的磁盘上的数据尽快通知NameNode
ii) DataNode所在机器挂了
DataNode每3s向NameNode发送心跳,如果10分钟DataNode没有发心跳,则NameNode认为该DataNode已dead, NameNode将取出该DataNode上对应的block,对其进行复制。
iii) NameNode挂了
主从节点的通过sharedEdits实现数据一致性,通过zookeeper完成选master。
持久化元数据:操作日志edit log(记录文件操作日志), Fsimage(包含完整namespace, file->block映射关系,文件属性)
iv) Client挂了
会导致一致性问题,通过一致性模型解决。
一致性模型:文件创建后,不保证NameNode立即可见,文件长度为0;当写入超过一个块后,新的reader才可见第一个块。HDFS提供sync() 强制缓存与数据节点同步,成功后,当前写入数据对所有的reader可见且一致,会导致额外的开销。
MapReduce
MapReduce是一个并行处理大数据的编程模型,
解决问题:如何处理海量数据(>1TB), 上百上千CPU实现并行处理?
核心思想:移动计算比移动数据更划算
解决方案:分而治之(Divide and Conquer)
1. 特性
自动实现分布式并行计算
容错
提供状态监控工具
模型抽象简洁,开发者易用
2. 计算过程
由map,reduce两部分函数用户程序组成,然后利用框架在计算机集群上根据需求运行多个实例来处理各个子任务,然后对结果进行归并。
Partitioner
MapReduce通过Partitioner对key进行分区,进而吧数据按我们自己的需求进行分发,框架默认使用HashPartitioner
调度方法
单队列调度:FIFO, 简单,但资源利用率低
容量调度:多队列,每个队列分配一定系统容量,支持作业优先级;但队列设置和选择无法自动进行,用户需了解大量系统信息。
公平调度:改善小作业的响应时间,确保生产性作业的服务水平;但不考虑节点实际负载状态,导致负载不均衡。
JobTracker内部实现
作业控制:作业抽象为作业监控层JIP、任务控制层TIP、任务执行层,任务可能回尝试多次执行,每个任务实例称作为Task Attempt(TA),TA成功,TIP会标注该任务成功,所有TIP成功,JIP成功。
资源管理:根据TaskTracker状态信息进行任务分配
容错
JobTracker失败,那么未完成Job失败,通过Job日志,Job可部分恢复
TaskTracker容错:超时时,TaskTracker10分钟未汇报心跳,将从集群移除;灰名单/黑名单时,TaskTracker上部署性能监控脚本,如果性能表现太差,被JobTracker暂停调度;
Task容错:允许部分Task失败,Task由TIP监控,失败任务多次尝试,慢任务启动备份任务;
Record容错:跳过导致Task失败的坏记录;
3. 适合的计算类型
适合 TopK, K-means, Bayes, SQL
不适合Fibonacci
Yarn
Yarn: Yet Another Resource Negotiator, 下一代MapReduce框架,是一个通用的运行时框架,用户可以编写自己的计算框架,在该运行环境中运行。
Hadoop1.0: MapReduce应用程序启动过程中,把MapReduce程序分发到大数据集群的服务器上,通过TaskTracker和JobTracker通信来完成。缺点:服务器集群资源管理和MapReduce执行过程耦合在一起,存储资源无法使用其他的计算框架。
Hadoop2.0:把资源管理与计算框架分开,将Yarn从MapReduce中分离出来,成为一个独立的资源调度框架。核心思想将JobTracker的两个主要功能:资源管理、作业管理分成两个独立的进程。包含两个组件:全局的ResourceManager(RM);每个应用相关的ApplicationMaseter(AM),这里的应用指一个单独的MapReduce作业或DAG作业。
1. 架构
包含两部分:
Resource Manager资源管理器:独立部署,负责整个集群的资源调度管理;包含两个组件:调度器,资源分配算法,最小单位是容器,容器有NodeManager进程启动和管理,并监控容器的运行状况并向ResourceManger进行汇报;应用程序管理器:负责应用程序的提交、监控应用程序运行状态。每个应用程序启动后先启动自己的ApplicationMaster,根据资源需求向ResourceManager进程申请容器资源,得到资源分发自己应用程序代码到容器上启动,进而开始分布式计算;
Node Manager节点管理器:负责具体服务器上的资源和任务管理基本跟HDFS的DataNode进程一起出现
2. 工作流程
i) 向Yarn提交应用程序,包含ApplicationMaster, MapReduce程序,Applicaion启动命令;
ii) ResourceManager进行和NodeManager进程通信,分配一个容器,并将ApplicaitonMaster分发到这个容器上,在容器里启动ApplicaitonMaster。
ii) ApplicaitonMaster启动后立即向ResourceManger进程注册,申请容器资源;
iii) 申请到需要容器后,立即和相应的NodeManager进程通信,将用户MapReduce程序分发到NodeManager进程所在服务器,并在容器中运行;
iv) 运行期和ApplicaitonMaster通信,汇报自己的运行状态,如果运行结束, ApplicaitonMaster向ResourceManager进程注销并释放所有的容器资源。
Hive
Hive是一个数据仓库基础工具在Hadoop中用来处理结构化数据。并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。
1. 架构
2. 执行流程
操作符operator是Hive最小处理单元
每个操作符处理代表HDFS操作或MR作业
编译器把Hive SQL转换成一组操作符
Hive编译器
i) Parser: SQL转换为抽象语法树AST
ii) SemanOc Analyzer: AST转化为查询块QB
iii) Logical Plan Generator: QB转化为逻辑执行计划
iv) Logical OpOmizer: 重写执行计划,优化后的计划
v) Physical Plan Generator: 将逻辑执行计划转化为物理执行计划M/R jobs
vi) Physical OpOmizer: 适应性Join策略调整
3. Metastore
Single User Mode(Defalut)
Multi User Mode
Remote Server
4. Hive SQL Join操作
Join操作转化为M/R作业进行处理;
优化
使用Map Join进行优化,将小的表数据从HDFS读取到内存中hash表中,再上传到Hadoop分布式缓存中,然后将这些文件发送到每个Mapper的本地磁盘中,最后启动一个只有Map Task 的MapReduce作业来完成Join。
版权声明: 本文为 InfoQ 作者【dony.zhang】的原创文章。
原文链接:【http://xie.infoq.cn/article/82abc8c97c95b7cd41223c14a】。文章转载请联系作者。
评论