Hadoop专业解决方案-第13章 Hadoop的发展趋势-翻译稿51CTO博客 - 凯发娱乐

Hadoop专业解决方案-第13章 Hadoop的发展趋势-翻译稿51CTO博客

2019年04月26日10时59分59秒 | 作者: 寻春 | 标签: 运用,一个,数据 | 浏览: 3088

一、前语:

  十分感谢Hadoop专业处理方案群:313702010,兄弟们的大力支撑,在此说一声辛苦了,经过两周的尽力,现已有啦开端的效果,现在第13章 Hadoop的展开趋势小组现已翻译完结,在此对:hbase-深圳-18361、旅人AQUARION标明感谢。

二、定见搜集:

本章节由《Hadoop专业处理方案群:313702010》翻译小组完结,为小组校验稿,现现已过小组内部校验经过,特此面向网络搜集定见,假如对本章节内容有任何贰言,请在谈论中加以阐明,阐明时,请标明行号,也能够以修订的办法,发送给我。十分感谢。

三、原书阐明

  英文原书《Wrox.Professional.Hadoop.Solutions》第十三章,请参照英文原文。

四、翻译原稿

4.1 章节目录

页码-435

这个章节将介绍的内容:

了解当时以及新式的MapReduce的DSLs

了解更高效,高扩展性的程序改善

回忆安全性方面的功用改善

了解最新的趋势

Hadoop在敏捷的展开改动,好像每个星期业界新闻上都能看到新的发行版以及依据hadoop的开源项目的发布,而且能够供给愈加微弱的功用。假如您看到Apache的JIRA关于Hadoop的恳求优化(部分在第10章中评论的内容),您将发现hadoop的明日将会具有更多的功用。

在曩昔的几年中,新的特定范畴言语(DSLs)众所周知简化了hadoop的mapreduce编程,而且是hadoop中快速展开的范畴,特别是在图形处理方面。实时的hadoop(作为第9章的评论内容)在今日呈现一个不断增加的趋势,而且在未来会不断的展开。正如第10章和第12章的内容,安全性将不断的展开和改动。尽管本书触及到了许多未来将会改动和展开的内容,而您应该去了解更多本章没有涉猎的范畴。

本章开篇DSLs简化mapreduce编程为当时的展开趋势,这种办法是经过在特定的问题范畴引进更高等级的概念以及运用一个简易的API缩短代码的开发周期,您将了解到在hadoop2.0版别履行时刻的新的完结(优化),然后为mapreduce供给了更高的扩展性和可弹性性。

页码-436

        在本章中您还将了解到Tez-一个簇新强健的hadoop和Oozie结构,且支撑通用性和实时性,本章还杰出评论了行将完结的安全性更改。最终,您将了解到hadoop运用的新趋势。

在本书中现已被证明,hadoop能够用来处理许多不同的问题。本章要点会集在当下更多的安排挑选运用hadoop,以及在未来这些安排怎么来运用它。让我们开端评论DSLs以及它们在hadoop编程中扮演的人物。

4.2 正文

DSL简化mapreduce编程

        到现在为止,本书要点会集于mapreduce-答应在机器的集群中拆分使命履行的hadoop编程模型,mapreduce赋予开发人员能够充沛运用hadoop的权限,乃至是自界说履行(见第四章)然后更好的运用hadoop。Mapreduce是一个底层的模型,供给的权限对用开发者来说是一个新的应战。DSLs供给了一种简化hadoop编程的办法,尽管本书能够介绍每一个hadoop的DSL,但本节仅快速”品尝”他们其间的一些,展现在hadoop的这个展开的范畴中怎么降低了用户的入门难度。本节要点介绍一些老练的,现已被广泛运用的DSLs(例如HiveQL和PigLatin)以及一些重生和展开中的DSLs。

DSL是什么?

        DSL是一种编程言语,规划用来供给特定范畴问题的处理方案。模仿其他范畴的术语和概念,例如:结构化查询言语(SQL)能够以为是DSL的联系模型,DSLs测验处理实时体系中特定范畴和底层完结中的距离。

        一些精心规划的DSL让一些非程序员能够编写自己的程序,许多暂时的SQL运用者能够运用SQL查询来获取他们需求的信息,却对联系型数据库的底层结构知之甚少。另一个关于广泛运用DSL的很好的比方是,Microsoft Excel的脚本言语,称为Visual Basic(VBA)。

尽管DSL是专门针对非程序员,可是关于开发人员依然是一种财富,由于DSL使开发人员成为了特定言语范畴的专家。在实践中,DSLs与底层架构作业比较使程序员愈加有效率。

        DSL往往不一定齐备,实践上意味着它们不能用于写恣意杂乱的算法,或许是作为通用的编程言语。相反,它们一般是声明用户的预期效果并完结这一成果。例如,在SQL中,能够经过查询来操作数据表中的数据。在大大都。

页码-437

联系型数据库中,实时运转的体系将决议怎么存储数据和满意您的查询

DSLs也被分类为内部和外部:

        外部DSL的运用与其它编程言语运用相同东西,规划共同的语法以及用于解析程序言语的自界说编译器

        内部DSL(有时称为嵌入DSL)是“保管”在另一个更通用的编程言语(或许DSL)上,这意味着它运用程式化的主机言语的语法,而不是具有其共同的语法

