Hadoop研究综述

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/leveretz/article/details/53302990

大数据时代对于数据分析?管理都提出了不同程度的新要求,许多传统的数据分析技术和数据库技术已经不足以满足现代数据应用的需求。为了给大数据处理分析提供一个性能更高?可靠性更好的平台,Doug Cutting模仿GFS,为MapReduce开发了一个云计算开源平台Hadoop,用Java编写,可移植性强。现在Hadoop已经发展为一个包括分布式文件系统HDFS、分布式数据库HBase以及数据分析处理MapReduce等功能模块在内的完整生态系统Ecosystem,现已经发展成为目前最流行的大数据处理平台。Intel公司根据Hadoop的系统构造,给出了一种Hadoop的实现结构。

在这个系统中,以MapReduce算法为计算框架,HDFS是一种类似于GFS的分布式文件系统,可以为大规模的服务器集群提供高速度的文件读写访问。HBase是一种与BigTable类似的分布式并行数据库系统,可以提供海量数据的存储和读写,而且兼容各种结构化或非结构化的数据。MahoutApache旗下的一个开源项目,对海量数据进行挖掘的一种方式,提供数据挖掘机器学习等领域中经典算法的实现Hive是一种基于Hadoop的大数据分布式数据仓库引擎,它使用SQL语言对海量数据信息进行统计分析查询等操作,并且将数据存储在相应的分布式数据库或分布式文件系统中。为了对大规模数据进行分析就要用到相关的数据分析处理语言PigLatin,它借鉴了SQLMapReduce两者的优点,既可以像SQL语言那样灵活可变,又有过程式语言数据流的特点。Zookeeper是分布式系统的可靠协调系统,可以提供包括配置维护名字服务分布式同步组服务等在内的相关功能,封装好复杂易出错的关键服务,将简单易用的接口和性能高效功能稳定的系统提供给用户Sqoop是一个用来将Hadoop和关系型数据库中的数据双向转移的工具,可以将一个关系型数据库(MySQLOraclePostgres等)中的数据导入到HadoopHDFS中,也可以将HDFS的数据导入到关系型数据库中,还可以在传输过程中实现数据转换等功能。Flume是一种分布式日志采集系统,特点是高可靠性高可用性,它的作用是从不同的数据源系统中采集集成运送大量的日志数据到一个集中式数据存储器中

HDFS

Google之前没有哪一个公司曾需要处理数量如此多种类如此繁杂的数据因此Google公司结合自己的实际应用情况自行开发了一种分布式文件系统GFSGoogle File System。这个分布式文件系统是个基于分布式集群的大型分布式处理系统,作为上层应用的支撑,为MapReduce计算框架提供低层数据存储和数据可靠性的保障。

GFS同传统的分布式文件系统有共同之处,比如性能可伸缩性可用性等。然而,根据应用负载和技术环境的影响,GFS和传统的分布式文件系统的不同之处使其在大数据时代得到了更加广泛的应用。GFS采用廉价的组成硬件并将系统某部分出错作为常见情况加以处理,因此具有良好的容错功能。从传统的数据标准来看,GFS能够处理的文件很大,尺寸通常100MB以上,数GB也很常见,而且大文件在GFS中可以被有效地管理。另外,GFS主要采取主从结构(Master-Slave),通过数据分块追加更新等方式实现海量数据的高速存储。

随着数据量的逐渐加大数据结构的愈加复杂,最初的GFS架构已经无法满足对数据分析处理的需求,Google公司在原先的基础上对GFS进行了重新设计,升级为Colosuss,单点故障和海量小文件存储的问题在这个新的系统里得到了很好的解决。

除了GoogleGFS以及ColosussHDFSFastDFSCloudStore等都是类似于GFS的开源实现。由于GFS及其类似的文件处理系统主要用于处理大文件,对图片存储文档传输等海量小文件的应用场合则处理效率很低,因此,Facebook开发了专门针对海量小文件处理的文件系统Hay-stack,通过多个逻辑文件共享同一个物理文件,增加缓存层部分元数据加载到内存等方式有效地解决了海量小文件存储的问题;此外,淘宝也推出了类似的文件系统TFSTaobao File System),针对淘宝海量的非结构化数据,提供海量小文件存储,满足了淘宝对小文件存储的需求,被广泛地应用在淘宝各项业务中。

