现在的时代,数据量比之前几年有了很大的增长。无论是做业务分析,还是数据挖掘,如何处理巨大的数据量是需要面临的问题,从本章开始学习Hadoop,逐渐深入到大数据领域中来。
首先,我们先要了解什么叫大数据。
当人们谈到大数据时,往往并非仅指数据本身,而是数据和大数据技术这二者的综合。所谓大数据技术,是指伴随着大数据的采集、存储、分析和应用的相关技术,是一系列使用非传统的工具来对大量的结构化、半结构化和非结构化数据进行处理,从而获得分析和预测结果的一系列数据处理和分析技术。
大数据的基本处理流程,主要包括数据采集、存储、分析和结果呈现等环节。而大数据技术则是则这些处理流程中,不断涌现的技术。
流程 | 技术说明 |
---|---|
数据采集与预处理 | 利用ETL工具将分布的,异构数据源中的数据,如关系数据,平面数据文件等,抽取到临时中间层后进行清晰,转换,集成,最后加载到数据仓库或数据集市中,成为联机分析处理,数据挖掘的基础;也可以利用日志采集工具(如FLume,Kafka等)把实时采集的数据作为流计算系统的输入,进行实时处理分析 |
数据存储和管理 | 利用分布式文件系统,数据仓库,关系数据库,NoSQL数据库,云数据库等,实现对结构化,半结构化和非结构化海来数据的存储和管理 |
数据处理与分析 | 利用分布式并行编程模型和计算框架,结合机器学习和数据挖掘算法,实现对海量数据的处理和分析;对分析结果进行可视化呈现,帮助人们更好地理解数据,分析数据 |
数据安全和隐私 | 在从大数据中挖掘潜在的巨大商业价值和学术价值的同时,构建隐私数据保护体系和数据安全体系,有效保护个人隐私和数据安全 |
大数据计算模式 | 解决问题 | 代表产品 |
---|---|---|
批处理计算 | 针对大规模数据的批量处理 | MapReduce,Spark等 |
流计算 | 针对流数据的实时计算 | Storm,S4,Flume,Streams,Puma,DStream,SuperMario,银河流数据处理平台等 |
图计算 | 针对大规模图结构数据的处理 | Pregel,GraphX,Giraph,PowerGraph,Hama,GoldenOrb等 |
查询分析计算 | 大规模数据的存储管理和查询分析 | Dremel,Hive,Cassandra,Impla等 |
云计算、大数据和物联网代表了IT领域最新的技术发展趋势,三者相辅相成,既有联系又有区别。
云计算实现了通过网络提供可伸缩的、廉价的分布式计算能力,用户只需要在具备网络接入条件的地方,就可以随时随地获得所需的各种IT资源。
云计算代表了以虚拟化技术为核心、以低成本为目标的、动态可扩展的网络应用基础设施,是近年来最有代表性的网络计算技术与模式。
云计算包括3种典型的服务模式:
云计算包括公有云、私有云和混合云3种类型:
云计算的关键技术包括虚拟化、分布式存储、分布式计算、多租户等。
虚拟化技术是云计算基础架构的基石,是指将一台计算机虚拟为多台逻辑计算机,在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都可以在相互独立的空间内运行而互不影响。
虚拟化的资源可以是硬件(如服务器、磁盘和网络),也可以是软件。以服务器虚拟化为例,它将服务器物理资源抽象成逻辑资源,让一台服务器变成几台甚至上百台相互隔离的虚拟服务器,不再受限于物理上的界限,而是让CPU、内存、磁盘、I/O等硬件变成可以动态管理的“资源池”,从而提高资源的利用率,简化系统管理,实现服务器整合,让IT对业务的变化更具适应力。
Hyper-V、VMware、KVM、Virtualbox、Xen、Qemu等都是非常典型的虚拟化技术。
面对“数据爆炸”的时代,集中式存储已经无法满足海量数据的存储需求,分布式存储应运而生。
面对海量的数据,传统的单指令单数据流顺序执行的方式已经无法满足快速数据处理的要求,进而产生了一些新颖的计算模式。
多租户技术目的在于使大量用户能够共享同一堆栈的软硬件资源,每个用户按需使用资源,能够对软件服务进行客户化配置,而不影响其他用户的使用。多租户技术的核心包括数据隔离、客户化配置、架构扩展和性能定制。
物联网是物物相连的互联网,是互联网的延伸,它利用局部网络或互联网等通信技术把传感器、控制器、机器、人员和物等通过新的方式连在一起,形成人与物、物与物相连,实现信息化和远程管理控制。
从技术架构上来看,物联网可分为四层:感知层、网络层、处理层和应用层。如下图:
层次 | 功能 |
---|---|
感知层 | 用来感知物理世界,采集来自物理世界的各种信息。包含大量的传感器,如温度传感器,湿度传感器,应力传感器,加速度传感器,重力传感器,气体浓度传感器,二维码标签,RFID标签和读写器,摄像头,GPS等 |
网络层 | 用于信息传输,包括各种类型的网络,如互联网,移动通信网络,卫星通信网络等 |
处理层 | 用于储存和处理信息,包括数据存储,管理和分析平台 |
应用层 | 直接面向客户,满足各种应用需求,如智能交通,智慧农业等 |
物联网中的关键技术包括识别和感知技术(二维码、RFID、传感器等)、网络与通信技术、数据挖掘与融合技术等。
物联网中的网络与通信技术包括短距离无线通信技术和远程通信技术。短距离无线通信技术包括ZigBee、NFC、蓝牙、Wi-Fi、RFID等。远程通信技术包括互联网、2G/3G/4G移动通信网络、卫星通信网络等。
物联网中存在大量数据来源、各种异构网络和不同类型系统,如此大量的不同类型数据,如何实现有效整合、处理和挖掘,是物联网处理层需要解决的关键技术问题。今天,云计算和大数据技术的出现,为物联网数据存储、处理和分析提供了强大的技术支撑,海量物联网数据可以借助于庞大的云计算基础设施实现廉价存储,利用大数据技术实现快速处理和分析,满足各种实际应用需求。
云计算、大数据和物联网代表了IT领域最新的技术发展趋势,三者既有区别又有联系。
第一,大数据、云计算和物联网的区别。大数据侧重于对海量数据的存储、处理与分析,从海量数据中发现价值,服务于生产和生活;云计算本质上旨在整合和优化各种IT资源,并通过网络以服务的方式廉价地提供给用户;物联网的发展目标是实现物物相连,应用创新是物联网发展的核心。
第二,大数据、云计算和物联网的联系。从整体上看,大数据、云计算和物联网这三者是相辅相成的。大数据根植于云计算,大数据分析的很多技术都来自于云计算,云计算的分布式数据存储和管理系统(包括分布式文件系统和分布式数据库系统)提供了海量数据的存储和管理能力,分布式并行处理框架MapReduce提供了海量数据分析能力,没有这些云计算技术作为支撑,大数据分析就无从谈起。反之,大数据为云计算提供了“用武之地”,没有大数据这个“练兵场”,云计算技术再先进,也不能发挥它的应用价值。物联网的传感器源源不断产生的大量数据,构成了大数据的重要数据来源,没有物联网的飞速发展,就不会带来数据产生方式的变革,即由人工产生阶段转向自动产生阶段,大数据时代也不会这么快就到来。同时,物联网需要借助于云计算和大数据技术,实现物联网大数据的存储、分析和处理。
Hadoop则是学习大数据相关知识首先要必须先掌握的。
Hadoop原来是Apache Lucene下的一个子项目,它最初是从Nutch项目中分离出来的专门负责分布式存储以及分布式运算的项目。简单地说来,Hadoop是一个可以更容易开发和运行处理大规模数据的软件平台。
Hadoop是基于Java语言开发的,具有很好的跨平台特性,并且可以部署在廉价的计算机集群中。其核心是分布式文件系统(Hadoop Distributed File System,HDFS)和MapReduce。
下面列举hadoop主要的一些特点:
Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。是针对谷歌文件系统(Google File System,GFS)的开源实现,是面向普通硬件环境的分布式文件系统,具有较高的读写速度、很好的容错性和可伸缩性,支持大规模数据的分布式存储,其冗余数据存储的方式很好地保证了数据的安全性。
HDFS有着高容错性(fault-tolerent)的特点,并且设计用来部署在低廉的(low-cost)硬件上。而且它提供高传输率(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求(requirements)这样可以流的形式访问(streaming access)文件系统中的数据。
Hadoop还实现了MapReduce分布式计算模型。是针对谷歌 MapReduce 的开源实现,允许用户在不了解分布式系统底层细节的情况下开发并行应用程序,采用MapReduce来整合分布式文件系统上的数据,可保证分析和处理数据的高效性。
MapReduce将应用程序的工作分解成很多小的工作小块(small blocks of work)。HDFS为了做到可靠性(reliability)创建了多份数据块(data blocks)的复制(replicas),并将它们放置在服务器群的计算节点中(compute nodes),MapReduce就可以在它们所在的节点上处理这些数据了。
Hadoop API被分成(divide into)如下几种主要的包(package):
包路径 | 说明 |
---|---|
org.apache.hadoop.conf | 定义了系统参数的配置文件处理API |
org.apache.hadoop.fs | 定义了抽象的文件系统API |
org.apache.hadoop.dfs | Hadoop分布式文件系统(HDFS)模块的实现 |
org.apache.hadoop.io | 定义了通用的I/O API,用于针对网络,数据库,文件等数据对象做读写操作 |
org.apache.hadoop.ipc | 用于网络服务端和客户端的工具,封装了网络异步I/O的基础模块 |
org.apache.hadoop.mapred | Hadoop分布式计算系统(MapReduce)模块的实现,包括任务的分发调度等 |
org.apache.hadoop.metrics | 定义了用于性能统计信息的API,主要用于mapred和dfs模块 |
org.apache.hadoop.record | 定义了针对记录的I/O API类以及一个记录描述语言翻译器,用于简化将记录序列化成语言中性的格式(language-neutral manner) |
org.apache.hadoop.tools | 定义了一些通用的工具 |
org.apache.hadoop.util | 定义了一些公用的API |
Hadoop三大发行版本:Apache、Cloudera、Hortonworks。
其他还有很多公司又二次封装的版本,例如星环Hadoop等。
Apache Hadoop版本分为三代,第一代Hadoop称为Hadoop 1.0,第二代Hadoop称为Hadoop 2.0,第三代是Hadoop3.0。
光靠Hadoop无法完成各种各样的大数据任务,除了Hadoop还有很多组件一起组成了Hadoop的生态系统。
经过多年的发展,Hadoop生态系统不断完善和成熟,目前已经包含了多个子项目。除了核心的HDFS和MapReduce以外,Hadoop生态系统还包括Zookeeper、HBase、Hive、Pig、Mahout、Sqoop、Flume、Ambari等功能组件。
Hadoop分布式文件系统(Hadoop Distributed File System,HDFS)是Hadoop项目的两大核心之一,是针对谷歌文件系统(Google File System,GFS)的开源实现。HDFS具有处理超大数据、流式处理、可以运行在廉价商用服务器上等优点。
HDFS 在设计之初就是要运行在廉价的大型服务器集群上,因此在设计上就把硬件故障作为一种常态来考虑,可以保证在部分硬件发生故
HBase是一个提供高可靠性、高性能、可伸缩、实时读写、分布式的列式数据库,一般采用HDFS作为其底层数据存储。HBase是针对谷歌BigTable的开源实现,二者都采用了相同的数据模型,具有强大的非结构化数据存储能力。HBase与传统关系数据库的一个重要区别是,前者采用基于列的存储,而后者采用基于行的存储。HBase具有良好的横向扩展能力,可以通过不断增加廉价的商用服务器来增加存储能力。
Hadoop MapReduce是针对谷歌MapReduce的开源实现。MapReduce是一种编程模型,用于大规模数据集(大于1 TB)的并行运算,它将复杂的、运行于大规模集群上的并行计算过程高度地抽象到了两个函数——Map 和 Reduce 上,并且允许用户在不了解分布式系统底层细节的情况下开发并行应用程序,并将其运行于廉价计算机集群上,完成海量数据的处理。通俗地说,MapReduce 的核心思想就是“分而治之”,它把输入的数据集切分为若干独立的数据块,分发给一个主节点管理下的各个分节点来共同并行完成;最后,通过整合各个节点的中间结果得到最终结果。
Hive是一个基于Hadoop的数据仓库工具,可以用于对Hadoop文件中的数据集进行数据整理、特殊查询和分析存储。Hive 的学习门槛较低,因为它提供了类似于关系数据库 SQL 语言的查询语言——Hive QL,可以通过Hive QL语句快速实现简单的MapReduce统计,Hive自身可以将Hive QL语句转换为MapReduce任务进行运行,而不必开发专门的MapReduce应用,因而十分适合数据仓库的统计分析。
Pig是一种数据流语言和运行环境,适合于使用Hadoop和MapReduce平台来查询大型半结构化数据集。虽然MapReduce应用程序的编写不是十分复杂,但毕竟也是需要一定的开发经验的。Pig的出现大大简化了Hadoop常见的工作任务,它在MapReduce的基础上创建了更简单的过程语言抽象,为Hadoop应用程序提供了一种更加接近结构化查询语言(SQL)的接口。Pig是一个相对简单的语言,它可以执行语句,因此当我们需要从大型数据集中搜索满足某个给定搜索条件的记录时,采用 Pig要比 MapReduce具有明显的优势,前者只需要编写一个简单的脚本在集群中自动并行处理与分发,而后者则需要编写一个单独的MapReduce应用程序。
Mahout是Apache软件基金会旗下的一个开源项目,提供一些可扩展的机器学习领域经典算法的实现,旨在帮助开发人员更加方便快捷地创建智能应用程序。Mahout包含许多实现,包括聚类、分类、推荐过滤、频繁子项挖掘。此外,通过使用 Apache Hadoop 库,Mahout 可以有效地扩展到云中。
Zookeeper是针对谷歌Chubby的一个开源实现,是高效和可靠的协同工作系统,提供分布式锁之类的基本服务(如统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等),用于构建分布式应用,减轻分布式应用程序所承担的协调任务。Zookeeper使用Java编写,很容易编程接入,它使用了一个和文件树结构相似的数据模型,可以使用Java或者C来进行编程接入。
Flume是Cloudera提供的一个高可用的、高可靠的、分布式的海量日志采集、聚合和传输的系统。Flume 支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume 提供对数据进行简单处理并写到各种数据接受方的能力。
Sqoop是SQL-to-Hadoop的缩写,主要用来在Hadoop和关系数据库之间交换数据,可以改进数据的互操作性。通过Sqoop可以方便地将数据从MySQL、Oracle、PostgreSQL等关系数据库中导入Hadoop(可以导入HDFS、HBase或Hive),或者将数据从Hadoop导出到关系数据库,使得传统关系数据库和Hadoop之间的数据迁移变得非常方便。Sqoop主要通过JDBC(Java DataBase Connectivity)和关系数据库进行交互,理论上,支持JDBC的关系数据库都可以使Sqoop和Hadoop进行数据交互。Sqoop 是专门为大数据集设计的,支持增量更新,可以将新记录添加到最近一次导出的数据源上,或者指定上次修改的时间戳。
Apache Ambari是一种基于Web的工具,支持Apache Hadoop集群的安装、部署、配置和管理。Ambari目前已支持大多数Hadoop组件,包括HDFS、MapReduce、Hive、Pig、HBase、Zookeeper、Sqoop等。
对于Hadoop1.X版本, HDFS的架构是基于一组特定的节点构建(如下图)。这些节点包括 NameNode(仅一个),它在HDFS内部提供元数据服务;DataNode(若干),它为HDFS提供存储块。由于仅存在一个 NameNode,因此这是HDFS的一个缺点(单点故障)。
在Hadoop1.x中的NameNode只可能有一个,虽然可以通过SecondaryNameNode与NameNode进行数据同步备份,但是总会存在一定的时延,如果NameNode挂掉,但是如果有部份数据还没有同步到SecondaryNameNode上,还是可能会存在着数据丢失的问题。该架构如图1所示:
该架构包含两层:Namespace 和 Block Storage Service
当前HDFS架构只允许整个集群中存在一个Namespace,而该Namespace被仅有的一个NameNode管理。这个架构使得HDFS非常容易实现,但是,它(见上图)在具体实现过程中会出现一些模糊点,进而导致了很多局限性(下面将要详细说明),当然这些局限性只有在拥有大集群的公司,像baidu,腾讯等出现。
Block Storage和namespace高耦合
当前namenode中的namespace和block management的结合使得这两层架构耦合在一起,难以让其他可能namenode实现方案直接使用block storage。
NameNode扩展性
HDFS的底层存储是可以水平扩展的(解释:底层存储指的是datanode,当集群存储空间不够时,可简单的添加机器已进行水平扩展),但namespace不可以。当前的namespace只能存放在单个namenode上,而namenode在内存中存储了整个分布式文件系统中的元数据信息,这限制了集群中数据块,文件和目录的数目。
NameNode性能
文件操作的性能制约于单个Namenode的吞吐量,单个Namenode当前仅支持约60K的task,而下一代Apache MapReduce将支持多余100K的并发任务,这隐含着要支持多个Namenode。
隔离性
现在大部分公司的集群都是共享的,每天有来自不同group的不同用户提交作业。单个namenode难以提供隔离性,即:某个用户提交的负载很大的job会减慢其他用户的job,单一的namenode难以像HBase按照应用类别将不同作业分派到不同namenode上。
在Hadoop1.x,NameNode(NN)在HDFS集群中存在单点故障(single point of failure),每一个集群中存在一个NameNode,如果NN所在的机器出现了故障,那么将导致整个集群无法利用,直到NN重启或者在另一台主机上启动NN守护线程。
主要在两方面影响了HDFS的可用性:
在Hadoop1.x时代,Hadoop中的MapReduce实现是做了很多的事情,而该框架的核心Job Tracker则是既当爹又当妈的意思,如图4所示:
Hadoop1.x的MapReduce框架的主要局限:
在Hadoop2.x中,HDFS的变化主要体现在增强了NameNode的水平扩展(Horizontal Scalability)及高可用性(HA),可以同时部署多个NameNode,这些NameNode之间是相互独立,也就是说他们不需要相互协调,DataNode同时在所有NameNode中注册,作为他们共有的存储节点,并定时向所有的这些NameNode发送心跳块使用情况的报告,并处理所有NameNode向其发送的指令。该架构如图2所示:
该架构引入了两个新的概念:存储块池(Block Pool) 和 集群ID(ClusterID);
一个Bock Pool是块的集合,这些块属于一个单一的Namespace。DataNode存储着集群中所有Block Pool中的块。Block Pool的管理相互之间是独立的。这意味着一个Namespace可以独立的生成块ID,不需要与其他Namespace协调。一个NameNode失败不会导致Datanode的失败,这些Datanode还可以服务其他的Namenode。一个Namespace和它的Block Pool一起称作命名空间向量(Namespace Volume)。这是一个自包含单元。当一个NameNode/Namespace删除后,对应的Block Pool也会被删除。当集群升级时,每个Namespace Volume也会升级。
集群ID(ClusterID)的加入,是用于确认集群中所有的节点,也可以在格式化其它Namenode时指定集群ID,并使其加入到某个集群中。
HDFS的高可用性将通过在同一个集群中运行两个NN(active NN & standby NN)来解决上面两个问题,这种方案允许在机器破溃或者机器维护快速地启用一个新的NN来恢复故障。
在典型的HA集群(即一主一备模式)中,有两台不同的机器充当NN。在任何时间,只有一台机器处于Active状态;另一台机器是处于Standby状态。Active NN负责集群中所有客户端的操作;而Standby NN主要用于备用,它主要维持足够的状态,如果必要,可以提供快速的故障恢复。
为了让Standby NN的状态和Active NN保持同步,即元数据保持一致,它们都将会和JournalNodes守护进程通信。当Active NN执行任何有关命名空间的修改,它需要持久化到一半以上的JournalNodes上(通过edits log持久化存储),而Standby NN负责观察edits log的变化,它能够读取从JNs中读取edits信息,并更新其内部的命名空间。一旦Active NN出现故障,Standby NN将会保证从JNs中读出了全部的Edits,然后切换成Active状态。Standby NN读取全部的edits可确保发生故障转移之前,是和Active NN拥有完全同步的命名空间状态,使用Zookeeper来进行心跳监测监控,在Active NN失效时自动切换Standby NN为Active状态。
为了提供快速的故障恢复,Standby NN也需要保存集群中各个文件块的存储位置。为了实现这个,集群中所有的Database将配置好Active NN和Standby NN的位置,并向它们发送块文件所在的位置及心跳,如下图所示:
在任何时候,集群中只有一个NN处于Active 状态是极其重要的。否则,在两个Active NN的状态下NameSpace状态将会出现分歧,这将会导致数据的丢失及其它不正确的结果。为了保证这种情况不会发生,在任何时间,JNs只允许一个NN充当writer。在故障恢复期间,将要变成Active 状态的NN将取得writer的角色,并阻止另外一个NN继续处于Active状态,这应该也是由Zookeeper保证的。
为了部署HA集群,你需要准备以下事项:
在HA集群中,Standby NN也执行namespace状态的checkpoints,所以不必要运行Secondary NN、CheckpointNode和BackupNode;事实上,运行这些守护进程是错误的。
首先的不要被YARN给迷惑住了,它只是负责资源调度管理。而MapReduce才是负责运算的家伙,所以YARN != MapReduce2.
YARN 并不是下一代MapReduce(MRv2),下一代MapReduce与第一代MapReduce(MRv1)在编程接口、数据处理引擎(MapTask和ReduceTask)是完全一样的, 可认为MRv2重用了MRv1的这些模块,不同的是资源管理和作业管理系统,MRv1中资源管理和作业管理均是由JobTracker实现的,集两个功能于一身,而在MRv2中,将这两部分分开了。 其中,作业管理由ApplicationMaster实现,而资源管理由新增系统YARN完成,由于YARN具有通用性,因此YARN也可以作为其他计算框架的资源管理系统,不仅限于MapReduce,也是其他计算框架(例如Spark)的管理平台。
从上图中也可以看出,Hadoop1时代中MapReduce可以说是啥事都干,而Hadoop2中的MapReduce的话则是专门处理数据分析,而YARN则做为资源管理器而存在。
该架构将JobTracker中的资源管理及任务生命周期管理(包括定时触发及监控),拆分成两个独立的服务,用于管理全部资源的ResourceManager以及管理每个应用的ApplicationMaster,ResourceManager用于管理向应用程序分配计算资源,每个ApplicationMaster用于管理应用程序、调度以及协调。一个应用程序可以是经典的MapReduce架构中的一个单独的Job任务,也可以是这些任务的一个DAG(有向无环图)任务。ResourceManager及每台机上的NodeManager服务,用于管理那台主机的用户进程,形成计算架构。每个应用程序的ApplicationMaster实际上是一个框架具体库,并负责从ResourceManager中协调资源及与NodeManager(s)协作执行并监控任务。如下图所示:
YARN相对于MapReduce v1的优势:
从Hadoop1.0.0版本后,引入了安全机制和授权机制(Simple和Kerberos)。下面从用户权限管理,HDFS安全策略和MapReduce安全策略三个方面简要介绍Hadoop的集群安全策略。
Hadoop上的用户权限管理主要涉及用户分组管理,为更高层的HDFS访问,服务访问,Job提交和配置Job等操作提供认证和控制基础
Hadoop上的用户和用户组名均由用户自己指定,如果用户没有指定,那么Hadoop会调用Linux的whoami命令获取当前Linux系统的用户名和用户组名作为当前用户的对应名,并将其保存在Job的user.name和group.name两个属性中。这样用户所提交Job的后续认证和授权以及集群服务的方位都讲基于此用户和用户组的权限及认证信息进行。
用户和HDFS服务之间的交互主要有两种情况:用户机和NameNode之间的RPC交互获取待通信的DataNode位置,客户机和DataNode交互传输数据块。
RPC交互可以通过Kerberos或授权令牌来认证。在认证和NameNode的连接时,用户需要使用Kerberos证书来通过初试认证,获取授权令牌。
授权令牌可以在后续用户Job与NameNode连接的认证中使用,而不必再次方位Kerberos Key Server。
数据块的传输可以通过块访问令牌来认证,每一个块访问令牌都由NameNode生成,它们都是特定的。块访问令牌代表数据访问容量,一个块访问令牌保证用户可以访问指定的数据库。
块访问令牌由NameNode签发被用在DataNode上,其传输过程就是将NameNode上的认证信息传输到DataNode上。块访问令牌是基于对称加密模式生成的,NameNode和DataNode共享了密钥。
对于每个令牌,NameNode基于共享密钥计算一个消息认证码,接下来,这个消息认证码就会作为令牌验证器成为令牌的主要组成部分。当一个DataNode接收到一个令牌时,它会使用自己的共享密钥重新计算一个消息认证码,如果这个认证码同令牌中的认证码匹配,那么认证成功。
MapReduce安全策略主要涉及Job提交,Task和Shuffle三个方面。
对于Job提交,用户需要将Job配置,输入文件和输入文件的元数据等写入用户home文件夹下,这个文件夹只能由该用户读,写和执行。接下来用户将home文件夹位置和认证信息发送给JobTracker。
在执行过程中,Job可能需要访问多个HDFS节点或其他服务,因此,Job的安全凭证将以
Job的授权令牌将NameNode的URL作为其关键信息,为了防止授权令牌过期,JobTracker会定期更新授权令牌。Job结束之后所有的令牌都会失效,为了获取保持在HDFS上的配置细腻,JobTracker需要使用用户的授权令牌访问HDFS,读取必须的配置信息。