前期的hadoop的开发者开发DSL十分敏捷,您或许听说过它们中的一些:

        Hive, Pig, Clojure-Hadoop, Grumpy(Groovy Hadoop), Sawzall, Scoobi, Lingual, Pattern, Crunch, Scrunch

而且这个部队还在不断的强壮

Hadoop的DSLs

        Hadoop的DSL一般能够分为几个大类:

        ?       依据SQL的DSL—DSL依据SQL(敞开性的依据SQL和“相似于SQL”)关于具有后台数据库的非程序员最有用,运用这些DSLs,人们“以为”在数据库言语能够完结数据剖析使命而不用去想MapReduce

        ?       数据流DSL—这些DSL经过数据管道挑选和转化,处理数据和聚合数据流

        ?       特别问题的编程言语—这些DSL要点放在一个特定的问题域,有时运用不同的模型来处理数据。图形处理便是其间的一个比方,模型数据图(例如:交际网络中的老友衔接)和数据核算类型的图。

        Hive 和依据SQL的DSLs

        您或许现已了解了Hive,它选用HiveQL,Hadoop中一种依据SQL的DSL,以SQL为导向然后使非程序员易于运用,当然这仅仅其间一个比方。相似于依据HDFS数据的SQL类查询东西,它答运用户拜访您的表形式的数据,并在内部完结了运用MapReduce的查询。Hive不是一个联系型数据库办理体系(RDBMS),由于它没有业务的概念或许记载级的CRUD(创立,查找,更新和删去),可是它实在供给了一种言语(叫做HiveQL),很简略被数据库的用户了解。它把要点放在查询—恳求数据和进行聚集操作。

        尽管新触摸Hadoop的用户倾向于运用Hive作为一个联系型数据库,可是需求注重的是MapReduce使命批量的运用HiveQL的指令,这使得Hive不合适满意快速查询的需求(尽管正在进行中的作业能够使Hive更快的从Mapreduce中解耦,将在本章后边的内容中评论),Hive从来没有

页码-438

要替代一个企业级的数据库房,但作为一种简化和合作数据调集的办法,让未必是JAVA开发人员的其他人能够处理数据集并取得价值。

Facebook发明晰Hive并将它在2008年开源贡献给了Apache基金会,Facebook的数据剖析师需求友爱的生产东西去操作在Hadoop集群中的数据,由于SQL是如此的遍及,一个依据SQL的东西是一个合乎逻辑的挑选,Hive也许是推进Hadoop选用的最重要的东西,由于它为刚触摸Hadoop的运用者降低了门槛。

        Hive运用外部DSL(正如前面分类),HiveQL具有自己的语法,编译器和运转环境。大大都的Hive查询被转化成MapReduce使命,但数据界说言语(DDL),用于创立和修正数据库,表和视图不需求Mapreduce。Hive存储这些元数据信息在一个独自的数据库(例如,Mysql),在读取或处理HDFS上的数据或许其他数据存储的时分,大大都的查询会触发一个或许多个MapReduce使命,经过Hive的查件支撑不同的数据格局。

        让我们评论Hive作为一个DSL的概念,并获取到依照年,月,日分隔的HDFS的效劳的数据作为一个比方。详细发作了什么的任何特别细节不在这儿评论,只为了阐明一个强壮的DSL的价值。表单13-1供给了效劳器日志数据的DDL实例表:

表单13-1:日志表界说

表内容…….

表单13-1中所示由3个首要部分组成。该榜首部分包含文件及它们的类型(相似于一个一般的数据库表),第二部分是对Hive的特别规划,特其他数据分区。在表单13-1的数据分区阐明:表将包含几个部分,其间之一用于记载每天的日志,最终的第三部分每个分区存储作为一个独自的序列。

Hive安排分区数据到不同的目录,假如库房目录在HDFS中被装备为一个库房的话,那么这个分区表的外观目录结构就好像在表单13-2:

439

表单13-2:分区目录

     ...

     /warehouse/logs/year=2013/month=4/day=13

     /warehouse/logs/year=2013/month=4/day=14

     /warehouse/logs/year=2013/month=4/day=15

     ...

如上所示,一切的数据将在的目录中,现在,考虑运用一个比方进行查询(表单13-3),在正午到下午一点之间发作了什么

表单13-3

     SELECT hour, min, sec, msec, severity,message

     FROM logs

    WHERE year = 2013 AND month = 4 AND day =13 AND

hour>=12 AND hour <= 13

     ORDER BY severity DESC, hour, min, sec,msec;

         在表单13-3中的语法关于任何一个了解SQL的人来说是十分直观的,而相反,经过MapReduce的JAVA的API来写这个查询是十分具有应战性的,由于完结ORDER BY的子句或许需求把握专业编程句子。

        在这个比方中,需求留意的是日志的查询区间永远是动摇的,如下所示,WHERE子句的鸿沟时刻戳规模灵敏,由于数据现已依照年,月,日分隔,Hive知道只需求扫描子集目录(在这个比方中为)然后供给了相对快速的查询成果,即使是一个包含许多年到达TB等级的日志数据集。

