关于Hadoop,你该知道的

随着移动互联网的高速发展及移动设备的普及,数据累计的速度越来越快,世界已进入大数据时代。Hadoop是一个提供分布式存储和计算的软件框架,非常适合处理海量数据。

经过十多年的发展,hadoop已经从传统的三驾马车HDFS,MapReduce和HBase,发展到现在60+个组件组成的生态圈。Hadoop生态圈可以划分为四层架构:

底层:存储层,HDFS、HBase、Kudu等;

中间层:资源及数据管理层,YARN、Sentry等组件;

上层:MapReduce、Impala、Spark等计算引擎;

顶层:基于计算引擎的高级封装及工具,如Hive,Pig,Mahout等。

本文从诞生背景、数据流程、优缺点、应用场景等角度出发,简要介绍几个常用组件。

存储层:HDFS

当数据集的大小超过单台计算机的存储能力时,就有必要分区(partition)并存储到若干台单独的计算机上,HDFS(Hadoop Distributed File System)便是管理网络中跨多台计算机存储的文件系统。

HDFS适合存储超大文件,多在GB或TB级别;容错性高,可运行于廉价硬件之上,普通的PC server即可;流式数据访问,一次写入多次读取。当然,也有缺点:实时数据访问弱,HDFS提升了数据吞吐量而牺牲了读取数据速度,实时访问数据可考虑使用HBase;存放大量的小文件;不支持多用户同时写入,不支持在文件任意位置进行修改。

HDFS存储处理文件的最小单元为块(block),切片后的文件系统可以保存在集群的任意节点。

HDFS的主从架构(master/slave)中,名字节点NameNode是主角色,HDFS的大脑,负责维护整个文件系统中的目录树及其文件和目录;数据节点DataNode是从角色,在NameNode的指导下完成输入输出任务。此外,第二名字节点SecondaryNode,用于定期合并命名空间镜像(FSI,元数据的完整快照)和空间镜像的编辑日志(edit log)的辅助守护进程,并非NameNode的热备。

NameNode和DataNode有心跳机制,当NameNode的心跳包没有被DataNode正常收到时,NameNode会自动复制文件块新的副本,并将I/O操作发到其他DataNode节点,以保证HDFS的容错机制。

HDFS客户端可通过命令行、java接口等方式对HDFS进行读取。读取文件前,会对客户身份进行认证:通过信任的客户端指定用户名;或通过KerberOS等强制验证机制。客户端会首先访问NameNode,确认文件存在且有访问权限后,NameNode会返回文件中第一个数据块的标号及保存该数据块的DataNode列表,HDFS客户端便会直接访问最合适的DataNode。

写入文件时,HDFS客户端会通过API发送打开文件的请求,确认该用户有写入文件的权限,请求会送到NameNode,并建立该文件的元数据。HDFS客户端收到打开文件成功的响应,然后写入数据。

使用批量数据迁移工具sqoop,可以方便地将关系型数据库导入HDFS,也可以将数据从HDFS导出至关系型数据库。

使用分布式日志采集工具Flume,可以收集日志并写入HDFS。

存储层:HBase

HBase是一种构建在HDFS之上的分布式、面向列的存储系统,支撑业务的CRUD操作(creat增加、retrieve读取、update更新、delete删除)。HBase采用新的存储和检索技巧—BigTable列族存储,是NoSQL技术的代表。

NoSQL大多时候是分布式的代名词。任何分布式数据系统最多满足CAP原理(consistency一致性、availability可用性、partition tolerance分区容错性)三个特性中的两个。关系型数据库RDBMS是满足CA特性,HBase、Redis、MongoDB满足CP特性。

一致性:对于所有客户端,具有唯一的、最新的、可读的版本的数据。

可用性:允许数据库客户端无延迟的更新内容。

分区容错性:数据库分区存在通讯故障时,系统仍能响应客户端请求。

NoSQL系统采用键值存储,不使用SQL作为查询语言,直接用简单的API访问和操作,检索速度非常快;也不用为值指定特定的数据类型,可以存储任意类型的数据,由应用层来决定返回的数据类型,如返回字符串或图像;预写日志WAL功能,也保证了数据写入时不会因集群异常而导致写入数据丢失,可靠性高。

存储层:Kudu

