#1 hadoop定义

Hadoop是一个由Apache基金会所开发的分布式系统基础架构
用户可以在不了解分布式底层细节的情况下,开发分布式程序,充分利用集群的威力进行高速运算和存储
Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS
HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上
而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序
HDFS放宽了(relax)POSIX的要求,可以以流的形式访问(streaming access)文件系统中的数据
Hadoop的框架最核心的设计就是:HDFS和MapReduce
HDFS为海量的数据提供了存储,而MapReduce则为海量的数据提供了计算

#2 什么是云计算?

Impala is the open source version of Dremel, Google’s proprietary big data query solution. A first beta is available and the production version is foreseen for Q1 2013.

Impala allows you to run real-time queries on top of Hadoop’s HDFS, Hbase and Hive. No migrations necessary.

Apache Crunch (incubating) is a Java library for writing, testing, and running MapReduce pipelines, based on Google’s FlumeJava. Its goal is to make pipelines that are composed of many user-defined functions simple to write, easy to test, and efficient to run.
Running on top of Hadoop MapReduce, Apache Crunch provides a simple Java API for tasks like joining and data aggregation that are tedious to implement on plain MapReduce. For Scala users, there is also Scrunch, an idiomatic Scala API to Crunch.

RHadoop是由Revolution Analytics发起的一个开源项目,它可以将统计语言R与Hadoop结合起来。目前该项目包括三个R packages,分别为支持用R来编写MapReduce应用的rmr、用于R语言访问HDFS的rhdfs以及用于R语言访问HBASE的rhbase。

What is RHIPE?
RHIPE (hree-pay’) is the R and Hadoop Integrated Programming Environment. It means “in a moment” in Greek. RHIPE is a merger of R and Hadoop. R is the widely used, highly acclaimed interactive language and environment for data analysis. Hadoop consists of the Hadoop Distributed File System (HDFS) and the MapReduce distributed compute engine. RHIPE allows an analyst to carry out D&R analysis of complex big data wholly from within R. RHIPE communicates with Hadoop to carry out the big, parallel computations.

Apache Mahout是 Apache Software Foundation(ASF) 旗下的一个开源项目,提供一些可扩展的机器学习领域经典算法的实现,旨在帮助开发人员更加方便快捷地创建智能应用程序。经典算法包括聚类、分类、协同过滤、进化编程等等,并且,在 Mahout 的最近版本中还加入了对 Apache Hadoop 的支持,使这些算法可以更高效的运行在云计算环境中。

什么是云计算?针对这个问题,恐怕十个专家会给出十一个互不相同的答案,而事实上也有无数的文章从各个角度试图给出一个简单而确切的定义。在最肤浅的级别上来说,原来基于web 2.0技术开发的曾被称作web应用程序的都可摇身一变称自己为“云程序”,因为任何运行于浏览器中收集并存储用户相关内容的应用都的确可以作为云程序的应用范例,比如以Facebook为代表的社交站点、以内容分享为代表的YouTube、基于Web的邮件服务Gmail以及诸如Google Docs类的应用程序。在这种层面上,“云”指的是运行了这些站点的主机群。诸如此类的应用,每种都会随着用户数据的日积月累进而带来“大数据”问题。

云计算的另一个重要表现是效用计算,即将计算资源本身当作一种可计量的服务,就像电或者水一样。这种模型中,用户只需要向“云供应商”购买实际需要的计算能力即可,实际应用中,这是通过向用户提供运行了某操作系统的虚拟机来实现的,即云供应商使用虚拟化技术在用户之间分配计算资源。用户对其拥有的虚拟机具有完全使用权限,而其使用结束后,只需要“销毁”此虚拟机就能释放其原来占用的资源。

站在效用计算提供商的角度来看,这种模型中运营较大规模的数据中心的收益也会优于小规模的数据中心。目前,虽然有越来越多企业或组织加入,但Amazon Web服务仍是此种应用领域的领头羊和主导者。而相关应用的开源解决方案Eucalyptus也正越来越引起人们的兴趣。效用计算模型的实际应用是通过向用户提供虚拟机实例来完成的,用户通过此虚拟机来访问服务,这即是所谓的“基础架构即服务(IaaS)”。然而,这对许多用户来说都过于“底层”了,于是就有了“平台即服务(PaaS)。PaaS通常指的是一些事先定义好的服务的集合,基于这些服务,用记可以创建应用程序或部署数据等。Google App Engine是此类应用中其最出色的代表,它为用户提供了后台存储及构建高可扩展性web应用程序的API。而其基础架构部分则由Google进行维护,从而让用户从备份、升级、打补丁甚至是提供存储和编程环境等繁琐的日常管理任务中解脱出来。PaaS仍需要用户自己根据实际需要构建应用程序,对于不具有程序研发能力的公司来说,他们需要的是更为高层次一些的服务,“软件即服务(SaaS)”则应运而生。SaaS将某种具体的应用软件以“云服务”的方式通过浏览器向用户提供,其著名的代表有Salesforce提供的CRM软件。

#3 hadoop的优点

Hadoop是一个能够对大量数据进行分布式处理的软件框架。
Hadoop 以一种可靠、高效、可伸缩的方式进行数据处理。
Hadoop 是可靠的,因为它假设计算元素和存储会失败,因此它维护多个工作数据副本,确保能够针对失败的节点重新分布处理。
Hadoop 是高效的,因为它以并行的方式工作,通过并行处理加快处理速度。
Hadoop 还是可伸缩的,能够处理 PB 级数据。
此外,Hadoop 依赖于社区服务,因此它的成本比较低,任何人都可以使用。
Hadoop是一个能够让用户轻松架构和使用的分布式计算平台。
用户可以轻松地在Hadoop上开发和运行处理海量数据的应用程序

针对性的优点

Hadoop带有用Java语言编写的框架,因此运行在 Linux 生产平台上是非常理想的
Hadoop 上的应用程序也可以使用其他语言编写,比如 C++