HDFS 是Hadoop 的分布式文件系统,为分布式计算提供底层存储支持。HDFS 将文件划分成多个数据块并为各数据块建立多个副本进行分布式冗余存储确保数据的高可用性。HDFS 采用了主从(Master/Slave)结构模型,一个HDFS 集群由一个NameNode 和若干个DataNode 组成。其中NameNode作为主服务器(Secondary NameNode 是NameNode 的元数据信息的备份节点),管理文件系统的命名空间和客户端对文件的访问操作;DataNode 负责存储数据。Secondary NameNode定期从NameNode上下载元数据信息(元数据镜像fsimage 和元数据操作日志editlog),然后将fsimage 和editlog 合并成一个新的fsimage,在本地保存(Checkpoint),并将其推送至NameNode,同时重置NameNode上的editlog。NameNode维护分布式文件系统的命名空间,同时负责维护数据块到具体DataNode 的映射。DataNode 负责处理Client的文件读写请求,并在NameNode 的统一调度下进行数据块的创建、删除和复制等工作。

HDFS 集群主要由NameNode(名称节点)和DataNode(数据节点)组成,其中名称节点是来管理元数据的而数据节点是用来存储实际数据的。HDFS 的特性包括:支持超大文件,检测到硬件故障并快速响应,流式数据访问,简化的一致性模型。HDFS 具有高容错性,它可以部署在廉价的通用硬件上,并可以提供高吞吐率的数据访问,适合那些需要处理海量数据集的应用程序。HDFS 没有遵循可移植操作系统接口的要求,而是提供了一套特有的,基于Hadoop 抽象文件系统的API,支持以流的形式访问文件系统中的数据。

我们知道,为了便于管理,设备往往将存储空间组织成为具有一定结构的存储单位。如磁盘,文件是以块的形式存储在磁盘中,块的大小代表系统读/写操作的最小单位;在Linux 的EXT3或EXT4 格式的文件系统中,数据块默认为4096字节。对于系统使用者来说数据块管理的内部细节是不需要了解就能轻松的使用的。

HDFS 也有块的概念(即Block[21]),不过是更大的单元,默认的HDFS 数据块大小是64MB。和一般文件系统相似,HDFS 上的文件也分块的。HDFS 是针对大文件而设计的分布式文件系统,使用数据块可以带来很多好处,具体如下:

(1) HDFS 可以保存比存储节点单一磁盘容量大的文件文件块可以保存在不同的磁盘上。其实,在HDFS 中,文件数据可以存放在集群上的任何一个磁盘上,不需要保存在同一个磁盘上,或同一个机器的不同磁盘上。

(2) 方便容错,有利于数据复制数据块会在不同的机器上进行复制,通常为3 份副本,如果一份数据块的丢失或损坏时,系统会找到其他地方副本来读,这个过程对用户来说是透明的,它实现了分布式系统中的位置透明性和故障透明性。同时,一个数据块因损坏或者机器故障而缺失,那么会从其他有这个数据块的地方复制到另外一个机器上,以确保数目恢复到设置好的水平(即3 个副本)。

Namenode也叫名字节点,是HDFS 的master-slave结构中master 节点上运行的核心进程,它指导master-slave结构中的slave 节点,数据节点具体操作底层的输入输出工作。

Namenode 是HDFS 的核心,对整个分布式系统的整个目录树进行维护,记录着文件/目录的元数据情况和文件的数据块索引,即每个文件的数据块对应表。这些信息以两种形式存储在本地文件系统中:一种是命名空间镜像即FSImage,另一种是命名空间镜像的编辑日志即Edit Log。

名称节点的FSImage 存储着一特定时刻的HDFS 目录树、元数据信息和数据块索引和其他信息,对这些变化的跟踪信息,存储在编辑日志,它们一起提供了一个完整的命名空间。

在fsimage 里,没有每一块的数据节点对应表的信息记录,但简单地存储所有有关命名空间的相关信息。对应于真正的每一块数据节点列表信息在Hadoop并没有持久性存储,但在所有数据节点启动时,每个数据节点扫描本地磁盘,保存数据节点块信息汇总并告诉名称节点,名称节点在收到到每一个数据节点的块讯息的反馈后,得到了这些数据块讯息,并在名称节点中将这些数据节点的讯息存储在名称节点的内存中。HDFS 就是采取这种数据库讯息报告的形式来搭建块-> 数据节点的对应表结构的。数据节点的数据块信息汇报过程叫做blockReport,而名称节点将块 -> 数据节点的对应表信息保存在叫做BlocksMap 的地方。