Kudu是2015年才对外公开的新的分布式存储架构,与HDFS完全独立,定位是“对快速更新的数据进行快速查询”。Kudu兼具了hbase的实时性、hdfs的高吞吐,以及传统数据库的sql支持。Kudu是对HDFS和HBase功能上的补充,能提供快速的分析和实时计算能力,并且充分利用CPU和I/O资源,支持数据原地修改,被誉为下一代分析平台的重要组成。

资源及数据管理层:YARN

YARN(Yet Another Resource Negotiator),统一资源管理和调度平台,新一代hadoop(CDH4、CDH5)引入,脱胎于MRv1。

MRv1的主节点故障将导致整个集群不可用,主节点易成为集群性能瓶颈,Map槽和Reduce槽只能运行对应的Map任务和Reduce任务,仅支持离线批处理任务。因此,YARN的优点显而易见:有良好的扩展性、容错性和高资源利用率,支持离线、流式的异构计算框架。

YARN采用双层调度,中央调度器ResourceManagers定期接收NodeManager的资源汇报,权衡作业优先级并进行仲裁资源,然后按照一定策略(先进先出FIO、延迟调度Delay)将资源粗粒度下发给二级调度器;二级调度器ApplicationManager再分配资源给容器,执行具体的计算任务。这有利于提升并发和资源利用率。

资源及数据管理层:Sentry&RecordService

Sentry是一个Hadoop的授权模块,为了对正确的用户和应用程序提供精确的访问级别,Sentry提供了细粒度级、基于角色的授权以及多租户的管理模式。RecordService通过控制访问到行和列级别来补充了Sentry。

计算引擎:MapReduce

MapReduce是面向大数据并行处理的计算模型、框架和平台。它借鉴了分而治之的思想,将数据处理过程划分成Map(映射)、Reduce(化简)两步。

数据抽象为键值对后作为输入,map函数输出新的键值对作为中间输出结果,MapReduce计算框架会将中间输出结果数据聚合,将键相同的数据分发给reduce函数,处理后产出另外一系列键值对作为输出。

利用这种思想,可以将复杂的数据分析问题转化为一系列MR作业,实现分布式计算,从而对海量数据进行复杂的数据分析。由于大量的中间结果写到磁盘并通过网络传输很耗时,所以一个普通的MR作业也要在分钟级别完成。

图: 用MapReduce思想完成单词计数

计算引擎:Spark

Spark是基于内存计算的大数据并行计算框架。与MapReduce相比,Spark基于内存的计算要快100倍以上,可以通过基于内存来高效处理数据流。Spark支持Java、Python和Scala的API,还支持超过80种高级算法,使用户可以快速构建不同的应用。Spark还提供统一数据处理平台,可以批处理(Spark Core)、实时流处理(Spark Streaming)、交互式查询(Spark SQL)、机器学习(Spark MLlib)和图计算(GraphX)。

Spark可以从Kafka、Flume、HDFS等消费数据,处理后的结果可存储在内存数据库Redis。

Redis与HBase的区别:Redis是内存型KV系统,处理的数据量远小于HBase;Redis适合做缓存,也可以在“读写分离”的场景下“读库”,特别是Hadoop或Spark的分析结果;Redis的吞吐和时延远远优于HBase。

数仓工具:Hive

Hive是基于hadoop的数仓工具,可以用来进行ETL,可以对hadoop的海量数据进行存储、查询和分析。

一般Hive独立部署在集群之外的节点。我们通过命令行接口向Hive提交查询命令,命令会进入Driver模块,对命令进行解释和编译优化,按照生成的执行计划执行。执行计划会将查询分解为若干个MR作业。所以Hive也是适合在离线下进行数据的操作,不适合在线实时查询和操作。

MetaStore是Hive的元数据的集中存放地,包含了元数据服务和元数据存储。Hive将HDFS上的结构化数据通过元数据映射为一张张表,这样用户才可以通过查询语言HiveQL对数据进行查询。元数据存储通常由一个关系型数据库(MySQL、Oracle等)完成。

Hive不支持事务,所以Hive不适合OLTP(联机事务处理),而更倾向于OLAP(联机分析处理),但是由于Hive不能做到“联机”的部分,所以Hive更合适的定位是离线计算。

此外,Hive没有索引,查询时的全表扫描导致查询延时很严重。为了满足交互式查询,Facebook于2013年开源了查询引擎Presto,比Hive性能要好10倍多。

题图:源自网络

— END —

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181105G1XI5600?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券