#4 hadoop大数据处理的意义

Hadoop得以在大数据处理应用中广泛应用得益于其自身在数据提取、变形和加载(ETL)方面上的天然优势。
Hadoop的分布式架构,将大数据处理引擎尽可能的靠近存储,对例如像ETL这样的批处理操作相对合适,
因为类似这样操作的批处理结果可以直接走向存储。
Hadoop的MapReduce功能实现了将单个任务打碎,并将碎片任务(Map)发送到多个节点上,
之后再以单个数据集的形式加载(Reduce)到数据仓库里

#5 核心架构

Hadoop 由许多元素构成。其最底部是 Hadoop Distributed File System(HDFS),它存储 Hadoop 集群中所有存储节点上的文件。HDFS(对于本文)的上一层是MapReduce 引擎,该引擎由 JobTrackers 和 TaskTrackers 组成。
通过对Hadoop分布式计算平台最核心的分布式文件系统HDFS、MapReduce处理过程,
以及数据仓库工具Hive和分布式数据库Hbase的介绍,基本涵盖了Hadoop分布式平台的所有技术核心。

(1)HDFS
对外部客户机而言,HDFS就像一个传统的分级文件系统。可以创建、删除、移动或重命名文件,等等。
但是 HDFS 的架构是基于一组特定的节点构建的(参见图 1),这是由它自身的特点决定的。
这些节点包括 NameNode(仅一个),它在 HDFS 内部提供元数据服务;
DataNode,它为 HDFS 提供存储块。由于仅存在一个 NameNode,因此这是 HDFS 1.x版本的一个缺点(单点失败)。
在Hadoop 2.x版本可以存在两个NameNode,解决了单节点故障问题。
存储在 HDFS 中的文件被分成块,然后将这些块复制到多个计算机中(DataNode)。
这与传统的 RAID 架构大不相同。块的大小(1.x版本默认为 64MB,2.x版本默认为128MB)和复制的块数量在创建文件时由客户机决定。NameNode 可以控制所有文件操作。HDFS 内部的所有通信都基于标准的 TCP/IP 协议。

(2)NameNode
NameNode 是一个通常在 HDFS 实例中的单独机器上运行的软件。它负责管理文件系统名称空间和控制外部客户机的访问。
NameNode 决定是否将文件映射到 DataNode 上的复制块上。
对于最常见的 3 个复制块,第一个复制块存储在同一机架的不同节点上,最后一个复制块存储在不同机架的某个节点上。
注意,这里需要您了解集群架构。
实际的 I/O事务并没有经过 NameNode,只有表示 DataNode 和块的文件映射的元数据经过 NameNode。
当外部客户机发送请求要求创建文件时,NameNode 会以块标识和该块的第一个副本的 DataNode IP 地址作为响应。
这个 NameNode 还会通知其他将要接收该块的副本的 DataNode。
NameNode 在一个称为 FsImage 的文件中存储所有关于文件系统名称空间的信息。
这个文件和一个包含所有事务的记录文件(这里是 EditLog)将存储在 NameNode 的本地文件系统上。
FsImage 和 EditLog 文件也需要复制副本,以防文件损坏或 NameNode 系统丢失。
NameNode本身不可避免地具有SPOF(Single Point Of Failure)单点失效的风险,主备模式并不能解决这个问题,
通过Hadoop Non-stop namenode才能实现100% uptime可用时间。

(3)DataNode
DataNode 也是一个通常在 HDFS实例中的单独机器上运行的软件。Hadoop 集群包含一个 NameNode 和大量 DataNode。
DataNode 通常以机架的形式组织,机架通过一个交换机将所有系统连接起来。
Hadoop 的一个假设是:机架内部节点之间的传输速度快于机架间节点的传输速度。
DataNode 响应来自 HDFS 客户机的读写请求。它们还响应来自 NameNode 的创建、删除和复制块的命令。
NameNode 依赖来自每个 DataNode 的定期心跳(heartbeat)消息。
每条消息都包含一个块报告,NameNode 可以根据这个报告验证块映射和其他文件系统元数据。
如果 DataNode 不能发送心跳消息,NameNode 将采取修复措施,重新复制在该节点上丢失的块。

(4)文件操作
可见,HDFS 并不是一个万能的文件系统。它的主要目的是支持以流的形式访问写入的大型文件。
如果客户机想将文件写到 HDFS 上,首先需要将该文件缓存到本地的临时存储。
如果缓存的数据大于所需的 HDFS 块大小,创建文件的请求将发送给 NameNode。NameNode 将以 DataNode 标识和目标块响应客户机。
同时也通知将要保存文件块副本的 DataNode。
当客户机开始将临时文件发送给第一个 DataNode 时,将立即通过管道方式将块内容转发给副本 DataNode。
客户机也负责创建保存在相同 HDFS名称空间中的校验和(checksum)文件。
在最后的文件块发送之后,NameNode 将文件创建提交到它的持久化元数据存储(在 EditLog 和 FsImage 文件)。

(5)Linux 集群
Hadoop 框架可在单一的 Linux 平台上使用(开发和调试时),官方提供MiniCluster作为单元测试使用,
不过使用存放在机架上的商业服务器才能发挥它的力量。这些机架组成一个 Hadoop 集群。
它通过集群拓扑知识决定如何在整个集群中分配作业和文件。
Hadoop 假定节点可能失败,因此采用本机方法处理单个计算机甚至所有机架的失败。

#6 hadoop的常用模块

Apache Hadoop 为可靠的,可扩展的分布式计算开发开源软件
Apache Hadoop软件库是一个框架,它允许使用简单的编程模型跨计算机群集分布式处理大型数据集(海量的数据)

上述每个模块有自己独立的功能,而模块之间又有相互的关联

#7 HADOOP生态圈以及各组成部分的简介