HDFS 里面数据块是保存在Datanode(数据节点)上的,part-0 文件有2 个副本且由1 号和3 号这2个数据块组成,part-1 文件有3 个副本且由2 号4 号5 号这3 个数据块组成。以linux 文件系统上的一般文件进行存储。数据节点是一个文件系统的实际执行者是个工人。数据节点保存数据块还提供定位块的工作,而且每过一段时间的向名称节点汇报它们保存的数据块的列表。这样名称节点就知道某个文件中包含哪些数据块,且在哪些datanode 上,但并不知道datanode 上的存放具体位置。同时数据节点知道他们的机器的数据块的具体位置,但不知道这些数据块属于哪个文件。客户端需要读取文件时先由名称节点通知它各个数据块保存在哪一个数据节点上,然后它就可以和这个数据节点进行直接通信,处理与数据块对应的本地文件。并且默认每个数据块有多个副本,并分布在不同的数据节点上,确保冗余性万一哪台数据节点宕机时也不影响整个系统的数据,也提供了数据就近读取的可能,提高了数据的读取的性能。

Yarn

YARN 是apache 的新一代的框架,它是将原mapreduce框架中的jobtracker的任务拆开变成两个单独的任务:其中一个是作为整个集群的资源管理器(Resource Manager)和另一个是各个应用程序独有的任务即应用管理器(ApplicationMaster)。其中,整个hadoop 的资源分配以及管理是由资源管理进程负责,而解决单个应用程序的管理任务的是应用管理进程。当用户提交一个应用程序时,需要提供一个用于跟踪和管理这个程序的应用管理器。这个程序的任务是向资源管理器请求各种资源,同时请求节点管理器启动一个可以利用一部分资源的任务。因为各个应用管理器分散在各个不同的节点上,所以各个应用管理器之间不会彼此影响。

YARN 的工作可以分为以下几个步骤:

步骤1 用户向YARN 提交应用程序,其中包括应用管理器程序、启动应用管理器的指令、用户程序等。

步骤2 资源管理器为这个程序安排第一个容器(Container),和相关的节点管理器进行通信,要求它在这个容器中启动这个程序的应用管理器。

步骤3 应用管理器需要先向资源管理器进行注册,然后用户可以在资源管理器中查看应用程序的运行状态,随后,它将申请资源给各个任务,并监控其运行状态,一直到它运行结束为止,即重复步骤4-7。

步骤4 应用管理器采用轮询的方式,发送RPC 协议向资源管理器申请资源和领取资源。

步骤5 当应用管理器申请到资源后,就和相应的节点管理器进行通信,要求它启动任务。

步骤6 节点管理器为任务设置好运行环境(包括运行变量、jar 包、二进制程序等)后,在一个脚本中写入任务启动命令,最后通过运行该脚本启动任务。

步骤7 任务将自己运行情况的信息通过RPC 协议向应用管理器汇报。让应用管理器时刻了解各个任务的运行情况,这样就可以在任务失败时进行重新启动任务。在应用程序运行的过程中,用户可以时刻从RPC 协议向应用管理器查询到应用程序的进度和当前运行状态。

步骤8 应用程序运行完成后,应用管理器向资源管理器注销,并关闭自己这个程序。

MapReduce

MapReduce技术是Google公司于2004年提出,作为一种典型的数据批处理技术被广泛的应用于数据挖掘数据分析机器学习等领域 MapReduce因为它并行式数据处理的方式已经成为大数据处理的关键技术。

MapReduce系统主要由两个部分组成:MapReduceMapReduce的核心思想在于“分而治之”,也就是说,首先将数据源分为若干部分,每个部分对应一个初始的键-值(Key/Value)对,并分别给不同的Map任务区处理,这时的Map对初始的键-值(Key/Value)对进行处理,产生一系列中间结果Key/Value对,MapReduce中间过程Shuffle将所有具有相同Key值的Value值组成一个集合传递给Reduce环节;Reduce接收这些中间结果,并将相同的Value值合并,形成最终的较小Value值的集合。MapReduce系统的提出简化了数据的计算过程,避免了数据传输过程中大量的通信开销,使得MapReduce可以运用到多种实际问题的解决方案里,公布之后获得了极大的关注,在各个领域均有广泛的应用。

