一、Hadoop架构
Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。Hadoop的框架最核心的设计就是:HDFS和MapReduce。HDFS为海量的数据提供了存储,则MapReduce为海量的数据提供了计算。hadoop分布式集搭建
Hadoop 由许多元素构成。其最底部是 Hadoop Distributed File System(HDFS),它存储 Hadoop 集中所有存储节点上的文件。HDFS(对于本文)的上一层是MapReduce 引擎,该引擎由 JobTrackers 和 TaskTrackers 组成。Hadoop分布式计算平台最核心的分布式文件系统HDFS、MapReduce处理过程,以及数据仓库工具Hive和分布式数据库Hbase,基本涵盖了Hadoop分布式平台的所有技术核心。
HDFS
对外部客户机而言,HDFS就像一个传统的分级文件系统。可以创建、删除、移动或重命名文件,等等。但是 HDFS 的架构是基于一组特定的节点构建的(参见图 1),这是由它自身的特点决定的。这些节点包括 NameNode(仅一个),它在 HDFS 内部提供元数据服务;DataNode,它为 HDFS 提供存储块。由于仅存在一个 NameNode,因此这是 HDFS 的一个缺点(单点失败)。
存储在 HDFS 中的文件被分成块,然后将这些块复制到多个计算机中(DataNode)。这与传统的 RAID 架构大不相同。块的大小(通常为 64MB)和复制的块数量在创建文件时由客户机决定。NameNode 可以控制所有文件操作。HDFS 内部的所有通信都基于标准的 TCP/I
P 协议。
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可用时间。
DataNode
DataNode 也是一个通常在 HDFS实例中的单独机器上运行的软件。Hadoop 集包含一个 NameNode 和大量 DataNode。DataNode 通常以机架的形式组织,机架通过一个交换机将所有系统连接起来。Hadoop 的一个假设是:机架内部节点之间的传输速度快于机架间节点的传输速度。
DataNode 响应来自 HDFS 客户机的读写请求。它们还响应来自 NameNode 的创建、删除和复制块的命令。NameNode 依赖来自每个 DataNode 的定期心跳(heartbeat)消息。每条消息都包含一个块报告,NameNode 可以根据这个报告验证块映射和其他文件系统元数据。如果 DataNode 不能发送心跳消息,NameNode 将采取修复措施,重新复制在该节点上丢失的块。
二、Hadoop安全机制
Doug Cutting和Mike Cafarella最初为Nutch项目开发Hadoop时并没有考虑安全因素,这是众所周知的事实。因为Hadoop的最初用例都是围绕着如何管理大量的公共web数据,无需考虑保密性。按照Hadoop最初的设想,它假定集总是处于可信的环境中,由可信用户使用的相互协作的可信计算机组成。
最初的Hadoop中并没有安全模型,它不对用户或服务进行验证,也没有数据隐私。因为Hadoop被设计成在分布式的设备集上执行代码,任何人都能提交代码并得到执行。尽管在较早的版本中实现了审计和授权控制(HDFS文件许可),然而这种访问控制很容易避开,因为任何用户只需要做一个命令行切换就可以模拟成其他任何用户。这种模拟行为非常普遍,大多数用户都会这么干,所以这一已有的安全控制其实没起到什么作用。
在当时,考虑到安全问题的组织把Hadoop隔离在专有网络中,只有经过授权的用户才能访问。然而由于Hadoop内部几乎没有安全控制,在这样的环境中也会出现很多意外和安全事故。善意的用户可能会犯错(比如用一个分布式删除在几秒内就会删除大量数据)。所有用户和程序员对集内的所有数据都有相同的访问权限,所有任务都能访问集内的任何数据,并且所有用户都可能会去读取任何数据集。因为MapReduce没有认证或授权的概念,某
个顽劣的用户可能为了让自己的任务更快完成而降低其他Hadoop任务的优先级,甚至更坏,直接杀掉其他任务。
随着Hadoop在数据分析和处理平台中的地位日益凸显,安全专家们开始关心来自Hadoop集内部的恶意用户的威胁。恶意开发人员能轻易写出假冒其他用户Hadoop服务的代码来(比如写一个新的TaskTracker并将其注册为Hapdoop服务,或者冒充hdfs或mapred用户,把HDFS里的东西全删掉等等)。因为DataNode没有访问控制,恶意用户可以绕过访问控制从DataNode中读取任意数据块,或将垃圾数据写到DataNode中破坏目标分析数据的完整性。所有人都能向JobTracker提交任务,并可以任意执行。
因为这些安全问题,Hadoop社区意识到他们需要更加健壮的安全控制,因此,雅虎的一个团队决定重点解决认证问题,选择Kerberos作为Hadoop的认证机制,这在他们2009年的白皮书上有记录。
在Hadoop发布.版本时他们实现了自己的目标,该版本采用了下面这些机制:
• 用Kerberos RPC (SASL/GSSAPI) 在RPC连接上做相互认证——用SASL/GSSAPI来实现Kerberos及RPC连接上的用户、进程及Hadoop服务的相互认证。
• 为HTTP Web控制台提供“即插即用”的认证——也就是说web应用和web控制台的实现者可以为HTTP连接实现自己的认证机制。包括(但不限于)HTTP SPNEGO认证。
• 强制执行HDFS的文件许可——可以通过NameNode根据文件许可(用户及组的访问控制列表(ACLs))强制执行对HDFS中文件的访问控制。
• 用于后续认证检查的代理令牌——为了降低性能开销和Kerberos KDC上的负载,可以在各种客户端和服务经过初始的用户认证后使用代理令牌。具体来说,代理令牌用于跟NameNode之间的通讯,在无需Kerberos服务器参与的情况下完成后续的认证后访问。
• 用于数据块访问控制的块访问令牌——当需要访问数据块时,NameNode会根据HDFS的文件许可做出访问控制决策,并发出一个块访问令牌(用HMAC-SHA1),可以把这个令牌交给DataNode用于块访问请求。因为DataNode没有文件或访问许可的概念,所以必须在HDFS许可和数据块的访问之间建立对接。
• 用作业令牌强制任务授权——作业令牌是由JobTracker创建的,传给TaskTracker,确保Task只能做交给他们去做的作业。也可以把Task配置成当用户提交作业时才运行,简化访问控制检查。
• 把这些整合到一起让Hadoop向前迈出了一大步。自那之后,又实现了一些值得称道的修改:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论