广义上来说,HADOOP通常是指一个更广泛的概念——HADOOP生态圈
HADOOP是apache旗下的一套开源软件平台
HADOOP提供的功能:利用服务器集群,根据用户的自定义业务逻辑,对海量数据进行分布式处理
HADOOP的核心组件有:

hadoop生态圈中 各个组件 作用
hdfs(分布式文件系统) 就是一个文件系统,可以存储海量的数据
mapreduce(分布式运算程序开发框架) 从海量的数据中,通过一定的算法,计算出有用信息
hive(基于大数据技术(文件系统+运算框架)的SQL数据仓库工具) 就是sql语句解释器,接收用户输入的sql语句,然后将该sql语句翻译成复杂的mapreduce程序,并发布到mr集群中进行运算,也是计算出有用的信息。
hbase(基于HADOOP的分布式海量数据库) mysql是基于linux/window的文件系统的数据库,而hbase就是基于hdfs文件系统的数据库。
flume(日志数据采集框架) 就是一个水泵,将水从一个源水坑,抽到到另一个目的水坑中。当然flume抽的是 “数据”。将数据从一个文件中抽取到另一个文件中
sqoop(数据导入导出工具) 将hdfs文件系统的文件,导出到linux文件系统的文件中。就像“豌豆荚”应用程序,实现 android系统与window系统之间文件的导入导出。
ooize/azkaban(工作流调度框架) 一个完整的业务(work)是由多个任务(task)相互配合完成的。该组件就是负责协调各个task的执行顺序

其他组件
ZOOKEEPER:(分布式协调服务基础组件)
Mahout:基于mapreduce/spark/flink等分布式运算框架的机器学习算法库

#9 MapReduce理论基础

每个MapReduce job都是Hadoop客户端想要执行的一个工作单元,它一般由输入数据、MapReduce程序和配置信息组成,而Hadoop会把每个job分隔成两类任务(task):map任务和reduce任务。在Hadoop集群中有两类节点来执行两类job进程的执行

  • 9.1 大数据处理

任何基础业务包含了收集、分析、监控、过滤、搜索或组织web内容的公司或组织都面临着所谓的“大数据”问题:“web规模”处理即海量数据处理的代名词。社交类网站的兴起也使得这些组织面临着另一个问题:用户行为数据分析,这涉及到通过日志文件记录用户的对web页面浏览、点击、停留时长等,而后对日志文件中的大量数据进行分析以支持进行合理、正确的商业决策。

那么,大数据处理究竟意味着对多大规模的数据进行处理?一个简单的例子:Google在2004年平均每天利用MapReduce处理100GB的数据,到2008年平均每天处理的数据已经达到20PB;2009年,Facebook的数据量达到2.5PB,且以每天15TB的速度在增长。PB级别的数据集正变得越来越常见,大数据时代的到来已然是不争的事实,密集数据处理也正迅速成为现实需求。

大数据问题的处理需要以与传统数据处理方式所不同的方法去实现,这正是MapReduce思想得以大放光彩的核心所在。MapReduce在实现大数据处理上有着多个基础理论思想的支撑,然而这些基础理论甚至实现方法都未必是MapReduce所创,它们只是被MapReduce采用独特的方式加以利用而已。

(1) 向外扩展(Scale out)而非向上扩展(Scale up):大数据的处理更适合采用大量低端商业服务器(scale out)而非少量高端服务器(scale up)。后者正是向上扩展的系统性能提升方式,它通常采用有着SMP架构的主机,然而有着大量的CPU插槽(成百上千个)及大量的共享内存(可以多达数百GB)的高端服务器非常昂贵,但其性能的增长却非线性上升的,因此性价比很一般。而大量的低端商业服务器价格低廉、易于更换和伸缩等特性有效避免了向上扩展的敝端。
(2)假设故障很常见(Assume failures are common):在数据仓库架构级别,故障是不可避免且非常普遍的。假设一款服务器出故障的平均概率为1000天1次,那么10000台这种服务器每天出错的可能性将达到10次。因此,大规模向外扩展的应用场景中,一个设计优良且具有容错能力的服务必须能有效克服非常普遍的硬件故障所带来的问题,即故障不能导致用户应用层面的不一致性或非确定性。MapReduce编程模型能通过一系列机制如任务自动重启等健壮地应付系统或硬件故障。
(3)将处理移向数据(Move processing to the data):传统高性能计算应用中,超级计算机一般有着处理节点(processing node)和存储节点(storage node)两种角色,它们通过高容量的设备完成互联。然而,大多数数据密集型的处理工作并不需要多么强大的处理能力,于是把计算与存储互相分开将使得网络成为系统性能瓶颈。为了克服计算如此类的问题,MapReduce在其架构中将计算和存储合并在了一起,并将数据处理工作直接放在数据存储的位置完成,只不过这需要分布式文件系统予以支撑。
(4)顺序处理数据并避免随机访问(Process data sequentially and avoid random access):大数据处理通常意味着海量的数量难以全部载入内存,因而必须存储在磁盘上。然而,机械式磁盘寻道操作的先天性缺陷使得随机数据访问成为非常昂贵的操作,因此避免随机数据访问并以顺序处理为目的完成数据组织成为亟待之需。固态磁盘虽然避免了机械磁盘的某此缺陷,然而其高昂的价格以及并没有消除的随机访问问题仍然无法带来性能上的飞跃发展。MapReduce则主要设计用来在海量数据集上完成批处理操作,即所有的计算被组织成较长的流式处理操作,以延迟换取较大的吞吐能力。
(5)向程序员隐藏系统级别的细节(Hide system-level details from the application developer):
(6)无缝扩展(Seamless scalability):

  • 9.2 MapReduce和大数据问题

