您的位置:澳门新葡8455最新网站 > 服务器运维 > 浅谈hadoop中mapreduce的文件分发,hadoop中mapreduce的

浅谈hadoop中mapreduce的文件分发,hadoop中mapreduce的

发布时间:2019-11-14 16:55编辑:服务器运维浏览(118)

    hadoop中mapreduce的常用类(1)

    写这些稿子的时候才开掘到新旧API是同一时候设有于1.1.2的hadoop中的。在此之前还向来纳闷儿为何有的时候候是jobClient提交任务,有时是Job...不管API是还是不是更新,上边这个类也依旧存在于API中的,经过和睦追踪源码,开采原理依旧这个。只不超过实际行了再一次组织,进行了部分封装,使得扩充性越来越好。所以依然把那些事物从记载本贴进来呢。

    关于这几个类的介绍以至使用,有的是在温馨debug中看看的,许多为纯翻译API的讲明,不过翻译的进程有异常的大的收获。

    GenericOptionsParser

    parseGeneralOptions(Options opts, Configuration conf, String[] args)深入深入分析命令行参数

    GenericOptionsParser是为hadoop框架分析命令行参数的工具类。它亦可辨识标准的命令行参数,使app能够轻便内定namenode,jobtracker,以致额外的配置财富或音信等。它援救的坚决守住有:

    -conf 指定安顿文件;

    -D 钦命安排音讯;

    -fs 指定namenode

    -jt 指定jobtracker

    -files 钦命供给copy到MR集群的文件,以逗号分隔

    -libjars钦命需求copy到MOdyssey集群的classpath的jar包,以逗号分隔

    -archives钦点供给copy到M福特Explorer集群的压缩文件,以逗号分隔,会活动解压缩

    1. String[] otherArgs = new GenericOptionsParser(job, args)

    2. .getRemainingArgs();

    3. if (otherArgs.length != 2) {

    4. System.err.println("Usage: wordcount ");

    5. System.exit(2);

    6. }

    ToolRunner

    用来跑完结Tool接口的工具。它与GenericOptionsParser协作来深入解析命令行参数,只在这里次运营中改动configuration的参数。

    Tool

    拍卖命令行参数的接口。Tool是MEvoque的任何tool/app的标准。那么些达成应有代理对标准命令行参数的管理。上面是优质达成:

    public class MyApp extends Configured implements Tool {              public int run(String[] args) throws Exception {   // 即将被ToolRunner执行的Configuration   Configuration conf = getConf();               // 使用conf建立JobConf   JobConf job = new JobConf(conf, MyApp.class);           // 执行客户端参数   Path in = new Path(args[1]);   Path out = new Path(args[2]);               // 指定job相关的参数        job.setJobName("my-app");   job.setInputPath(in);   job.setOutputPath(out);   job.setMapperClass(MyApp.MyMapper.class);   job.setReducerClass(MyApp.MyReducer.class);   *   // 提交job,然后监视进度直到job完成   JobClient.runJob(job);   }              public static void main(String[] args) throws Exception {   // 让ToolRunner 处理命令行参数    int res = ToolRunner.run(new Configuration(), new Sort(), //这里封装了GenericOptionsParser解析args               System.exit(res);   }   }   
    

    MultipleOutputFormat

    自定义输出文件名称只怕说名称格式。在jobconf中setOutputFormat(MultipleOutputFormat的子类)就能够了。并非那种part-r-00000吗的了。。。並且能够分配结果到多少个公文中。

    MultipleOutputFormat世袭了FileOutputFormat, 允许将出口数据写进不一致的出口文件中。有二种选取场景:

    a. 最少有二个reducer的mapreduce职务。这些reducer想要依据实际的key将出口写进不一样的文书中。要是多少个key编码了实际上的key和为实在的key内定的职责

    b. 唯有map的职务。这几个职分想要把输入文件或然输入内容的片段名称设为输出文件名。

    c. 独有map的职责。这几个职务为出口命名时,必要信任keys和输入文件名。 

    //这里是根据key生成多个文件的地方,可以看到还有value,name等参数   @Override   protected String generateFileNameForKeyValue(Text key,   IntWritable value, String name) {   char c = key.toString().toLowerCase().charAt(0);   if (c >= 'a' && c <= 'z') {   return c + ".txt";   }   return "result.txt";   }   
    

    DistributedCache

    在集群中连忙分发大的只读文件。DistributedCache是MLacrosse用来缓存app要求的诸如text,archive,jar等的文书的。app通过jobconf中的url来内定需求缓存的文本。它会假定钦赐的那一个文件已经在url钦命的呼应地点上了。在job在node上施行在此之前,DistributedCache会copy须求的文书到这么些slave node。它的法力正是为每种job只copy三遍,何况copy到钦点地点,能够活动解压缩。

    DistributedCache能够用来散发轻便的只读文件,只怕局部目眩神摇的举例archive,jar文件等。archive文件会自动解压缩,而jar文件会被电动放置到职责的classpath中(lib)。分发压缩archive时,能够钦点解压名称如:dict.zip#dict。那样就能够解压到dict中,否则默许是dict.zip中。

    文件是有进行权限的。客户能够接收在职务的干活目录下构建针对DistributedCache的软链接。

    DistributedCache.createSymlink(conf);     DistributedCache.addCacheFile(new Path("hdfs://host:port/absolute-path#link-name").toUri(), conf);      
    

    DistributedCache.createSymlink(Configuration)方法让DistributedCache 在当前职业目录下开创到缓存文件的标记链接。则在task的当前专门的工作目录会有link-name的链接,也等于神速方法,链接到expr.txt文件,在setup方法运用的图景则要轻松多数。或许通过安装配置文件属性mapred.create.symlink为yes。 遍布式缓存会截取U途乐I的部分作为链接的名字。 比如,UCR-VI是 hdfs://namenode:port/lib.so.1#lib.so, 则在task当前专门的学业目录会知名为lib.so的链接, 它会链接分布式缓存中的lib.so.1


    图片 1


    ) 写这几个文章的时候才发掘到新旧API是还要设有于1.1.2的hadoop中的。从前还直接收闷儿为何不常候是jobClient提交任...

    版权注解:本文为博主原创文章,未经博主同意不得转发。

    近些日子在做多少深入剖判的时候。供给在mapreduce中调用c语言写的接口,那时就亟须把动态链接库so文件分发到hadoop的次第节点上,原本想和煦来做那个分发,大致进度就是把so文件放在hdfs下面,然后做mapreduce的时候把so文件从hdfs下载到本地。但询问资料后意识hadoop有对应的组件来协理大家完结那个操作,这几个组件正是DistributedCache,布满式缓存。运用那么些事物可以千钧一发第三方文件的分发和缓存作用,上面具体解释:

    倘诺我们要求在map之间分享一些数据,假如音讯量一点都不大,大家可以保持在conf中。可是假设咱们亟须分享一些布局文件,jar包之类的。这时候DistributedCache能够满足大家的要求,使用DistributedCache的长河举个例子以下:

    1.科学配置被分发的文书的门径

    2.在大团结定义的mapper或reducer中拿走文件下载到本地后的渠道(linux文件系统路线卡塔 尔(阿拉伯语:قطر‎;常常是重写configure只怕重写setup

    3.在融洽定义的mapper或reducer类中读取这么些文件的源委

    上面以代码表明多少个步骤:

    1.Configuration conf = new Configuration();

      DistributedCache.addCacheFile(new URI("/user/tinfo/zhangguochen/libJMeshCalc.so"), conf);

      DistributedCache.addCacheArchive(new URI("/user/tinfo/zhangguochen/libJMeshCalc.zip"),conf);
      DistributedCache.addFileToClassPath(new URI("/user/tinfo/zhangguochen/libMeshCal.jar"), conf);

        或者

        conf.set("mapred.cache.files", "/myapp/file");

       conf.set("mapred.cache. archives", "/mayapp/file.zip");

       以上是布置须求分发的hdfs上的文本,可是前提是这几个文件必需在hdfs上设有,看源代码可以见到道DistributedCache的静态方法事实上就是包装了conf.set的动作。

    2.在温馨的mapper类中,使用DistributedCache获取下载到本地的公文,超过百分之三十三景况下这么些操作都以重写configure接口,然后把当和姑件路线保存在mapper类的积极分子变量中,供map方法应用。代码比方以下:

       private Path[] localFiles;

       public void setup(Context context) {

           localFiles = DistributeCache.getLocalCacheFiles(context.getConfiguration;

           for(Path temp:localFiles) {

                String path = temp.toString();//path正是此文件在本土的门道

                if(path.contains("myfileName")) {//获取到温馨必需的文件

                }

           }

        }

    getLocalCacheFiles重返的是数组(成分类型是Path卡塔尔国,数组内容是那一个task(map或reduce卡塔尔国所属的job设定的方方面面亟须被分发的公文,如若设置了     五个文件,可以遍历Path数组,用String.contains("KeyWord")来推论是不是是你所必需的文本。

       获取压缩包的路径

       private  File[] inputFiles;

       private Path[] localArchives;

       public void setup(Context context) {

           localArchives = DistributeCache.getLocalCacheArvhives();

           for(Path archive : localArchives) {

                if(archive.toString.contains("mytarName")) {//找到自个儿必须的文书

                     inputFiles = new File(archive.toString.listFiles();//获取压缩包下的万事 文件

                }

           }

       }

        也能够用DistributedCache将所利用到的第三方jar包载入到classpath中DistributedCache.addFileToClassPath

      

       通过以上代码开掘只要要选拔这个分发到各种节点上的文件操作比較复杂,DistributedCache也提供生机勃勃种更实惠的用法,就能够感到每两个散发的文件成立二个标记链接,然后hadoop就能够在当下mapreduce的进行路线下创办二个到源文件的链接,大家就可以看到在mapreduce中一向动用这个文件,而毋庸关怀这一个文件在该地的不二诀窍。

      演示样例:

      1.把公文分发到缓存中

       Configuration conf = new Configuration();

       DistributedCache.createSymlink;//创立符号链接
       DistributedCache.addCacheFile(new URI("/user/tinfo/zhangguochen/file1#myfile"), conf);//参预布满式缓存,myfile是标记

       2.在mapreduce中使用

        public void setup(Context context) {

           File myfile = new File;//在此边就能够直接通过标识myfile使用此文件

        }

       或许用上面格局:

        conf.set("mapred.cache.files", "/data/data#mData");
         conf.set("mapred.cache.archives", "/data/data.zip#mDataZip");
         conf.set("mapred.create.symlink", "yes"); // 是yes,不是true
         DistributedCache.createSymlink(Configuration)
         在map阶段,仅仅要求File file = new File;就足以获取该文件……

    上面资料来自互连网,如有相符,纯属意外

    DistributedCache是Hadoop提供的公文缓存工具,它能够协和积极将钦定的文书分发到各类节点上。缓存到当地,供客户程序读取使用。它具有上面多少个特性:缓存的文件是独有读的,退换这几个文件内容从未意思;客户可以调动文件可知范围(举个例子仅仅能客商本中国人民银行使,全体客商都能够使用等卡塔 尔(英语:State of Qatar),从而防范一再拷贝现象。按需拷贝。文件是透过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卡塔 尔(英语:State of Qatar)參数告诉Hadoop,个人提议接纳第三种方式,该方法可应用下边八个參数设置文件:

    -files:将点名的本土/hdfs文件分发到各种Task的职业文件夹下。不科学文件举办无论什么管理。

    -archives:将点名文件分发到各样Task的专业文件夹下,并对名称后缀为“.jar”、“.zip”,“.tar.gz”、“.tgz”的公文自个儿主动解压,暗中同意意况下,解压后的内容存放到专门的职业文件夹下名称叫解压前文件名称的文书夹中,比如压缩包为dict.zip,则解压后内容寄存到文件夹dict.zip中。为此。你可见给文件起各自名/软链接。举个例子dict.zip#dict,那样,压缩包会被解压到文件夹dict中。

    -libjars:钦定待分发的jar包。Hadoop将那个jar包分发到各类节点上后,会将其协和积极加入到职务的CLASSPATH情状变量中。

    hadoop jar xxx.jar -files hdfs://xxx/xx

    hadoop jar xxx.jar -libjars hdfs://xxx/xxx.jar,hdfs://xxx/xx2.jar

    前方提到,DistributedCache分发的文本是有可知范围的,有的文件能够大器晚成味对现阶段程序可以预知,程序试行完后。直接删除;有的文件仅仅对眼下用户可以知道(该顾客全数前后相继都能够訪问卡塔 尔(英语:State of Qatar)。有的文件对总体客商可以预知。DistributedCache会为每一种财富计算三个唯生龙活虎ID,以识别每三个财富,进而防守财富每每下载,举个样例。如果文件可以知道范围是大器晚成体顾客,则在每三个节点上,第三个应用该文件的客商担任缓存该公文,之后的客商一向运用就足以。没有必要屡屡下载。那么,Hadoop是哪些区分文件可知范围的啊?

    在Hadoop 1.0版本号中。Hadoop是以HDFS文件的脾气作为标志估量文件可以预知性的,须求留神的是,待缓存的文本即便是在Hadoop提交作业的client上,也会首先上传播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下的某部文件进行了改换,则下一次有作业用到相应文件时。会意识文件被改成过了,从而自个儿积极又三回缓存文件。

    对于某个每每利用的字典。不提出贮存在client,每一趟通过-files钦点。这种文件,每便都要涉世上边流程:上传来HDFS上—》缓存到各样节点上—》之后不再选用那些文件,直到被扫除,也正是说,这种文件,仅仅会被本次实践的应用程序使用,假诺再一次实行同样的应用程序,纵然文件并未有被改善,也会又叁次经验以上流程,很耗时,特别是字典好些个,不小时。

    DistributedCache内置缓存置换算法,黄金年代旦缓存(文件数量达到一定上限或然文件总大小当先某意气风发上限卡塔尔满了未来,会踢除最久未有选取的文件。

    在Hadopo 2.0中。自带的MapReduce框架仍协助1.0的这种DistributedCache使用方式。但DistributedCache本人是由YAPRADON完成的,不再集成到MapReduce中。YA汉兰达N还提供了好些个相关编制程序接口供顾客调用,风野趣的能够阅读源代码。

    下边介绍Hadoop 2.0中。DistributedCache通过命令行分发布公文件的着力使用方式:

    实施Hadoop自带的example样例, dict.txt会被缓存到各样Task的工作文件夹下,由此,直接像读取当麻芋果件后生可畏律。在Mapper和Reducer中。读取dict.txt就足以:

    123456 bin/Hadoopjar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.2.0.jar wordcount -files hdfs:///dict/public/dict.txt /test/input/test/output

    Hadoop Streaming样例,须求通过-files钦定mapper和reducer可施行文书也许脚本文件,那一个文件就是经过DistributedCache分发到各类节点上的。

    123456789101112131415 #!/bin/bashHADOOP_HOME=/opt/yarn-clientINPUT_PATH=/test/input/dataOUTPUT_PATH=/test/output/dataecho"Clearing output path: $OUTPUT_PATH"$HADOOP_HOME/bin/hadoopfs -rmr $OUTPUT_PATH ${HADOOP_HOME}/bin/hadoopjar   ${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

    收起给出二个缓存压缩文件的样例。假使压缩文件为dict.zip,里面存的多寡为:

    1234 data/1.txtdata/2.txtmapper.listreducer.list

    由此-archives參数钦定dict.zip后,该文件被解压后,将被缓存到各样Task的职业文件夹下的dict.zip文件夹下,组织结构比如以下:

    123456 dict.zip/    data/        1.txt        2.txt    mapper.list    reducer.list

    您可以预知在Mapper或Reducer程序中,使用相通上面包车型客车代码读取解压后的公文:

     

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

    假定你想一直将内容解压到Task职业文件夹下。实际不是子文件夹dict.zip中,能够用“-files”(注意。不要接纳-archives,“-files”钦点的文本不会被解压卡塔 尔(英语:State of Qatar)内定dict.zip,并自身在程序中达成解压缩:

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

    简来讲之,Hadoop DistributedCache是叁个很好用的工具。合理的运用它亦可缓慢解决超级多很拮据的主题材料。

     

       总括上边:假如mr程序中必须第三方jar包,能够透过在前后相继中央银行使DistributedCache,也能够在命令中动用-libjars来贯彻。不过这么些引进的jar都只是能够在mr职责运转未来来使用,假若你在运营MWrangler职分以前调用了第三方jar包的类。那那就能有标题,会在起步职责的时候找不到这么些类。那个时候能够使用诸如以下办法杀绝:

       在您的project里面创设二个lib文件夹,然后把全部的第三方jar包放到里面去,hadoop会自身主动载入lib正视里面包车型大巴jar。 那样就能够在mr运行从前也能够采取第三方jar了。

       方法调用顺序为(以libjars为例): -libjars --->conf.set("tmpjars")--->

    DistributedCache.addArchiveToClassPath--->conf.set("mapreduce.job.cache.archives","")
    

    连带作品链接:

                            

                  

     

    本文由澳门新葡8455最新网站发布于服务器运维,转载请注明出处:浅谈hadoop中mapreduce的文件分发,hadoop中mapreduce的

    关键词:

上一篇:让古板数码主旨,IT根底管理

下一篇:没有了