MapReduce 的计算框架,是为解决这样一类问题非常适合:问题可以分解为若干个子问题,且相互独立,互不包含,可以通过并行处理这些子问题后,来解决这个任务的。map()函数以键值对作为输入,产生一系列的 键值对写入本地磁盘作为中间输出。MapReduce框架会自动将这些数据按照key 值进行汇集,且key 值相同(用户可设定汇集的策略,默认情况下是对key 值进行哈希取模)的数据被统一交给reduce()函数处理。reduce()函数以key 及对应的value列表作为输入,经合并key 相同的value 值后,产生另外一系列键值对作为最终输出写入HDFS。早先版本mapreduce 中jobtracker包含资源管理和任务调配2 大功能,而由于YARN 的产生,已经将资源管理功能放入YARN 的资源管理器中,Mapreduce(V2)计算框架仅需要一个在YARN 上运行的应用管理器即可。

Hive

Hive是一个基于Hadoop的数据仓库平台和SQL基础结构,是Facebook在2008年8月开始开源的一个数据仓库框架。Hive将数据存储在Hadoop中的HDFS文件系统中,并提供了一套类似于关系型数据库的处理机制。

Hive采用了一种类SQL语言:HiveQL,对数据进行管理,经过解析和编译,这种HiveQL最终生成基于Hadoop的MapReduce任务。最后,Hadoop通过执行这些任务完成查询任务和数据处理。和传统的数据库相比,Hive也是将数据存储于表中,表的每一列都有一个相关的类型。Hive支持常见的的原语类型并支持复合类型。再加上其查询语言与SQL极其相似,因此,Hive很容易被用户接受并掌握。

Hive采用了RcFile(Record Columnar File)这种数据存储结构。RCFile基于HDFS,每个表可能占用多个HDFS块。而每个HDFS块中的所有记录又分成多个行。RCFile通过采用对表格数据的不同压缩算法、数据追加、限制行组大小等机制使得Hive够很好地满足基于MapReduce的数据仓库所要求的四个条件:①快速数据加载;②快速的查询处理;③高效的存储空间利用;④对高度动态负载模式的较强适应性。

在HBase中,对数据仅提供了基本的数据插入、读取语句,这种语句能做的事情非常有限,并且不支持常用的类SQL语句的查询方式,所以在此将HBase与Hive整合,由Hive提供的强大搜索接口——HiveQL来进行数据分析工作,它支持绝大多数常见的原语类型,查询语言与SQL极其相似。

Hive可以将结构/非结构化的数据文件映射成一张虚拟的表,基于这张表,提供基于HiveQL的查询功能。但从实现过程上来看,Hive最终还是将查询语句转换为MapReduce程序提交执行。相对于具有同样功能的MapReduce程序而言,执行效率有所降低,但它的学习成本低,可以直接进行基于MapReduce的各项工作,而不必开发专门的MapReduce应用,适合对数据仓库进行快速的离线分析。

HBase与Hive均属于Hadoop的子项目,因此两者具有比较好的兼容性。通过修改配置文件,将两者有效地集成到一起。集成后,Hive可以通过HBase的库函数访问到存储在HBase中的数据,同时也可以使用HiveQL语言对其进行检索操作。

HBase

HBase是基于Apache Hadoop的、分布式的、多版本的、面向列的数据库,能够对大型数据提供随机、实时的读写访问。

其技术特点:支持很高的写吞吐;有良好的随机读性能;高可用性,故障可恢复性;错误隔离性。一个结点的错误不会影响到其它结点,磁盘故障只会对相应的小规模的数据产生影响。可在廉价PC Server搭建大规模结构化存储集群。横向扩展性强。

分布式的HBase系统应用架构如下:

为客户端提供访问入口,存贮所有Region的寻址入口;选举HBase集群中的master,确保任何时候,只有一个master;实时监控Region Server的状态,将Region server的上线和下线信息实时通知给Master;存储Hbase的schema,包括有哪些table,每个table有哪些columnfamily。

Hbase的服务器体系结构遵从简单的主从服务器架构,由Hregion服务器群和HBase Master主服务器构成。在整个架构中负责数据的读写、调度等。Master主要负责Table和Region的管理工作;RegionServer主要负责响应用户I/O请求,向HDFS文件系统中读写数据。

Hadoop文件系统也是主从架构,由唯一一个目录节点和数个数据节点组成。在整个架构中负责数据的物理存储。

Client包含访问hbase的接口,client维护着一些cache来加快对hbase的访问,比如regione的位置信息。client访问hbase上数据的过程并不需要master参与(寻址访问zookeeper和region server,数据读写访问regione server),master仅仅维护者table和region的元数据信息,负载很低。