海量数据处理的核心思想无非是将一个较大的问题进行“分割包围、逐个歼灭”。然而其难点和关键点在于如何将一个大的问题分分割成多个可以分别在不同的CPU上或不同的主机上进行处理的独立小问题,而且这些独立进行处理的小问题所产生的中间结果又该如何合并成最终结果并予以输出。因此,看似简单的化整为零的处理思想却不得不面临如下的难题:
(1) 如何将大问题分割为小任务?进一步地,如何将大问题分解为可以并行处理的小任务?
(2) 如何将分解好的小任务派送给分布式系统中的某主机且是较为适合解决此问题的主机上的worker完成处理?
(3) 如何保证某worker获取所需的数据?
(4) 如何协调不同worker之间进行同步?
(5) 如何将某worker的部分结果共享给其它需要此结果的worker?
(6) 如何在出现软件或硬件故障时仍然能保证上述工作的顺利进行?

在传统的并行或分布式编程模型中,程序员不得不显式地解决上述的部分甚至是全部问题,而在共享内存编程中,程序员需要显式地协调对共享数据结构的如互斥锁的访问、显式地通过栅(barrier)等设备解决进程同步问题、并得时刻警惕着程序中可能出现的死锁或竞争条件。虽然有些编程语言也或多或少地规避了让程序员面对上述问题,但却也避免不了将资源分配给各worker的问题。MapReduce的优势之一便是有效地向程序员隐藏了这些问题。

  • 9.3 函数式编译语言

MapReduce是一种类似于Lisp或ML的函数式编程语言。函数式编程的核心特性之一是基于高阶函数,即能够接受其它函数作为参数的函数完成编程。MapReduce有两个常见地内置高阶函数map和fold。

如图所示,给定一个列表,map(接受一个参数)以函数f为其参数并将其应用于列表中的所有元素;fold(接受两个参数)以函数g和一个初始值作为参数,然后将g应用于初始值和列表中的第一个元素,结果被放置于中间变量中。中间变量和第二个元素将作为g函数下一次应用时的参数,而后如此操作直至将列表中的所有元素处理完毕后,fold会将最终处理结果保存至一个中间变量中。

于是,基于上述过程,我们可以把map视作利用f函数将给定数据集完成形式转换的操作,同样地,fold就可以被看作利用g函数完成数据聚合的操作。我们就可以由此得知,各函数式程序在运行时彼此间是隔离的,因此,在map中将f函数应用于列表中每一个元素的操作可以并行进行,进一步地讲,它们可以分布于集群中的不同节点上并行执行。然而,受限于数据的本地性,fold操作需要等到列表中的每一个元素都准备停当之后才能进行。幸运地是,现实生活中的应用程序并不要求g函数应用于列表中的所有元素,因此,列表中元素可以被分为多个逻辑组,并将fold操作并行地应用在这些逻辑组上即可。由此,fold操作也可以以并行的方式高效完成。

MapReduce有两个常见地内置高阶函数map和reduce,其map就类似于上述过程中的map操作,reduce对应于上述过程中的fold操作。只不过,MapReduce的执行框架能自行协调map与reduce并将其应用于在商业服务器硬件平台上并行处理海量数据。

更为精确地说,MapReduce有三个相互关联却各不相同的概念。首先,MapReduce是一个如上所述的函数式编程语言。其次,MapReduce也是一个运行框架,它能够协调运行基于MapReduce思想开发的程序。最后,MapReduce还可以被看作编程模型和执行框架的软件实现,如Google的专有实现和另一个开源实现Hadoop等。

  • 9.4 mapper和reducer

键值对儿(Key-value pair)是MapReduce的基础数据结构。Key和Value可以是基础类型数据,如整数、浮点数、字符串或未经加工的字节数据,也可以是任意形式的复杂数据类型。程序员可以自行定义所需的数据类型,也可借助于Protocol Buffer、Thrift或Avro提供的便捷方式完成此类工作。

MapReduce算法设计的工作之一就是在给定数据集上定义“键-值”数据结构,比如在搜索引擎搜集、存储网页类工作中,key可以使用URL来表示,而value则是网页的内容。而在有些算法中,Key也可以是没有任何实际意义的数据,其在数据处理过程中可被安全忽略。在MapReduce中,程序员需要基于如下方式定义mapper和reducer:
map: (k1,v1)–>[(k2,v20)]
reduce: (k2,[v2])–>[(k3,v3)]

其中[…]意味着其可以是一个列表。这些传递给MapReduce进行处理的数据存储于分布式文件上,mapper操作将应用于每一个传递过来的键-值对并生成一定数量的中间键值对(intermediate key-value),而后reduce操作将应用于这些中间键值对并输出最终的键值对。然而,mapper操作和reducer操作之间还隐含着一个应用于中间键值对的“分组”操作,同一个键的键值对需要被归类至同一组中并发送至同一个reducer,而传送给每个reducer的分组中的键值对是基于键进行排序后的列表。reducer生成的结果将会保存至分布式文件系统,并存储为一个或多个以r(即reducer号码)结尾的文件,但mapper生成的中间键值对数据则不会被保存。

在Hadoop中,mapper和reducer是分别由MAP和REDUCE方法实现的对象。每个map任务(接收一个称作input split的键值对列表)都被初始化一个mapper对象,并会由执行框架为每个输入的键值对调用一次其map方法。程序员可以配置启动的map任务个数,但其真正启动的数目则由执行框架根据数据的物理分布最终给定。类似地,每个reduce任务由REDUCE方法初始化为一个reduce对象,并会由执行框架为其接受的每个中间键值对调用一次REDUCE方法,所不同的是,程序员可以明确限定启动的reduce任务的个数。

mapper和reducer可以直接在各自接收的数据上执行所需要的操作,然而,当使用到外部资源时,多个mapper或reducer之间可能会产生资源竞争,这势必导致其性能下降,因此,程序员必须关注其所用资源的竞争条件并加入适当处理。其次,mapper输出的中间键值对与接受的键值对可以是不同的数据类型,类似地,reducer输出的键值对与其接收的中间键值对也可以是不同的数据类型,这可能会给编程过程及程序运行中的故障排除带来困难,但这也正是MapReduce强大功能的体现之一。

