`
退役的龙弟弟
  • 浏览: 453633 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Hadoop DistributedCache详解

 
阅读更多

转载自董的博客    http://dongxicheng.org/mapreduce-nextgen/hadoop-distributedcache-details/

 

感觉分布式缓存的作用就是缓解带宽压力

DistributedCache是Hadoop提供的文件缓存工具,它能够自动将指定的文件分发到各个节点上,缓存到本地,供用户程序读取使用。它具有以下几个特点:缓存的文件是只读的,修改这些文件内容没有意义;用户可以调整文件可见范围(比如只能用户自己使用,所有用户都可以使用等),进而防止重复拷贝现象;按需拷贝,文件是通过HDFS作为共享数据中心分发到各节点的,且只发给任务被调度到的节点。本文将介绍DistributedCache在Hadoop 1.0和2.0中的使用方法及实现原理。

 

Hadoop DistributedCache有以下几种典型的应用场景:1)分发字典文件,一些情况下Mapper或者Reducer需要用到一些外部字典,比如黑白名单、词表等;2)map-side join:当多表连接时,一种场景是一个表很大,一个表很小,小到足以加载到内存中,这时可以使用DistributedCache将小表分发到各个节点上,以供Mapper加载使用;3)自动化软件部署:有些情况下,MapReduce需依赖于特定版本的库,比如依赖于某个版本的PHP解释器,一种做法是让集群管理员把这个版本的PHP装到各个机器上,这通常比较麻烦,另一种方法是使用DistributedCache分发到各个节点上,程序运行完后,Hadoop自动将其删除。

Hadoop提供了两种DistributedCache使用方式,一种是通过API,在程序中设置文件路径,另外一种是通过命令行(-files,-archives或-libjars)参数告诉Hadoop,个人建议使用第二种方式,该方式可使用以下三个参数设置文件:

(1)-files:将指定的本地/hdfs文件分发到各个Task的工作目录下,不对文件进行任何处理;

(2)-archives:将指定文件分发到各个Task的工作目录下,并对名称后缀为“.jar”、“.zip”,“.tar.gz”、“.tgz”的文件自动解压,默认情况下,解压后的内容存放到工作目录下名称为解压前文件名的目录中,比如压缩包为dict.zip,则解压后内容存放到目录dict.zip中。为此,你可以给文件起个别名/软链接,比如dict.zip#dict,这样,压缩包会被解压到目录dict中。

(3)-libjars:指定待分发的jar包,Hadoop将这些jar包分发到各个节点上后,会将其自动添加到任务的CLASSPATH环境变量中。

前面提到,DistributedCache分发的文件是有可见范围的,有的文件可以只对当前程序可见,程序运行完后,直接删除;有的文件只对当前用户可见(该用户所有程序都可以访问);有的文件对所有用户可见。DistributedCache会为每种资源(文件)计算一个唯一ID,以识别每个资源,从而防止资源重复下载,举个例子,如果文件可见范围是所有用户,则在每个节点上,第一个使用该文件的用户负责缓存该文件,之后的用户直接使用即可,无需重复下载。那么,Hadoop是怎样区分文件可见范围的呢?

在Hadoop 1.0版本中,Hadoop是以HDFS文件的属性作为标识判断文件可见性的,需要注意的是,待缓存的文件即使是在Hadoop提交作业的客户端上,也会首先上传到HDFS的某一目录下,再分发到各个节点上的,因此,HDFS是缓存文件的必经之路。对于经常使用的文件或者字典,建议放到HDFS上,这样可以防止每次重复下载,做法如下:

比如将数据保存在HDFS的/dict/public目录下,并将/dict和/dict/public两层目录的可执行权限全部打开(在Hadoop中,可执行权限的含义与linux中的不同,该权限只对目录有意义,表示可以查看该目录中的子目录),这样,里面所有的资源(文件)便是所有用户可用的,并且第一个用到的应用程序会将之缓存到各个节点上,之后所有的应用程序无需重复下载,可以在提交作业时通过以下命令指定:

-files hdfs:///dict/public/blacklist.txt, hdfs:///dict/public/whilelist.txt

如果有多个HDFS集群可以指定namenode的对外rpc地址:

-files hdfs://host:port/dict/public/blacklist.txt, hdfs://host:port/dict/public/whilelist.txt

DistributedCache会将blacklist.txt和whilelist.txt两个文件缓存到各个节点的一个公共目录下,并在需要时,在任务的工作目录下建立一个指向这两个文件的软连接。

如果可执行权限没有打开,则默认只对该应用程序的拥有者可见,该用户所有应用程序可共享这些文件。

一旦你对/dict/public下的某个文件进行了修改,则下次有作业用到对应文件时,会发现文件被修改过了,进而自动重新缓存文件。

对于一些频繁使用的字典,不建议存放在客户端,每次通过-files指定,这样的文件,每次都要经历以下流程:上传到HDFS上—》缓存到各个节点上—》之后不再使用这些文件,直到被清除,也就是说,这样的文件,只会被这次运行的应用程序使用,如果再次运行同样的应用程序,即使文件没有被修改,也会重新经历以上流程,非常耗费时间,尤其是字典非常多,非常大时。

DistributedCache内置缓存置换算法,一旦缓存(文件数目达到一定上限或者文件总大小超过某一上限)满了之后,会踢除最久没有使用的文件。

在Hadopo 2.0中,自带的MapReduce框架仍支持1.0的这种DistributedCache使用方式,但DistributedCache本身是由YARN实现的,不再集成到MapReduce中。YARN还提供了很多相关编程接口供用户调用,有兴趣的可以阅读源代码。

下面介绍Hadoop 2.0中,DistributedCache通过命令行分发文件的基本使用方式:

(1)运行Hadoop自带的example例子, dict.txt会被缓存到各个Task的工作目录下,因此,直接像读取本地文件一样,在Mapper和Reducer中,读取dict.txt即可:

1
2
3
4
5
6
bin/Hadoop jar \
share/hadoop/mapreduce/hadoop-mapreduce-examples-2.2.0.jar \
wordcount \
-files hdfs:///dict/public/dict.txt \
/test/input \
/test/output

(2)Hadoop Streaming例子,需要通过-files指定mapper和reducer可执行文件或者脚本文件,这些文件就是通过DistributedCache分发到各个节点上的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash
HADOOP_HOME=/opt/yarn-client
INPUT_PATH=/test/input/data
OUTPUT_PATH=/test/output/data
echo "Clearing output path: $OUTPUT_PATH"
$HADOOP_HOME/bin/hadoop fs -rmr $OUTPUT_PATH
 
${HADOOP_HOME}/bin/hadoop jar\
   ${HADOOP_HOME}/share/hadoop/tools/lib/hadoop-streaming-2.2.0.jar\
  -D mapred.reduce.tasks=2\
  -files mapper,reducer\
  -input $INPUT_PATH\
  -output $OUTPUT_PATH\
  -mapper mapper\
  -reducer reducer

(3)接下给出一个缓存压缩文件的例子,假设压缩文件为dict.zip,里面存的数据为:

1
2
3
4
data/1.txt
data/2.txt
mapper.list
reducer.list

通过-archives参数指定dict.zip后,该文件被解压后,将被缓存(实际上是软连接)到各个Task的工作目录下的dict.zip目录下,组织结构如下:

1
2
3
4
5
6
dict.zip/
    data/
        1.txt
        2.txt
    mapper.list
    reducer.list

你可以在Mapper或Reducer程序中,使用类似下面的代码读取解压后的文件:

 

1
2
3
File file2 = read(“dict.zip/data/1.txt”, “r”);
…….
File file3 = read(“dict.zip/mapper.list”, “r”);

如果你想直接将内容解压到Task工作目录下,而不是子目录dict.zip中,可以用“-files”(注意,不要使用-archives,“-files”指定的文件不会被解压)指定dict.zip,并自己在程序中实现解压缩:

1
2
3
4
#include <cstdlib>
…….
system(“unzip –q dict.zip”); //C++代码
……

总之,Hadoop DistributedCache是一个非常好用的工具,合理的使用它能够解决很多非常困难的问题。

 

问题:     

我有个疑问啊,既然“HDFS是缓存文件的必经之路”,那为什么Map不直接加载HDFS中的文件呢?为什么一定得用DistributedCache先下载到本地节点?

 

 回复:

因为Map或Reduce依赖的外部资源大部分是本地资源,比如jar包,可执行文件等,这些资源,必须在本地才能使用,比如jar包必须加到环境变量CLASSPATH中,而CLASSPATH是不能识别HDFS文件的,JVM不支持;另外,HDFS上的文件是不可以直接执行的,必须放到本地,这个除非支持远程执行或者远程调用,这个在默认情况下,操作系统是不支持的。 除了上面这些原因,还有一个是,文件放到本地更容易在程序中使用。

分享到:
评论

相关推荐

    Hadoop技术详解.Hadoop Operation

    《Hadoop技术详解》这本书是关于Hadoop操作的详尽指南,它涵盖了Hadoop生态系统中的核心组件、工作原理以及实际操作技巧。Hadoop是大数据处理领域的重要工具,它以其分布式计算框架闻名,允许企业在大规模数据集上...

    Hadoop技术详解PDF电子书下载 带书签目录

    根据提供的文件信息,我们可以推断出这是一本关于Hadoop技术的电子书,该书提供了PDF格式供读者下载,并带有书签目录以便于导航。接下来,我们将深入探讨Hadoop技术的相关知识点。 ### Hadoop概述 Hadoop是一个...

    hadoop详解

    ### Hadoop 分布式存储与计算框架详解 #### 一、引言 随着互联网技术的飞速发展,数据量呈爆炸性增长趋势,传统的数据处理方法已无法满足需求。为了解决大规模数据处理的问题,Hadoop应运而生。本文将详细介绍...

    Hadoop大数据开发与性能调优实战培训课程-Hadoop组件详解.rar

    本课程“Hadoop大数据开发与性能调优实战培训课程-Hadoop组件详解”旨在深入探讨Hadoop的主要组件及其优化策略,帮助开发者和数据工程师提升在大数据环境中的实践能力。 首先,我们要了解Hadoop的基础架构,它主要...

    hadoop Hbase详解包

    主要讲解 Hadoop Hbase的使用和原理,包括Hbase官方文档的翻译,还有Java对Hbase的操作等。

    hadoop配置详解

    Hadoop安装详解 步骤完整 通俗易懂 只要你不傻 肯定能看明白

    006_hadoop中MapReduce详解_3

    "006_hadoop中MapReduce详解_3"可能是指一个系列教程的第三部分,着重讲解MapReduce的核心概念、工作原理以及实际应用。在这个部分,我们可能会探讨更深入的技术细节和优化策略。 MapReduce的工作流程分为两个主要...

    Hadoop框架详解及其在未来大数据处理中的发展趋势

    内容概要:本文首先介绍了Hadoop框架的基本原理,包括分布式文件系统(HDFS)、MapReduce及YARN等核心组件的技术特性,并通过具体示例进行了讲解。随后详细分析了数据采集预处理、数据存储与管理系统,及数据处理和...

    hadoop集群搭建详解

    Hadoop集群搭建详解 Hadoop是一个大数据处理框架,由Apache基金会开发和维护。它提供了一个分布式计算环境,能够处理大量数据。Hadoop生态系统包括了多个组件,如HDFS、MapReduce、YARN、HBase、Hive等。 Hadoop...

    Hadoop fs命令详解.docx

    Hadoop fs命令详解 Hadoop fs命令是Hadoop分布式文件系统(HDFS)的命令行接口,提供了丰富的文件操作命令,方便用户管理和维护HDFS文件系统。本文将详细介绍Hadoop fs命令的使用方法和实践操作。 基本命令 ...

    hadoop集群配置详解

    在这个详解中,我们将深入理解如何在Fedora和Ubuntu系统上搭建一个Hadoop集群。 首先,为了确保集群中的节点能够相互识别,我们需要配置静态IP地址。在Ubuntu系统中,可以通过图形界面进行配置,而在Fedora系统中,...

    hadoop海量数据处理详解与项目实战

    由于给定的文件内容部分涉及到PDF电子书的提供信息,并非技术知识点,故这部分内容将被忽略,重点将放在标题与描述所提到的Hadoop海量数据处理技术上。 Hadoop是一个由Apache软件基金会开发的开源框架,旨在支持...

    hadoop配置文件详解

    Hadoop是一种开源框架,用于分布式存储和处理大数据。它依赖于多个配置文件来定义其运行时行为。了解这些配置文件是实施和优化Hadoop集群的重要部分。核心配置文件core-site.xml涉及整个Hadoop环境的设置,而hdfs-...

    Hadoop应用开发技术详解(中文版)

    《大数据技术丛书:Hadoop应用开发技术详解》共12章。第1~2章详细地介绍了Hadoop的生态系统、关键技术以及安装和配置;第3章是MapReduce的使用入门,让读者了解整个开发过程;第4~5章详细讲解了分布式文件系统HDFS...

    Hadoop从入门到上手企业开发

    007 What is Apache Hadoop讲解 008 Hadoop 的发展史和版本发展与区别 009 Hadoop 生态系统介绍讲解 010 Hadoop 生态系统介绍讲解 011 Hadoop 服务讲解 012 HDFS 架构的讲解 013 MapReduce 架构讲解和MapReduce思想...

    hadoop版本差异详解.doc

    Apache Hadoop 是一个开源分布式计算框架,主要用于处理和存储海量数据。Hadoop 的版本发展历经了几个关键阶段,主要区分于其引入的重要特性。本文将深入解析不同版本之间的差异,帮助理解Hadoop的核心进化。 首先...

    Hadoop大数据开发与性能调优实战培训课程-Hadoop组件详解.ppt

    共59页,主要内容: 1、理解HDFS原理 2、掌握mapreduce原理和开发 3、应用举例讲解

    详解Hadoop核心架构HDFS

    ### 详解Hadoop核心架构HDFS #### HDFS体系架构概览 Hadoop作为一个领先的开源分布式计算框架,其核心组成部分之一便是Hadoop Distributed File System(HDFS),它为大规模数据处理提供了高效、可靠且可扩展的...

    Hadoop源代码详解.doc

    Hadoop源代码详解.doc

Global site tag (gtag.js) - Google Analytics