HBase以表的方式存储数据。表是由行和列构成的,列从属于某一个列族(column family)。行和列的交叉点称之为cell,cell是版本化的。cell的内容就是数据,cell中的数据是没有类型的,全部是字节码形式存贮,是不可分割的字节数组。HBase表中的所有行都按照row key的排序的,一个表 在行的方向上分割为多个region。region按大小分割的,每个表一开始只有一个region,随着数据不断插入表,region不断增大,当增大到一个阀值的时候,region就会等分会两个新的region。

region是Hbase中分布式存储和负载均衡的最小单元。不同的region可以分布在不同的Region server上。但一个region是不会拆分到多个server上。Region虽然是分布式存储的最小单元,但并不是存储的最小单元。Region由一个或者多个Store组成,每个store保存一个columns family。每个Strore又由一个memStore和0至多个StoreFile组成。如图:StoreFile以HFile格式保存在HDFS上。

Hbase的服务器体系结构遵从简单的主从服务器架构,由region服务器群和 Master主服务器构成。尽管是主从架构,但是,Master没有单点问题。HBase中可以启动多个Master,通过Zookeeper的Master Election机制保证总有一个Master在运行。Master主要负责Table和Region的管理工作:处理用户对表的schema更新请求,增、删、改表结构。管理RegionServer的负载均衡,调整Region分布。 Region Split后,负责新Region的分布。在RegionServer停机后,负责失效RegionServer上Region迁移。

RegionServer是HBase中最核心的模块,主要负责响应用户I/O请求,向HDFS文件系统中读写数据。RegionServer管理一些列HRegion对象;每个HRegion对应Table中一个Region,HRegion由多个HStore组成;每个HStore对应Table中一个Column Family的存储;Column Family就是一个集中的存储单元,故将具有相同IO特性的Column放在一个Column Family会更高效.

Store是HBase存储的核心。由一个MemStore和多个StoreFile组成。用户写入数据时,HStore工作机制:数据首先放入MemStore。当MemStore满了以后会Flush成一个StoreFile(底层实现是HFile)。当StoreFile文件数量增长到一定阈值,会触发Compact合并操作,将多个StoreFiles合并成一个StoreFile,合并过程中会进行版本合并和数据删除。当StoreFiles Compact后,会逐步形成越来越大的StoreFile,当单个StoreFile大小超过一定阈值后,会触发Split操作,把当前Region Split成2个Region,父Region会下线,新Split出的2个孩子Region会被HMaster分配到相应的HRegionServer上,使得原先1个Region的压力得以分流到2个Region上。根据以上过程可知,HBase只是增加数据,有所得更新和删除操作,都是在Compact阶段做的,所以,用户写操作只需要进入到内存即可立即返回,从而保证I/O高性能。

Mahout

Apache MahoutApache开发的一个全新的开源项目其主要目标是创建一些可伸缩的机器学习算法供开发人员在Apache的许可下免费使用。

Mahout包含许多实现包括集群、分类、CF(Collaborative Filtering)和进化程序。此外通过使用Apache HadoopMahout可以有效地扩展到云中。用Mahout来构建推荐系统,是一件既简单又困难的事情。简单是因为Mahout完整地封装了“协同过滤”算法,并实现了并行化,提供非常简单的API接口;困难是因为我们不了解算法细节,很难根据业务的场景进行算法配置和调优。

常用的使用Mahout实现的算法有:基于用户的协同过滤算法UserCF、基于物品的协同过滤算法ItemCFSlopeOne算法、KNN Linearinterpolation itembased推荐算法、SVD推荐算法和Tree Clusterbased推荐算法等。

Sqoop

Sqoop项目开始于2009年,最早是作为Hadoop的一个第三方模块存在,后来为了让使用者能够快速部署,也为了让开发人员能够更快速的迭代开发,Sqoop独立成为一个Apache项目。Apache Sqoop项目旨在协助RDBMSHadoop之间进行高效的大数据交流。用户可以在Sqoop的帮助下,轻松地把关系型数据库的数据导入到Hadoop与其相关的系统(HBaseHive)中;同时也可以把数据从Hadoop系统里抽取并导出到关系型数据库里。除了这些主要的功能外,Sqoop也提供了一些诸如查看数据库表等实用的小工具122I

理论上,Sqoop支持任何一款符合JDBC规范的数据库,如DB2MySQLSQL Server等。现有的成功案例是微软的SQL Server 2012SQL Server 2012支持的Hadoop连接器的基础是Sqoop连接器,主要目标是提供SQL ServerHadoop之间的数据转换,即结构化数据与非结构化数据之间的双向数据传输。

猜你喜欢

转载自blog.csdn.net/leveretz/article/details/53302990
今日推荐