除了常规的两阶段MapReduce处理流外,其还有一些变化形式。比如将mapper输出的结果直接保存至磁盘中(每个mapper对应一个文件)的没有reducer的MapReduce作业,不过仅有reducer而没有mapper的作业是不允许的。不过,就算用不着reducer处理具体的操作,利用reducer将mapper的输出结果进行重新分组和排序后进行输出也能以另一种形式提供的完整MapReduce模式。

MapReduce作业一般是通过HDFS读取和保存数据,但它也可以使用其它满足MapReduce应用的数据源或数据存储,比如Google的MapReduce实现中使用了Bigtable来完成数据的读入或输出。BigTable属于非关系的数据库,它是一个稀疏的、分布式的、持久化存储的多维度排序Map,其设计目的是可靠的处理PB级别的数据,并且能够部署到上千台机器上。在Hadoop中有一个类似的实现HBase可用于为MapReduce提供数据源和数据存储。

  • 9.5 Hadoop运行框架

MapReduce程序也称作为MapReduce作业,一般由mapper代码、reducer代码以及其配置参数(如从哪儿读入数据,以及输出数据的保存位置)组成。准备好的作业可通过JobTracker(作业提交节点)进行提交,然后由运行框架负责完成后续的其它任务。这些任务主要包括如下几个方面。
(1) 调度
每个MapReduce作业都会划分为多个称作任务(task)的较小单元,而较大的作业划分的任务数量也可能会超出整个集群可运行的任务数,此时就需要调度器程序维护一个任务队列并能够追踪正在运行态任务的相关进程,以便让队列中处于等待状态的任务派送至某转为可用状态的节点运行。此外,调度器还要负责分属于不同作业的任务协调工作。
对于一个运行中的作业来说,只有所用的map任务都完成以后才能将中间数据分组、排序后发往reduce作业,因此,map阶段的完成时间取决于其最慢的一个作业的完成时间。类似的,reduce阶段的最后一个任务执行结束,其最终结果才为可用。因此,MapReduce作业完成速度则由两个阶段各自任务中的掉队者决定,最坏的情况下,这可能会导致作业长时间得不到完成。出于优化执行的角度,Hadoop和Google MapReduce实现了推测执行(Speculative execution)机制,即同一个任务会在不同的主机上启动多个执行副本,运行框架从其最快执行的任务中取得返回结果。不过,推测执行并不能消除其它的滞后场景,比如中间键值对数据的分发速度等。
(2) 数据和代码的协同工作(data/code co-location)
术语“数据分布”可能会带来误导,因为MapReduce尽力保证的机制是将要执行的代码送至数据所在的节点执行,因为代码的数据量通常要远小于要处理的数据本身。当然,MapReduce并不能消除数据传送,比如在某任务要处理的数据所在的节点已经启动很多任务时,此任务将不得不在其它可用节点运行。此时,考虑到同一个机架内的服务器有着较充裕的网络带宽,一个较优选择是从数据节点同一个机架内挑选一个节点来执行此任务。
(3) 同步(Synchronization)
异步环境下的一组并发进程因直接制约而互相发送消息而进行互相合作、互相等待,使得各进程按一定的速度执行的过程称为进程间同步,其可分为进程同步(或者线程同步)和数据同步。就编程方法来说,保持进程间同步的主要方法有内存屏障(Memory barrier),互斥锁(Mutex),信号量(Semaphore)和锁(Lock),管程(Monitor),消息(Message),管道(Pipe)等。MapReduce是通过在map阶段的进程与reduce阶段的进程之间实施隔离来完成进程同步的,即map阶段的所有任务都完成后对其产生的中间键值对根据键完成分组、排序后通过网络发往各reducer方可开始reduce阶段的任务,因此这个过程也称为“shuffle and sort”。
(4) 错误和故障处理(Error and fault handling)
MapReduce运行框架本身就是设计用来容易发生故障的商用服务器上了,因此,其必须有着良好的容错能力。在任何类别的硬件故障发生时,MapReduce运行框架均可自行将运行在相关节点的任务在一个新挑选出的节点上重新启动。同样,在任何程序发生故障时,运行框架也要能够捕获异常、记录异常并自动完成从异常中恢复。另外,在一个较大规模的集群中,其它任何超出程序员理解能力的故障发生时,MapReduce运行框架也要能够安全挺过。

  • 9.6 partitioner和combiner

除了前述的内容中的组成部分,MapReduce还有着另外两个组件:partiontioner和combiner。

Partitioner负责分割中间键值对数据的键空间(即前面所谓的“分组”),并将中间分割后的中间键值对发往对应的reducer,也即partitioner负责完成为一个中间键值对指派一个reducer。最简单的partitioner实现是将键的hash码对reducer进行取余计算,并将其发往余数对应编号的reducer,这可以尽力保证每个reducer得到的键值对数目大体上是相同的。不过,由于partitioner仅考虑键而不考虑“值”,因此,发往每个reducer的键值对在键数目上的近似未必意味着数据量的近似。

Combiner是MapReduce的一种优化机制,它的主要功能是在“shuffle and sort”之前先在本地将中间键值对进行聚合,以减少在网络上发送的中间键值对数据量。因此可以把combiner视作在“shuffle and sort”阶段之前对mapper的输出结果所进行聚合操作的“mini-reducer”。在实现中,各combiner之间的操作是隔离的,因此,它不会涉及到其它mapper的数据结果。需要注意的是,就算是某combiner可以有机会处理某键相关的所有中间数据,也不能将其视作reducer的替代品,因为combiner输出的键值对类型必须要与mapper输出的键值对类型相同。无论如何,combiner的恰当应用将有机会有效提高作业的性能。