正如HiveQL这样的一个好的DSL应该做到:

        供给一个简练的,声明性的办法来陈说信息结构和作业办法

        关于特定范畴专家(即数据剖析师)直观的言语,Hive躲藏了数据存储和查询的杂乱性

        很简略指定数据的安排办法(在这个实例下,经过时刻戳分区)来进步查询速度

        比较手写Java的MapReduce,HiveQL代码更小的开支

        供给了扩展钩子,能够刺进不同的格局和功用

Hive能够使您经过不同的办法扩展它的功用:

        答应您指定不同输入和输出格局

        答应您运用自界说的序列化器和反序列化器(称为SerDe)进行格局化

440

        答应您创立用户自界说函数(udf),能够用Java编写并在HiveQL中声明

        答应在您的查询中自界说mappers和reduces

        让我们来看看怎么扩展Hive的一些示例,假如您回忆13-1表单中的DDL句子,它指示Hive存储中的数据序列,运用SequenceFile格局化输入。关于灵活性和可扩展性,Hive答应开发人员轻松的刺进自己的输入格局,答应在各种不同的格局和业务中读取数据,它还使您能够刺进自己查询成果的输出格局,这个钩子现已被整合在Hive在Hbase的数据存储,Cassandra和其他数据存储的运用中。

        如前所述,Hive还能够经过指定SerDe支撑共同的记载格局(串行器/解码器),知道怎么将输入记载解析成列,并挑选性的以相同的格局输出。留意,Hive简化输入和输出的格局化,清楚记载的存储办法(或字节省),而SerDe了解每个记载是怎么解析成列的。

        一个盛行的记载格局的比方是JavaScript的方针标明法(JSON),列表13-4中,修正声明JSON为存储数据的格局,其间每个JSON记载存储一行。

表单13-4:运用JSON界说的记载表

        CREATE TABLE logs ( the

severity     STRING,

             ...,

hour         TINYINT,

             ...)

          PARTITIONED BY (...)

          STORED AS ROW FORMAT SERDE

            org.apache.hadoop.hive.contrib.serde2.JsonSerde

          WITH SERDEPROPERTIES (

            "severity"="$.severity",

             ...,

            "hour"="$.timestamp.hour",

             ...);

在此表中的比方,JsonSerde完结了Hive的SerDe API ,这是Hive的一个重要特征,辅导您运用Hive处理记载。在这个示例中,Hive将调用JSON SerDe解析每个JSON记载成列,在表中声明的SERDEPROPERTIES,SERDEPROPERTIES是Hive的一个功用,经过特其他键值对指定界说SerDe接口,在这种情况下,运用$引证JSON的文档,所以变量$.timestamp.hour

意味着“运用小时单位时刻戳内的记载”将被用于小时列。

        最终,Hive支撑UDF来扩展或许聚合记载和操作列,经过UDFs,您能够编写JAVA函数由HiveQL声明,关于Hive自身不支撑

441

的功用是十分有用的。例如,Hive不供给窗口的功用,像大部分联系型数据库办理体系那样,将记载聚合在一个供给的可移动的窗口中,一个典型的比方股票交易员运用搜集若干天的股票收盘价的趋势走向,很显着的提醒当时的最新趋势,这些经过自界说的UDF来供给。

        Hive是Hadoop的DSL中十分好的一个比方,躲藏了MapReduce的杂乱性并为Hadoop的数据处理供给了一个可广泛了解的言语,大都的情况下,它把JAVA手写MapReduce代码的开支降低到最小,而且供给了扩展点能够自界说代码处理大部分Hive没有触及到的部分。这种在MapReduce中笼统的办法来历于数据库工程师,使他们能够专心于自己的数据问题,而不是编程。

        当然还有其他依据SQL的DSL在运用,特别是Hadoop的实时查询引擎,在第9章(Cloudera的Impala以及Apache的Drill)运用依据SQL的DSLs作为编程言语。

数据流和相关的DSLs

        轻量级的DSL使开发人员能够经过管道,转化和聚合的办法处理大型数据集。例如,许多的DSLs最广为人知的是Pig,一个与大大都的Hadoop发行版绑缚在一起的东西,运用轻量级言语,笼统MapReduce结构,作用在MapReduce的底层。

Pig

        Facebook发明晰Hive,使剖析人员娴熟的运用Hadoop的数据进行作业,yahoo发明晰Pig,更合适于转化和聚合数据,它有一个叫做PigLatin的定制言语,不是依据SQL,意味着它更合适于开发人员,而不是经验丰厚的SQL用户。

        Hive首要介绍了数据的查询,Pig首要介绍了提取,转化和加载(ETL)处理。运用PigLatin,开发人员能够指定怎么加载数据,在管道中创立数据的查看点,而且它是高度可定制的,可是Pig和Hive的部分功用是堆叠的,以致于您能够运用两种言语来查询和ETL(注:Extraction-Transformation-Loading数据提取,转化和加载)

        为了证明Pig和Hive之间功用的相似点,让我们测验一个实例查询,一个苹果公司的年度股票记载,与上一年同期比较的均匀收盘价格,表单13-5展现了一个Hive查询比方,这是一个简略的SQL

