logo资料库

Hadoop分布式文件系统(HDFS)运行测试.pdf

第1页 / 共17页
第2页 / 共17页
第3页 / 共17页
第4页 / 共17页
第5页 / 共17页
第6页 / 共17页
第7页 / 共17页
第8页 / 共17页
资料共17页,剩余部分请下载后查看
电 子 科 技 大 学 实 验 报 告 学生姓名: 学号: 指导老师:田文洪 实验地点: 实验时间:2009 年 12 月 15 日 一、实验室名称: 二、实验项目名称:Hadoop 分布式文件系统(HDFS)运行测试 三、实验学时:16 四、实验原理: 在 SIP 项目设计的过程中,对于它庞大的日志在早先就考虑使用任务分解的 多线程处理模式来分析统计,但是由于统计的内容暂时还是十分简单,所以就采 用 Memcache 作为计数器结合 Mysql 完成了访问控制以及统计的工作。但未来, 对于海量日志分析的工作,还是需要有所准备。现在最火的技术词汇莫过于“云 计算”,在 Open API 日益盛行的今天,互联网应用的数据将会越来越有价值,如 何去分析这些数据,挖掘其内在价值,就需要分布式计算来支撑起海量数据的分 析工作。 回过头来看,早先那种多线程,多任务分解的日志分析设计,其实是分布式 计算的一个单机版缩略,如何将这种单机的工作分拆,变成集群工作协同,其实 就是分布式计算框架设计所涉及的。BEA 和 VMWare 合作采用虚拟机来构建集 群,无非就是希望使得计算机硬件能够类似于应用程序中的资源池中的资源,使 用者无需关心资源的分配情况,最大化了硬件资源的使用价值。分布式计算也是 如此,具体的计算任务交由哪一台机器执行,执行后由谁来汇总,这都由分布式 框架的 Master 来抉择,而使用者只需简单的将待分析内容的提供给分布式计算 系统作为输入,就可以得到分布式计算后的结果。Hadoop 是 Apache 开源组织的 一个分布式计算开源框架,在很多大型网站上都已经得到了应用,亚马逊, Facebook,Yahoo 等等。对于我来说,最近的一个使用点就是服务集成平台的日志 分析,服务集成平台的日志量将会很大,这也正好符合了分布式计算的适用场景 (日志分析,索引建立就是两大应用场景)。 什么是 Hadoop Hadoop 框架中最核心设计就是:MapReduce 和 HDFS。MapReduce 的思想 是由 Google 的一篇论文所提及而被广为流传的,简单的一句话解释 MapReduce 就是任务的分解与结果的汇总。HDFS 是 Hadoop 分布式文件系统的缩写,为分 布式计算存储提供了底层支持。 MapReduce 从 它 名 字 上 来 看 就 大 致 可 以 看 出 个 缘 由 , 两 个 动 词 Map,Reduce,Map(展开)就是将一个任务分解成为多个任务,Reduce 就是将
分解后多任务处理的结果汇总起来,得出最后的分析结果。这不是什么新思想, 其实在前面提到了多线程,多任务的设计就可以找到这种思想的影子。不论是现 实社会,还是在程序设计中,一项工作往往可以被拆分成为多个任务,任务之间 的关系可以分为两种:一种是不相关的任务,可以并行执行;另一种是任务之间 有相互的依赖,先后顺序不能够颠倒,这类任务是无法并行处理的。大学老师上 课时让大家去分析关键路径,无非就是找最省时的任务分解执行方式。在分布式 系统中,机器集群就可以看作硬件资源池,将并行的任务拆分交由每一个空闲机 器资源去处理,能够极大地提高计算效率,同时这种资源无关性,对于计算集群 的扩展无疑提供了最好的设计保证。任务分解处理以后,那就需要将处理以后的 结果在汇总起来,这就是 Reduce 要做的工作。
图 1 MapReduce 上图就是 MapReduce 大致的结构图,在 Map 前还可能会对输入的数据有 split 的过程,保证任务并行效率,在 Map 之后还会有 shuffle 的过程,对于提高 Reduce 的效率以及减小数据传输的压力有很大的帮助。后面会具体提及这些部分的细 节。 根据流程图来说一下具体一个任务执行的情况。 1. 在分布式环境中客户端创建任务并提交。 2. InputFormat 做 Map 前的预处理,主要负责以下工作: 1. 验证输入的格式是否符合 JobConfig 的输入定义,这个在实现 Map 和构建 Conf 的时候就会知道,不定义可以是 Writable 的任意子类。 2. 将 input 的文件切分为逻辑上的输入 InputSplit,其实这就是在 上面提到的在分布式文件系统中 blocksize 是有大小限制的,因此 大文件会被划分为多个 block。 3. 通过 RecordReader 来再次处理 inputsplit 为一组 records,输出 给 Map。(inputsplit 只是逻辑切分的第一步,但是如何根据文件 中的信息来切分还需要 RecordReader 来实现,例如最简单的默认 方式就是回车换行的切分)
3. RecordReader 处理后的结果作为 Map 的输入,Map 执行定义的 Map 逻辑, 输出处理后的 key 和 value 对应到临时中间文件。 4. Combiner 可选择配置,主要作用是在每一个 Map 执行完分析以后,在本 地优先作 Reduce 的工作,减少在 Reduce 过程中的数据传输量。 5. Partitioner 可选择配置,主要作用是在多个 Reduce 的情况下,指定 Map 的结果由某一个 Reduce 处理,每一个 Reduce 都会有单独的输出文件。(后 面的代码实例中有介绍使用场景) 6. Reduce 执行具体的业务逻辑,并且将处理结果输出给 OutputFormat。 7. OutputFormat 的职责是,验证输出目录是否已经存在,同时验证输出结 果类型是否如 Config 中配置,最后输出 Reduce 汇总后的结果。 HDFS 是分布式计算的存储基石,Hadoop 的分布式文件系统和其他分布式文 件系统有很多类似的特质。 分布式文件系统基本的几个特点: 1. 对于整个集群有单一的命名空间。 2. 数据一致性。适合一次写入多次读取的模型,客户端在文件没有被成功 创建之前是无法看到文件存在。 3. 文件会被分割成多个文件块,每个文件块被分配存储到数据节点上,而 且根据配置会有复制文件块来保证数据的安全性。
图 2 HDFS 上图中展现了整个 HDFS 三个重要角色:NameNode,DataNode,Client。 NameNode 可以看作是分布式文件系统中的管理者,主要负责管理文件系 统的命名空间,集群配置信息,存储块的复制。NameNode 会存储文件系统的 Meta-data 在内存中,这些信息主要包括了文件信息,每一个文件对应的文件块 的信息,每一个文件块在 DataNode 的信息。 DataNode 是文件存储的基本单元。它存储 Block 在本地文件系统中,保存 了 Block 的 Meta-data,同时周期性的发送所有存在的 block 的报告给 NameNode。 Client 就是需要获取分布式文件系统文件的应用程序。 这里通过三个操作来说明他们之间的交互关系。 文件写入:
1. Client 向 NameNode 发起文件写入的请求。 2. NameNode 根据文件大小和文件块配置情况,返回给 Client 它所管理部 3. Client 将文件划分为多个 Block,根据 DataNode 的地址信息,按顺序写 分 DataNode 的信息。 入到每一个 DataNode 块中。 文件读取: 1. Client 向 NameNode 发起文件读取的请求。 2. NameNode 返回文件存储的 DataNode 的信息。 3. Client 读取文件信息。 文件 Block 复制: 失效。 1. NameNode 发现部分文件的 block 不符合最小复制数或者部分 DataNode 2. 通知 DataNode 相互复制 Block。 3. DataNode 开始直接相互复制。 最后在说一下 HDFS 的几个设计特点:(对于框架设计值得借鉴) 1. Block 的放置 默认不配置,一个 Block 会有三份备份。一份放在 NameNode 指定的 DataNode, 另一份放在与指定 DataNode 非同一 Rack 上的 DataNode,最后一份放在与指定 DataNode 同一 Rack 上的 DataNode 上。备份无非就是为了数据安全,考虑同一 Rack 的失败情况以及不同 Rack 之间数据拷贝性能问题就采用这种配置方式。 2. 心跳检测 DataNode 的健康状况,如果发现问题就采取数据备份的方式来保 证数据的安全性。 3. 数据复制。(DataNode 失败的时候,需要平衡 DataNode 的存储利用率的时 候,需要平衡 DataNode 数据交互压力的时候) 这里先说一下,使用 HDFS 的 balancer 命令,可以配置一个 Threshold 来平衡每 一个 DataNode 磁盘利用率。例如设置了 Threshold 为 10%,那么执行 balancer 命令的时候,首先统计所有 DataNode 的磁盘利用率的均值,然后判断如果某一 个 DataNode 的磁盘利用率超过这个均值 Threshold 以上,那么将会把这个 DataNode 的 block 转移到磁盘利用率低的 DataNode,这对于新节点的加入来说 十分有用。 4. 数据交验。采用 CRC32 作数据交验。在文件 Block 写入的时候除了写入数 据还会写入交验信息,在读取的时候需要交验后再读入。 5. NameNode 是单点。如果失败的话,任务处理信息将会纪录在本地文件系 统和远端的文件系统中。
6. 数据管道性的写入。 当客户端要写入文件到 DataNode 上,首先客户端读取一个 Block 然后写到 第一个 DataNode 上,然后由第一个 DataNode 传递到备份的 DataNode 上,一直 到所有需要写入这个 Block 的 NataNode 都成功写入,客户端才会继续开始写下 一个 Block。 7. 安全模式。 在分布式文件系统启动的时候,开始的时候会有安全模式,当分布式文件系 统处于安全模式的情况下,文件系统中的内容不允许修改也不允许删除,直到安 全模式结束。安全模式主要是为了系统启动的时候检查各个 DataNode 上数据块 的有效性,同时根据策略必要的复制或者删除部分数据块。运行期通过命令也可 以进入安全模式。在实践过程中,系统启动的时候去修改和删除文件也会有安全 模式不允许修改的出错提示,只需要等待一会儿即可。 在 Hadoop 的系统中,会有一台 Master,主要负责 NameNode 的工作以及 JobTracker 的工作。JobTracker 是的主要职责就是启动,跟踪,调度各个 Slave 的任务执行。还会有多台 Slave,每一台 Slave 通常具有 DataNode 的功能以及 TaskTracker 的工作。TaskTracker 根据应用要求来结合本地数据执行 Map 任务以 及 Reduce 任务。 说 到 这 里 , 就 要 提 到 分 布 式 计 算 的 最 重 要 的 一 个 设 计 点 : Moving Computation is Cheaper than Moving Data。就是在分布式处理中,移动数据的代 价总是高于转移计算的代价。简单来说就是分而治之的工作,需要将数据也分而 存储,本地任务处理本地数据然后归总,这样才会保证分布式计算的高效性。 Hadoop 的优点: 官方网站已经给了很多的说明,这里就大致说一下其优点及使用的场景(没 有不好的工具,只用不适用的工具,因此选择好场景才能够真正发挥分布式计算 的作用) 1. 可扩展。不论是存储的可扩展还是计算的可扩展都是 Hadoop 的设计根本。 2. 经济。框架可以运行在任何普通的 PC 上。 3. 可靠。分布式文件系统的备份恢复机制以及 MapReduce 的任务监控保证了 分布式处理的可靠性。 4. 高效。分布式文件系统的高效数据交互实现以及 MapReduce 结合 Local Data 处理的模式,为高效处理海量的信息作了基础准备。 使用场景:个人觉得最适合的就是海量数据的分析,其实 Google 最早提出 MapReduce 也就是为了海量数据分析。同时 HDFS 最早是为了搜索引擎实现而 开发的,后来才被用于分布式计算框架中。 海量数据被分割于多个节点,然后由每一个节点并行计算,将得出结果归并 到输出。同时第一阶段的输出又可以作为下一阶段计算的输入,因此可以想象到 一个树状结构的分布式计算图,在不同阶段都有不同产出,同时并行和串行结合 的计算也可以很好的在分布式集群的资源下得以高效的处理。 五、实验目的:
体会如何有效的使用分布式文件系统处理海量数据,比如查询,检索,下载 等,以加深学生对 Java 分布式网络编程分析、设计与实现方法的理解。实验对 比单机,两台,三台,甚至四台或多台(条件允许的话)物理机和虚拟机在执行 sort,wordcount 时的运行速度。 六、实验内容: 在 Linux 系统上安装 Hadoop 分布式文件系统,并完成 HDFS 的搭建,并且尝 试在所搭建成功的集成系统上进行文件批量传送,下载等。 七、实验器材(设备、元器件): 需要 3 台 pc 机,一台作为 namenode,两台作为 datanode。pc 硬件要求: 根据所用的软件配置相应的硬件环境。操作系统要求:Linux/WindowsXp 八、实验步骤: Hadoop 可以单机跑,也可以配置集群跑,单机跑就不需要多说了,只需要 按照 Demo 的运行说明直接执行命令即可。这里主要重点说一下集群配置运行的 过程。 环境: 7 台普通的机器,操作系统都是 linux。内存和 CPU 就不说了,反正 Hadoop 一大特点就是机器在多不在精。JDK 必须是 1.5 以上的,这个切记。7 台机器的 机器名务必不同,后续会谈到机器名对于 MapReduce 有很大的影响。 部署考虑: 正如上面我描述的,对于 Hadoop 的集群来说,可以分成两大类角色,Master 和 Slave,前者主要配置 NameNode 和 JobTracker 的角色,负责总管分布式数据 和分解任务的执行,后者配置 DataNode 和 TaskTracker 的角色,负责分布式数据 存储以及任务的执行。本来打算一台机器是否可以配置成为 Master 同时也是 Slave,不过发现在 NameNode 初始化的过程中以及 TaskTracker 执行过程中机器 名配置好像有冲突(NameNode 和TaskTracker 对于Hosts 的配置有些冲突,究 竟是把机器名对应IP放在配置前面还是把Localhost对应IP放在前面有点问题, 不过可能也是我自己的问题吧,这个大家可以根据实施情况给我反馈)。最后反 正决定一台 Master,六台 Slave,后续复杂的应用开发和测试结果的比对会增加 机器配置。 实施步骤: 1. 在所有的机器上都建立相同的目录,也可以就建立相同的用户,以该 用户的 home 路径来做 hadoop 的安装路径。例如我在所有的机器上都建立了 /home/wenchu。 2. 下载 Hadoop,先解压到 Master 上。这里我是下载的 0.17.1 的版本。 此时 Hadoop 的安装路径就是/home/wenchu/hadoop-0.17.1。
分享到:
收藏