#10 分布式文件系统(DFS)

前面的讨论中,我们已经了解了Hadoop中实现的MapReduce是一个编程模型和运行框架,它能够通过JobTracker接收客户提交的作业而后将其分割为多个任务后并行运行在多个TaskTracker上。而问题是,这些TaskTracker如何高效获取所要处理的数据?

在传统的高性能集群中,计算节点和存储节点是各自独立的,它们之间通过高速网络完成互联,然而,在面临海量数据处理的问题时,网络必然会成为整个系统的性能瓶颈,这就需要引入超高速的网络如万兆以太网或Infiniband。然而,对大数场景来讲它们属于“奢侈品”,且昂贵的投入并不能带来网络性能的线性提升,因此性价比不高。面对这种问题,MapReduce采取了将计算节点与存储节点合二为一的集群模型,它利用分布式文件系统将数据存储于多个节点上,而后让处理过程在各数据节点本地直接进行,从而极大地降低了数据通过网络传送的需求。不过,这里仍然需要说明的是,MapReduce并非依赖于分布式文件系统,只不过运行在非分布式文件系统的MapReduce的诸多高级特性将无用武之地。

事实上,分布式文件系统并非MapReduce带来的新生事物,只不过,MapReduce站在前人的基础上将分布式文件系统进行了改造以使得它更能够适用于在MapReduce中完成海量数据处理。Google为在他们的MapReduce中实现的分布式文件系统为GFS(Google File System),而Hadoop的实现称作HDFS(Hadoop Distributed File System)。

  • 10.1 HDFS的设计理念

HDFS专为存储大文件而设计,可运行于普通的商业服务器上,基于流式数据访问模型完成数据存取。HDFS将所有文件的元数据存储于名称节点(NameNode)的内存中,能够利用分布式特性高效地管理“大”文件(GB级别甚至更大的文件),对于有着海量小文件的应用场景则会给名称节点带去巨大压力并使得其成为系统性能瓶颈。再者,HDFS为MapReduce的计算框架而设计,存储下来数据主要用于后续的处理分析,其访问模型为“一次写入、多次读取”;因此,数据在HDFS中存储完成后,仅能在文件尾部附加新数据,而不能对文件进行修改。另外,HDFS专为了高效地传输大文件进行了优化,其为了完成此目标,在“低延迟”特性上做出了很大让步,因此,其不适用于较小访问延迟的应用。

  • 10.2 HDFS架构

10.2.1 HDFS数据块

与传统文件系统一样,HDFS也在“块(block)”级别存取文件,所不同的是,传统文件系统数据块一般较小(1KB、2KB或4KB等),HDFS的数据块大小默认为64MB,甚至可以使用128MB或256MB级别的数据块。HDFS使用块抽象层管理文件,可以实现将分块分为多个逻辑部分后分布于多个存储节点,也能够有效简化存储子系统。而对于存储节点来说,较大的块可以减少磁盘的寻道次数,进而提升I/O性能。

10.2.2 名称节点(NameNode)和数据节点(DataNode)

HDFS集群中节点的工作模型为“master-worker”:其包含一个名称节点(master)和多个数据节点(worker)。

名称节点负责管理HDFS的名称空间,即以树状结构组织的目录及文件的元数据信息,这些信息持久存储于名称节点本地磁盘上并保存为名称空间镜像(namespace image)和编辑日志(edit log)两个文件。名称节点并不存储数据块,它仅需要知道每个文件对应数据块的存储位置,即真正存储了数据块的数据节点。然而,名称节点并不会持久存储数据块所与其存储位置的对应信息,因为这些信息是在HDFS集群启动由名称节点根据各数据节点发来的信息进行重建而来。这个重建过程被称为HDFS的安全模式。数据节点的主要任务包括根据名称节点或客户的要求完成存储或读取数据块,并周期性地将其保存的数据块相关信息报告给名称节点。

默认情况下,HDFS会在集群中为每个数据块存储三个副本以确保数据的可靠性、可用性及性能表现。在一个大规模集群中,这三个副本一般会保存至不同机架中的数据节点上以应付两种常见的故障:单数据节点故障和导致某机架上的所有主机离线的网络故障。另外,如前面MapReduce运行模型中所述,为数据块保存多个副本也有利于MapReduce在作业执行过程中透明地处理节点故障等,并为MapReduce中作业协同处理以提升性能提供了现实支撑。名称节点会根据数据节点的周期性报告来检查每个数据块的副本数是否符合要求,低于配置个数要求的将会对其进行补足,而多出的将会被丢弃。

HDFS提供了POSIX网络的访问接口,所有的数据操作对客户端程序都是透明的。当客户端程序需要访问HDFS中的数据时,它首先基于TCP/IP协议与名称节点监听的TCP端口建立连接,接着通过客户端协议(Client Protocol)发起读取文件的请求,而后名称节点根据用户请求返回相关文件的块标识符(blockid)及存储了此数据块的数据节点。接下来客户端向对应的数据节点监听的端口发起请求并取回所需要数据块。当需要存储文件并写数据时,客户端程序首先会向名称节点发起名称空间更新请求,名称节点检查用户的访问权限及文件是否已经存在,如果没有问题,名称空间会挑选一个合适的数据节点分配一个空闲数据块给客户端程序。客户端程序直接将要存储的数据发往对应的数据节点,在完成存储后,数据节点将根据名称节点的指示将数据块复制多个副本至其它节点。

10.2.3 名称节点的可用性

由前一节所述的过程可以得知,名称节点的宕机将会导致HDFS文件系统中的所有数据变为不可用,而如果名称节点上的名称空间镜像文件或编辑日志文件损坏的话,整个HDFS甚至将无从重建,所有数据都会丢失。因此,出于数据可用性、可靠性等目的,必须提供额外的机制以确保此类故障不会发生,Hadoop为此提供了两种解决方案。