表单13-5:运用Hive的有关苹果公司的查询

442

SELECTyear(s. YYYY-MM-DD), avg(s.close)

        FROM stocks s

        WHERE s.symbol = AAPL

        GROUP BY year(s. YYYY-MM-DD);

        与Hive不同的是,Pig没有一个DDL(Data Definition Language数据库界说言语),就像表单13-6中所示的Pig样例展现,发动时经过文件读取数据。

表单13-6:运用Pig的有关苹果公司的查询

aapl =load /path/to/AAPL.tsv as (

          YYYY-MM-DD:           chararray,

             ...,

close:       float,

             ...);

by_year= group aapl by SUBSTRING(YYYY-MM-DD, 0, 4);

year_avg= foreachby_year generate

group,AVG(aapl.close);

          Dump to console:

dumpyear_avg;

        在表单13-6中,您能够看到了解的GROUPBY的SQL操作,关于每一个a,b是一个映射,相当于运用SQL在a中挑选b。请留意,在分组aapl中,生成一个名为by_year的新联系,Pig指令irstield组,从你的分组信息中取出包含年份键值的信息。Pig命名的第二个范畴aapl(现已界说好的分组)保存分组记载。因而,运用表达式foreach by_year生成组,AVG(aapl.close)的真实意义是,遍历每年的均匀值经过by_year。

Pig被描绘为一个轻量级的言语,由于你界说的句子描绘每个进程的数据处理,从原始形式来历到输出。

表单13-7展现一个用Pig完结字数核算的程序

inpt = LOAD /path/to/input using TextLoader           AS (line:chararray);

words =FOREACH inpt GENERATE flatten(TOKENIZE(line)) AS word;

grpd =GROUP words BY word;

cntd =FOREACH grpd GENERATE group, COUNT(words);

          STORE cntd INTO /path/to/output;

        看起来像是履行“变量=值”的句子序列,实践上,每一行右边的deines联系(这个词的联系模型的界说)是左面创立的别号(或许姓名)


        这个完结首要加载数据,在输入形式中将每一行的文本作为一条记载,命名类型为字符串类(一个字符串),然后遍历每条记载,对文本分词,将每个单词构成单一记载。将单词分组,然后每一组核算所给单词的呈现信息,最终,将每个单词(具有这个词的字段现在被命名为group)和每组(具有这个组的分组信息联系内容的字段命名为单词)的巨细进行分项

443

您的成果将输出到一个途径下。

        Pig是一种天然数据流,但它也包含一切的传统联系型业务,好像Hive所包含的(存在一些破例),包含GROUP BY,JOIN,PROJECTION,FILTERING(WHERE子句),束缚等等

        像Hive相同,Pig是一种具有自己的语法和编译器的外部DSL。它不是一个真实谨慎的言语,因而,例如不支撑一般的循环(除了信息的迭代),此外,像Hive和Pig支撑插件的格局化和UDFs,可是Pig支撑多种言语编写UDF,包含Python,Ruby和JAVAScript,除了JAVA

         Pig的优点在于比Hive更高的灵活性和逐渐规范的数据流,数据库的用户喜爱用Hive,程序员喜爱用Pig,由于它看起来感觉更像传统的编程言语

         现在让我们来谈谈比MapReduce相关的Hadoop的JAVA的API和更高层次依据JAVA虚拟机(JVM)的DSL。需求留意的是在JVM上而不是依托JAVA。由于,您会看到一些DSL在JVM上的运用,是依据JAVA以外的其他言语。

Cascading和 Scalding

         Cascading是在低等级的MapReduce API上最盛行的JAVA的DSL,依据介绍,在2007年底的DSL完结大规模数据的函数编程中,Cascading是MapReduce是真实最齐备的内部或嵌入式的DSL,在数据流中的清晰的象征性的排序管道,躲藏和许多底层的API的细节,使开发人员能够专心于手上的作业。

         Cascading是依据“管道”来进行切割和兼并数据流,对它们进行操作。在Cascading中,数据记载称为元祖,管道被称为组件,穿越管道的记载被称为元祖流,Cascading界说作业流管道元素,例如pipes(管道), taps(开关), and traps(圈套)。

         一个管道衔接作业流(或管道)的首要内容,并界说哪些元祖穿越它完结作业,
管道由每个类型(运用函数或过滤器)GroupBy(元祖字段流),CoGroup(参加一组常见的值),Every(适用于每一个聚合器或滑动窗口)和组件(集成其他的)。

         一个开关(tap)代表一个资源,或许轻量级的数据源的衔接,一个数据源开关一般是输入开关(在哪里读数据)一个池开关一般是输出开关(在哪里写数据)

         一个圈套(a trap)是一个池开关—这是写入数据导致操作失利的当地,使您能够继续处理您的数据而不会由于数据的丢掉犯错。

表单13-1展现Cascading管道的一个比方,即我们了解的字数核算

444

图13-1中有两个开关,输入开关(接纳文档的调集)和输出开关(发作字数)。管道也有两个功用一个符号和计数功用(聚合器),和数据流的分组组件。