最简单的方式是将名称节点上的持久元数据信息实时存储多个副本于不同的存储设备中。Hadoop的名称节点可以通过属性配置使用多个不同的名称空间存储设备,而名称节点对多个设备的写入操作是同步的。当名称节点故障时,可在一台新的物理主机上加载一份可用的名称空间镜像副本和编辑日志副本完成名称空间的重建。然而,根据编辑日志的大小及集群规模,这个重建过程可能需要很长时间。

另一种方式是提供第二名称节点(Secondary NameNode)。第二名称节点并不真正扮演名称节点角色,它的主要任务是周期性地将编辑日志合并至名称空间镜像文件中以免编辑日志变得过大。它运行在一个独立的物理主机上,并需要跟名称节点同样大的内存资源来完成文件合并。另外,它还保存一份名称空间镜像的副本。然而,根据其工作机制可知,第二名称节点要滞后于主节点,因此名称节点故障时,部分数据丢失仍然不可避免。

尽管上述两种机制可以最大程序上避免数据丢失,但其并不具有高可用的特性,名称节点依然是一个单点故障,因为其宕机后,所有的数据将不能够被访问,进而所有依赖于此HDFS运行的MapReduce作业也将中止。就算是备份了名称空间镜像和编辑日志,在一个新的主机上重建名称节点并完成接收来自各数据节点的块信息报告也需要很长的时间才能完成。在有些应用环境中,这可能是无法接受的,为此,Hadoop 0.23引入了名称节点的高可用机制——设置两个名称节点工作于“主备”模型,主节点故障时,其所有服务将立即转移至备用节点。进一步信息请参考官方手册。

在大规模的HDFS集群中,为了避免名称节点成为系统瓶颈,在Hadoop 0.23版本中引入了HDFS联邦(HDFS Federation)机制。HDFS联邦中,每个名称节点管理一个由名称空间元数据和包含了所有块相关信息的块池组成名称空间卷(namespace volume),各名称节点上的名称空间卷是互相隔离的,因此,一个名称节点的损坏并不影响其它名称节点继续提供服务。进一步信息请参考官方手册。

ZooKeeper

在通过一组服务器向客户端提供服务的场景中,需要客户端能定位各服务器以便使用其提供的服务。然而这面临的挑战之一便是如何维持这个服务器列表——其显然不能放置于网络中的某单个节点上,否则此节点故障将导致整个系统不可用。即便我们有办法保证存储此服务器列表的节点不会出现故障,但当列表中的某服务器故障时将其移出列表仍然会是个问题,故障的服务器无法自行退出列表,因此这需要外部的一组处理动作来完成。Zookeeper正是设计用来提供这种服务。

可以把Zookeeper想像成为一个提供高可用功能的文件系统,它没有文件或目录,而用znode来统一实现目录及文件的功能,它既可以存储数据,又可以包含其它的znode。所有的znodes组成一个层次性的名称空间,父节点的名称为某服务器组的名称,其子节点的名称为此组中的各服务器名称。

开发分布式程序是比较困难的,主要原因在于“部分性错误”——当报文通过网络在两个节点间传递的过程中发生了网络错误,此时,发送方对数据是否已经完整发送至对方无从知晓。惟一可以获知此相关信息的途径是重新连接收方并向其发出询问,但这本身也还是一个问题——我们无法得知询问本身是否正常完成。

ZooKeeper并不能消除“部分性错误”,因为其本质上也是分布式系统。因此,其当然也无法隐藏“部分性错误”。然而,ZooKeeper提供了一组工具,它们能够帮助程序员构建可安全处理“部分式错误”的分布式应用程序。当然,ZooKeeper还有着诸多优点:

1、简洁:ZooKeeper的核心是一个精简的文件系统,它仅提供了几个简单操作和一些额外的抽像机制如排序和通知等功能;
2、富于表现力:ZooKeeper的本体是一组丰富的可用于构建大规模协作式数据结构和协议的代码块,这包括分布式队列、分布式锁以及在一组节点中推举主导节点等;
3、高可用:ZooKeeper运行于一组主机,设计人员在对其进行设计时就充分考虑到节点故障的可能性并由此给系统带来的问题,由此为其添加了高可用能力;
4、松耦合的交互性:ZooKeeper的交互式并不要求协作方事先互相知悉彼此的存在,甚至也不要求各协作方预先进行同步;
5、开源:ZooKeeper是一个开源项目;
6、高性能

Pig:

Hive:
适用于数据仓库类的应用程序,但其并不是一个全状态的数据库,这主要受限于Hadoop自身设计的缺陷。其最大的缺陷在于Hive不支持行级别的更新、插入和删除操作。其次,Hadoop是面向批处理的系统,其MapReduce job的启动有着很大的开销,因此Hive查询有着很高的延迟,通常在传统数据上可以几秒钟完成的查询操作在Hive需要更长的时间,即使数据集非常小也无法避免。再次,Hive无法支持OLTP(Online Transaction Processing)的关键特性,而是接近于OLAP(Online Analytic Processing),然而在Online能力方面的表现仍然与期望有着一定的差距。故此,Hive最适用于数据仓库类的应用场景,即通过数据挖掘完成数据分析、生成报告并支持智能决策等。

鉴于Hive本身的限制,如果期望在大数据集上实现OLTP式的特性,就得认真考虑NoSQL数据库了,比如HBase、Cassandra和DynamoDB等。

Namenodes彼此间是联合(federated)关系,因此各节点均是独立的。对于Namenodes来说,Datanodes就像是普通的块设备,它们需要在各Namenodes注册后才能使用,同时Datanodes则周期性地向Namenodes发送心跳信息、数据块的使用情况,并负责响应来自Namenodes的各种命令。

Block pool:
隶属于同一个Namenodes的所有数据块的集合称作“块池”。为了便于Namespace为新加入到当前Namespace的中块分派Block ID,不同的块池被设计为彼此间相互独立,这样每个Namespace选择Block ID无须与其它的Namenodes进行协调,同时,任何namenode故障也会影响到datanodes向其它namenodes提供服务。

Namespace和其块池组合起来称作Namespace卷——一个自包含的管理单元。当删除一个Namenode/Namespace时,与之相关的块池亦会从datanode上删除。同时,当集群升级时,namespace卷也被当作一个独立的单元进行升级。

ClusterID
ClusterID用于标识隶属于某集群的所有节点,任何一个新的namenode在格式化时,集群会自动将当前集群的ClusterID标识于此节点。

优势:
Namespace Scalability —— HDFS集群存储进行水平伸缩时namespace不受影响,因此,部署大型HDFS集群或将HDFS集群用于海量小文件时,可通过简单的添加节点对集群进行扩展。
Performance —— HDFS文件系统的吞吐能力取决于namende,因此,单一namenode很容易成为整个系统性能的瓶颈;而多namenode便于扩展系统性能。
Isolation ——

企业级Hadoop大数据平台实战(1)——基础知识说明相关推荐

  1. 《Cloudera hadoop大数据平台实战指南》此书2019年1月已上市

    这本书由宋立桓老师和陈建平老师共同合作,本书的切入点明确而清晰,从Hadoop 生态明星 Cloudera 入手,单刀直入逐步引出各类大数据基础和核心应用框架. 全书系统介绍了大数据的相关知识,全书共 ...

  2. 大数据基础——Hadoop大数据平台搭建

    文章目录 前言 Hadoop大数据平台搭建 一.Hadoop原理和功能介绍 二.Hadoop安装部署 三.Hadoop常用操作 总结 前言 分布式机器学习为什么需求大数据呢?随着海量用户数据的积累,单 ...

  3. Hadoop大数据平台开发与案例分析

    关于举办"Hadoop大数据平台开发与案例分析 "高级工程师 一.课程介绍 1. 需求理解 Hadoop 设计之初的目标就定位于高可靠性.高可拓展性.高容错性和高效性,正是这些设计 ...

  4. hadoop大数据平台架构之DKhadoop详解

    hadoop大数据平台架构之DKhadoop详解 大数据的时代已经来了,信息的爆炸式增长使得越来越多的行业面临这大量数据需要存储和分析的挑战.Hadoop作为一个开源的分布式并行处理平台,以其高拓展. ...

  5. 初识大数据--Hadoop大数据平台架构与实践

    Hadoop大数据平台架构与实践 推荐书籍: ⭐大数据存储与处理技术的原理(理论) ⭐Hadoop的使用和开发能力(实践) 预备知识: Linux常用命令 Java基础编程 1.大数据相关概念 ​ 无 ...

  6. Vue+Echarts构建可视化大数据平台实战项目(上)粒子动效,登录界面抖动,背景图轮播★

    Vue+Echarts构建可视化大数据平台实战项目(上) 前言 分享之前我们先来普及一下什么是数据可视化?数据可视化可以把数据从冰冷的数字转换成图形,揭示蕴含在数据中的规律和道理.数据可视化通俗来说就 ...

  7. Hadoop大数据平台安装

    实验一:Hadoop大数据平台安装 16281002 杜永坤 1.实验目的 在大数据时代,存在很多开源的分布式数据采集.计算.存储技术,本实验将熟悉并搭建几种常用的大数据采集.处理分析技术环境. &l ...

  8. Hadoop大数据平台环境搭建注意事项,分布式数据采集,武汉数道云科技

    Hadoop大数据作为时代发展的产物,影响着互联网企业发展.以及企业关于品牌形象推广.政府有关民意采集.以及有关数据信息收集分类------ Hadoop技术的发展,带来了海量数据高效处理的能力,也给 ...

  9. 直播预告| 一次实用的“企业级开源大数据平台上层应用”指南

    本期 WeDataSphere开源社区推出关于 Qualitis.Prophecis.DataSphereStudio和Schedulis四个组件的内容,为大家介绍涵盖数据质量管理平台.机器学习平台. ...

最新文章

  1. 在CentOS 6.9 x86_64上从源码安装xz命令的方法
  2. elasticsearch的join查询
  3. Groovy 设计模式 -- 借贷
  4. Ubuntu 安装ipython
  5. 如何使用Sublime Text 3作为Markdown编辑器
  6. 从零开始学python项目_从零开始可以这样学python
  7. spring mvc学习(6):springMVC的常见注解
  8. 镣铐之舞:美团安全工程师Black Hat USA演讲
  9. 【转】20个让Web Developer开发生涯更加轻松的工具
  10. MongoDB (六) MongoDB 集合操作
  11. SpringBoot中LogBack日志输出配置记录
  12. Apache Flink 误用之痛
  13. kindeditor上传图片编辑框乱码问题
  14. 软件验收工作流程及准则
  15. 内置式永磁同步电机IPMSM,基于虚拟信号注入法最大转矩电流比MTPA控制仿真模型
  16. iGoogle背后的思考
  17. zblog php 首页经常被篡改,浏览器首页经常被篡改,这样设置,自己也改不掉!...
  18. 织梦首页php打开慢,DEDECMS网站打开速度慢解决方法
  19. mgo 的 session 与连接池
  20. 一定要小心AI语音合成技术,我妈就被骗了!

热门文章

  1. [原创歌词]网络爱人
  2. Pandas 10-时序数据
  3. MongoDB——查询操作详解
  4. 牛飞盘队(弱鸡的DP自我救赎)
  5. 『算法』哨兵查找算法
  6. 从互联网时代进入物联网时代
  7. Windows纯净桌面实现
  8. 【番外篇】2W字诚意满满的新活:常见接口测试69道面试题,附带答案
  9. python中sin函数用法_Python sin() 函数 - Python 教程 - 自强学堂
  10. 一个生产网络问题Broken Pipe引发的思考