表单13-8显现了一个运用Cascading完结字数核算的办法

importorg.cascading.*;

           // other imports...

publicclass WordCount {

publicstatic void main(String[] args) {

                // Set up app properties.

                Properties properties = newProperties();

FlowConnector.setApplicationJarClass(properties,WordCount.class);


                // Define the input and output"taps".

                Scheme sourceScheme = newTextLine(new Fields("line"));

                Scheme sinkScheme = newTextLine(new Fields("word", "count"));

                String inputPath      = args[0];

                String outputPath = args[1];

                Tap source = newHfs(sourceScheme, inputPath);

                Tap sink     = new Hfs(sinkScheme, outputPath, SinkMode.REPLACE);


                // Connect the pipes for thedata flow.

                Pipe assembly = newPipe("wordcount");

                // Regular expression totokenize into words.

                String regex ="(?<!\\pL)(?=\\pL)[^ ]*(?<=\\pL)(?!\\pL)";

                Function function = newRegexGenerator(new Fields("word"), regex);

assembly= new Each(assembly, new Fields("line"), function);

assembly= new GroupBy( assembly, new Fields("word"));

                Aggregator count = newCount(new Fields("count"));

assembly= new Every(assembly, count);


FlowConnectorflowConnector= new FlowConnector( properties );

                Flow flow =flowConnector.connect( "word-count", source, sink, assembly);

flow.complete();

             }

           }

        该代码经过设置运用程序的特点和源,操控开关,经过管道聚集数据创立数据流,需求留意SQL包含一些要害字操作例如GroupBy和Projection(映射)和函数核算,Cascading将这些封装成了JAVA类。像Pig的脚本(表单13-7),您遍历每一行,符号要害字(运用正则表达式)进行分组,核算每组巨细,最终将成果输出。

445

这个实例展现了Cascading联系操作的算法

这样的结构模板比单纯的展现MapReduce的字数核算怎么作业的模板少许多

留意:这是一个愈加杂乱的数据流实例,参看CMUWorkshop on CoPA(Cascading + City of Palo Alto Open Data)在https://github.com/Cascading/CoPA/wiki,展现了怎么运用Cascading和Hadoop整理未加工的和非结构化的数据,例如公园,大街敞开数据和树的数据信息。Workshop树立多个运用程序,运用这些数据供给一个示例运用。

        尽管Cascading是一个JAVA API,可是APIs当时答应运用其他的言语,列表包含Scala的Scalding, Clojure的Cascalog, Python的PyCascading以及其他。它们傍边还包含一些JAVA API中所没有的功用性的增强。例如,Cascalog增加了依据数据日志的逻辑查询功用,而Scalding增加了有关遍历问题以及许多机器算法的数学模型。

表单13-9展现了一个版其他运用遍历的数字核算

表单13-9Scalding完结数字核算

importcom.twitter.scalding._

classWordCountJob(args:Args) extends Job(args) {

TextLine(args("input"))

         .read

         .flatMap(line -> word) {

line:String =>

line.trim.toLowerCase.split("\\W+")

         }

         .groupBy(word) { group=>group.size(count) }

       }

       .write(Tsv(args("output")))// tab-delim. output

     }

正如表单13-9中的阐明里的内容,Scalding是从Twitter中展开出来的。让我们留意一些重要的作业而不去重视Scala语法的细节。

         首要,简练的代码—显着优于JAVA,有些破例的是,这段代码看起来像典型的Scala代码为了更小以及内存数据调集设置的内置API。

         其次,联系运算(如分组)是函数调用而不是类。.groupBy(word) { group =>group.size(count)这行意味着之间的输出函数调用GroupBy函数。分组在这种情况下,跨过域命名。此外一个匿名函数传递给GROUPBY需求每个组作为参数,并回来该组的巨细,符号值作为域的命名计数。这一步的数据输出(参加制表分隔符的输出)包含每个词和它的计数。

446

        在表单13-9中flatMap做了些什么?它代表了MapReduce的map阶段。在数学范畴,map实践上总是一一对应的,也便是说每个输出元素对应一个输入元素。MapReduce放宽了这个束缚,答应0对多的输入/输出对应联系。这正是flatMap的实践意义。这个匿名函数从原始的数据调集输入元素对应0对多的联系到输出元素。然后flatMap”flattens”嵌套的调集到一个”flat”调集。因而,您一直在运用Flat MapReduce。

Crunch和Scrunch

        另一个MapReduce的DSL被运用于MapReduce中的被称为Crunch,模仿谷歌的JAVA池的规划,运用小型的原始操作巨大的数据流。Crunch具有三种数据笼统:PCollection<T>(用于并行数据类型为T的数据调集),PTable<K,V>(别离键值对联系的并行表的拆分),PGroupedTable<K,V>(分组的操作输出),在集群中也存在并行结构完结业务处理。

表单13-10展现Crunch完结字数核算

//import statements...

publicclass WordCount {

publicstatic void main(String[] args) throws Exception {

                // Setup the pipeline and the input.

                Pipeline pipeline = newMRPipeline(WordCount.class);

PCollection<String>lines =

pipeline.readTextFile(args[0]);


                 // Tokenize the lines intowords in parallel.

PCollection<String>words = lines.parallelDo(

                  "my splitter", newDoFn<String, String>() {

publicvoid process(

                     String line,Emitter<String> emitter) {

for(String word : line.split("\\s+")) {

emitter.emit(word);

                     }

                  }

                }, Writables.strings());


                // Count the words.

PTable<String,Long> counts = Aggregate.count(words);


pipeline.writeTextFile(counts,args[1]);

pipeline.run();

             }

           }

从表单13-10中能够发现,Crunch是开发人员能够运用更多底层的Hadoop JAVA API(例如,运用Avro的类写入数据,运用起来十分快捷,关于了解JAVA的程序员十分简略学习)

447

Crunch的Scala版别叫做Scrunch,表单13—11将展现运用Scrunch进行的数字核算

表单13-11 运用Scrunch进行数字核算

//imports...

classWordCountExample{

valpipeline = new Pipeline[WordCountExample]


defwordCount(fileName:String) = {

pipeline.read(from.textFile(fileName))

               .flatMap(_.toLowerCase.split("\\W+"))

                .filter(!_.isEmpty())

                .count

           }

         }

         表单13-11好像ScaldingDSL相同展现了高雅,简练的操作数据流,Cascading和Scalding这组比方在量级和杂乱度上十分相似

         如上所示,Crunch 和 Scrunch愈加偏重形式和Cascading中的静态数据类型,当时静态和动态数据类型彼此之间的优势并不显着,差异取决于您的东西的挑选和喜爱。

图形处理

         最终评论的这个DSL尽管在今日运用不是很广泛,但您将在未来的一段时刻内更多的触摸到运用图形化算法的DSLs。这样的运用需求是巨大的。

         在线交际图化正在敏捷的展开,而且将有越来越多的需求去剖析它们。在线交际网站,如:Facebook, LinkedIn, Google+和Twitter像Yahoo和Google这样的电子邮件网站有着数以亿计的用户,在广告和个性化中剖析人以及他们的相关人物扮演着十分重要的人物。Google是首先发现图表剖析的重要性,并将网页排名(PageRank)算法运用于其查找引擎中的公司其间之一。Larry Page 和Sergey Brin(谷歌的创始人)将该算法运用在搜素订单成果的“链接热度”将更多的网站链接到一个网页上。尽管决议排名的相关性要素许多,不过该算法是运用于Google的网络查找东西傍边。


        其他一些问题依托于链接,图形和网络剖析,今日,Facebook在Hadoop的这个范畴一路领先,在Hadoop的未来展开中图形化的DSL将是一个飞速展开的范畴。

        到现在为止,图形化的处理体系关于Hadoop来说是新式范畴,由于可扩展的核算机集群图形化处理出于研讨范畴的前沿,姑且存在着一些问题,比方接下来的查询主题中所展现的:

448

        怎么在集群中制作分区的密度图

        怎么跨集群拆分图然后最小化链接主机的数量

        怎么跨机器链路完结信息的更新

         现在许多活泼的作业和越来越多的运用投入到Hadoop的图形处理中来,本章只评论现在说到的办法以及在“DSL 空间”项目方案中内容,更多您应该自己进一步查询。

         像以往相同,谷歌的论文作为前驱,Apache紧随其后。Pregel是Google用于数据剖析的大型图形剖析体系(http://googleresearch.blogspot.com/2009/06/large-scale-graph-computing-at-google.html),Giraph(将在本章稍后介绍)是APACHE对应Hadoop的Pregel开源版。其被Facebook用来剖析用户的社会以及朋友集体中的图形化联系。

         图形化处理体系,如Pregel和Giraph依据并行处理模型称作BulkSynchronous Parallel散装同步并行 (BSP),能够同步图形处理节点之间的通讯。为了演示BSP的作业办法,在t0时刻,一切节点在同一时刻向其他衔接着的节点发送信息。一切的节点在t1时刻,依据需求,更新它们的状况,以此类推。妨碍同步发作在每次的数据发送之后。

         树立的并发通讯模型的根底上,您或许以为MapReduce将会短少高度迭代模型—您的假设是正确的。在MapReduce中本机履行的BSP依托于独自的MapReduce使命每个迭代的BSP将带来可怕的开支。

         可是,图形处理体系开端运用于Hadoop的数据存储以及MapReduce的BSP并行核算操作中,一系列图形处理体系呈现,让我们重视两个这个类型的Hadoop开源体系:

         Giraph是Apache的一个项目,相似于Google的Pregel,完结HDFS上的BSP。在Giraph上,您提交一个MapReduce使命,但其在内部处理迭代进程运用Vertex的环境,保存状况图在内存中并不联动MapReduce使命。Giraph运用了Hadoop和MapReduce的数据存储的根底资源办理,但与在MapReduce中运用BSP不同的是,Giraph还引进了ZooKeeper进行容错以及会集的调度效劳

         Hama也是Apache的一个项目,相似于Giraph,是一个BSP的核算结构,该结构运用于HDFS的顶层。可是,Hama绕过了MapReduce,独立了自己的一套跨集群的核算进程,Hama避免了Hadoop的MapReduce资源调度和作业形式的局限性。与企图引进该结构比较安排往往不肯引进一套新的集群的处理办法与MapReduce抢夺资源,出于这个原因,Hama的运用往往独立于集群专门做这类的剖析。

449

在未来Hadoop的图形化DSLs具有飞速展开的潜力。

         这个有关Hadoop的DSLs的简略的总结标明,除了根底的MapReduce结构,一组丰厚的dsl能够使编写Hadoop的使命更有成效,愈加合适用户的需求。新的Hadoop DSLs会定时的呈现,例如,Cascading刚刚推出了两款新的DSL。

         Lingual–一个新的SQL类型的DSL

        Pattern–一个新的机器学习类型的DSL

现在,您知道DSL怎么帮助您简化MapReduce的用法,下一节将看到MapReduce自身的改善,使其能够更快,更高扩展性的进行程序处理

         正如本书所评论的,MapReduce根本架构完结是十分巨大的,而完结这个的重要组成部分是JobTracker(在第三章中详细介绍的),担任资源办理,作业调度以及监控。除此之外,实施者现已发现,JobTracker的完结过于杂乱或许会导致一些问题,包含内存耗费,严厉的线程模型以及扩展性,可靠性和功用问题。

         这个剖析成果导致,Hadoop将在MapReduce上做一次彻底的革新,有时分称为“次世代的MapReduce”,“MapReduce2.0(MRv2)”或许本节中另一种资源的代表(YARN),在提出了这种革新之后,一个称为”Tez”(印度语中的速度)的新项目被引进了Apache孵化器。并宣称能够大大进步Hadoop的功用,您在本章中将详细的了解它们。

         需求要点留意的是,尽管鄙人一节中的相关描绘中被称为MapReduce2,但不会改动MapReduce实践的编程模型,或许本书中描绘的开发人员运用的这些APIs

ApacheYARN

         Hadoop的开发委员会决议,处理方案是在原有的MapReduce的根底上割裂资源办理和作业调度到独自的看护进程,一个全新的大局资源办理器叫做YARN将JobTracker的功用拆分为两个独立的看护进程。

         一个大局资源办理器(RM),由一个调度程序和一个运用办理程序组成

        一个运用程序主节点(AM)供给运用程序支撑,一个在传统意义上的MapReduce使命中增加一个惯例使命的运用,或许一个定向非周期使命(a Directed Acyclic Graph (DAG) of jobs)(与6~8章中的Oozie比较较)。拆分JobTracker供给了更高的灵活性和更好的功用。

450

        YARN的资源办理是依据十分遍及的资源运用模型,供给特定数量的资源(内存,CPU等等),正如Hadoop中的其他部分相同,YARN的资源办理和履行结构也是运用主从架构来完结的。子节点或许节点办理器(NMS),运转在每个节点。他们办理一个特定节点上的容器,检测节点的履行状况,将资源的可用性报告给主节点,被称之为资源办理器。主节点担任和谐体系中的一切运用程序资源(与第二章中的HDFS体系结构相似)

         详细的运用程序的履行是由主运用程序操控,主运用程序是彻底分布式的,每个节点上都有主运用程序的实例。主运用程序担任拆分多个使命以及与运用资源办理器(容器)进行和谐。当一个资源被分配时,主运用程序与节点办理器(们)相互作用去放置,履行,监控运用程序使命。

全体的运用流程如图13-2所示:

分为以下进程


图13-2:YARN的体系结构

451

  1. 客户端程序提交恳求,向特定的运用程序主节点引进必要的规范,作为运用程序的一部分提交,有必要供给充沛的信息到资源办理器去启用运用程序的榜首个容器—主运用程序。依托的信息(运用程序提交的)包含运用程序运转所需的本地文件或许jar包,实践有必要履行的指令(必要的指令参数),任何UNIX环境变量(可选)等等.以此类推,由主运用程序描绘UNIX 进程(们)是十分重要的。

  2. 资源办理器分配必要的容器给主运用程序,然后发动主运用程序

  3. 发动时,主运用程序注册到资源办理器,答应客户端去查询资源办理器取得主运用程序的细节,包含它的地址。得到这些细节后,客户端能够直接与自己的主运用程序通讯

  4. 一旦主运用程序发动并运转,它会查看运用程序的恳求,并和谐运用程序履行的资源空间

  5. 资源空间被分配后,主运用程序将资源信息发布到节点办理器上

  6. 履行的进程中,运用程序代码供给必要的信息(进展,状况等等)到主节点,这些信息关于与运用程序通讯的客户端也是可获取的

  7. 一旦运用程序完结后,主运用程序开释资源,刊出,封闭并开释自己的容器


        关于YARN需求留意的是,它不会改动实践的MapReduce编程模型(YARN运用的MapReduce2的姓名简略形成误导)和开发人员运用的API,它只供给了一个新的资源办理形式和完结运用于履行MapReduce使命。因而在最简略的情况下,现有的MapReduce将正常作业仅需求从头编译

         YARN可用于创立新的结构和履行模型(除了MapReduce的),运用Hadoop集群的并发核算才干和丰厚的数据存储模型,以处理详细的新问题。这种新的结构能够运用YARN的资源办理,供给一个新的运用程序办理器。在编撰本文的时分,这些项目或多或少的都是移植YARN完结的:

        Spark(一个开源的集群核算体系)

        Apache Hama(本章前面描绘过的图形剖析结构)

        Apache Giraph(同上)

        Open MPI(一个高功用核算的开源项目)

452

        Storm(一个第九章描绘的开源,分布式实时核算体系)

        Apache S4(一个相似Storm的Apache项目,供给实时的事情处理)

         YARN结构答应多个运用程序办理器同享相同的Hadoop集群以及集群上的数据,这样简化了驻留在Hadoop集群上的多个结构之间的数据等级。

         运用YARN履行MapReduce运用进步了可扩展性,可是MapReduce的编程模型并没有充沛运用YARN的才干,特别是内置的DAG的支撑。MapReduce的运用一般随同Oozie编列的单个MapReduce使命。尽管这种办法很好的运用于批量的运转程序,可是给传递数据到HDFS以及运用程序的发动时刻方面带来很大的开支。

         其间的一些不足之处在一个叫做Tez的新的Hadoop结构中被去除

Tez

        Tez供给了一个通用的,高可用的结构,支撑编列定制使命到DAG中,Tez不只是为了个其他MapReduce使命,而是全体使命,然后取得比Oozie更快的功用。Tez的高功用是依托消除多个使命带来的开支然后满意人机交互的呼应时刻需求以及PB等级的高吞吐量(第9章中的实时处理)。

         开始由Stringer创立并支撑,方针是Apache的Hive的100倍的功用。Tez供给了一个单一的结构支撑延时和吞吐量灵敏的运用。因而,它消除了多个结构和体系的装置,保护,支撑的必要性,然后为企业节省了许多的本钱。

         Tez是2013年出由Hortonworks贡献给Apache并进入孵化阶段的。它是一个有许多程序员参加的十分活泼的项目,在Hadoop的实时运用方面有着十分光亮的远景。

安全性强化

        如第10章介绍的,Hadoop社区正在致力于安全性方面的增强。增加了新的加密编解码器,新的依据令牌的认证协议,支撑特点的一致认证体系,依据人物的拜访操控(ABAC),履行战略支撑敞开规范和XACML,改动hbase答应授权。Hadoop能够从集群环境和周边等级环境中别离,然后满意高度安全的环境要求。

453

        留意:想要了解更翔实的信息,请参阅第10章中的“安全性增强方案Rhino”

新的趋势

         这本书现已触及到了许多Hadoop的相关趋势,尽管作者没有水晶球,但他们以为以下将成为要害范畴将在未来飞速展开。

         实时的Hadoop—这种趋势今日正在发作,并将继续下去,将Hadoop看做是一个批量处理形式的体系,Hadoop在未来(特别是近期呈现的功用和弹性性的改善)随同着人为呼应时刻进行实时剖析。您或许会习惯于很长时刻才干完结的使命敏捷的履行完结,这将在几个不同的方面—诈骗检测,业务剖析,安全漏洞剖析和实时事情的反常检测以及和Hadoop生态体系中的其他东西的依据需求的剖析处理。

         图表剖析和逾越MapReduce的新算法—假如您随同着Hadoop展开的前史,您将发现Google的影响力,Google的新的可弹性分布式图形化剖析算法引发了比MapReduce更大的爱好。由于Apache 的Giraph(本章前面评论过)是Google的高功用图形化剖析渠道(Pregel)的开源完结,而且Facebook运用Griaph的图形剖析于其交际网络上,毫无疑问这将是Hadoop中飞速展开的范畴。Apache的Hama(也在本章前面评论过)运用HDFS存储以及其他的图形化算法在Hadoop上,这种趋势将会继续。

         机器学习—尽管本书中没有过多的介绍,这是一个展开中的论题。随同着Apache Mahout 和 Pattern这样的项目,机器学习的Cascading的DSL,猜测建模和机器学习将越来越多的用于Hadoop的常见用例,相似引荐,诈骗检测和安全漏洞检测。

         更高层次的笼统以及本章之前介绍的DSLs,您现已了解到Hadoop的DSL的强壮,以及它们是怎么的简化编程。运用这种言语或许东西将大大的削减Hadoop和MapReduce的运用的学习难度,而这一趋势将会继续增加。尽管运用一些东西肯定会有功用上的丢失,但更多的科学家和范畴专家在专门的范畴中运用Hadoop的东西集消除了屏障,使处理的速度变得更快。乃至有些数据专家不知道自己正在运用Hadoop!

         Hadoop正在不断的快速展开,具有一个光亮的未来,正如继续改善的范畴所展现的,新的项目在分散,功用的改善,安全性和DSLs的展开和增加,新的方向敏捷的展开关于每一个Hadoop的开发者来说是多么的激动人心!

454

总结

        本章强调了运用DSL简化MapReduce的增加趋势,您了解到了YARN和Tez关于Hadoop扩展功用的提高,以及安全性方面的改善提高以及Hadoop未来展开的新式趋势。

                   


版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表凯发娱乐立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章