cascading基本概念

这是cascading官方userguide的中文翻译,其中有些概念看过一段时间又忘了,在此做个记录,一是方便自己复习,二是方便新手。

关于cascading我不想多说了,你如果写过原生mapreduce程序,然后再接触cascading,你会发现cascading Great job。它对Map和Reduce进行了高度抽象,用Tap、Pipe、Function、Operation这些概念替代了原有的Map和Reduce,可以很舒服的开发hadoop程序,但是这些概念过了一个来月我又忘的差不多了,所以有了这篇翻译。

对于一些不好翻译的单词我这里直接给出了原单词,所以说看资料还是英文原版的好,看翻译的书籍有很大风险,万一别人翻译错了,那你这个newbie怎么能懂!

下面的翻译来自cascading-userguide/ch03s03.html,下载地址:http://docs.cascading.org/cascading/2.5/userguide/html/userguide.zip

首先是一段关于pipe assembly的代码例子

// the "left hand side" assembly head
Pipe lhs = new Pipe( "lhs" );

lhs = new Each( lhs, new SomeFunction() );
lhs = new Each( lhs, new SomeFilter() );

// the "right hand side" assembly head
Pipe rhs = new Pipe( "rhs" );

rhs = new Each( rhs, new SomeFunction() );

// joins the lhs and rhs
Pipe join = new CoGroup( lhs, rhs );

join = new Every( join, new SomeAggregator() );

join = new GroupBy( join );

join = new Every( join, new SomeAggregator() );

// the tail of the assembly
join = new Each( join, new SomeFunction() );

通用流模式Common Stream Pattern

  • Split
    一分多
  • Merge
    多合一stream拥有相同fields常见的有:Merge、GroupBy
  • Join 和sqljoin一样,把拥有不同列的stream按照相同列join起来。HashJoin、CoGroup

除了split、merge、join以外,管道组装还有examine、filter、organize、transform这些操作,为了方便处理,在元组中的每个值都被赋予一个fieldname,就像数据库中的列名一样,这样他们就能很方便的被引用与选择。

术语介绍:

  1. Operation(cascading.operation.Operation)接受一个参数元组Tuple,输出零或多个结果元组。Cascading提供了几个常用的Operation,开发者也可以自己实现。
  2. Tuple,在Cascading中,数据被看作元组(cascading.tuple.Tuple)的流,元组由fields构成,元组和数据库中的记录或行类似。一个元组是一组值的数组,每个值可以为任何java.lang.Object。
  3. Fields(cascading.tuple,Fields)被用于声明或引用元组中的某一列,fields可以表示为像“firstname”、“birthdate”的字符串,也可以是整数值(0表示第一个,-1表示最后一个),或者还可以是预定义的值(Fields.All、Fields.RESULT、Fields.REPLACE等)

Pipe类是用于实例化与命名一个pipe,Pipe的名字可以被planner用于绑定到tap上,作为source或者sink使用。(第三种选择是绑定pipebranch到一个tap,作为一个trap,这在高级主题在详细讨论)

SubAssembly子类是一个特殊的pipe类型,他用于嵌套一组可重用的pipeassemblies,这样可以方便用于更大范围内的pipeassembly。

其余六种pipe类型:

  1. Each这种pipe基于tuple的内容做处理,包括analyze、transform、filter。还可以用Each类splitor
    branch一个流,达到这种效果你仅仅需要把Each的输出定向到一个不同的pipe或sink即可。
  2. Merge这个pipe和Each一样都可以把一个流split成两个,Merge还可以把多个流合并成一个,前途是这些流具有相同的fields。当不需要grouping(noaggregator
    or buffer操作会被使用时)时使用Merge,Merge比GroupBy快。
  3. GroupBy基于特定field,把一个流中的tuples分组。如果传入多个stream,它在分组之前先进行merge操作,在进行merge时,GroupBy要求多个stream必须用相同的fieldstructure。分组的目的通常是为Every管道准备一个处理流,Every管道可以针对groups进行aggregator和buffer操作,比如counting,totalling,averaging。我们应该明确,grouping这里意味着基于某一特地field的值进行分组(byGroupBy或CoGroup),比如按照timestamp或zipcode进行分组,在每一分组中,元组的顺序是随机的,不过你也可以指定一个次sortkey,但是通常情况下,是不必要的,这只会增加运行时间。
  4. Every用于处理分组后的流。只能用于GroupBy或Cogroup的输出流,不能处理Each、Merge、HashJoin的输出流。
  5. CoGroup对多个流进行join,和SQLjoin类似。它只基于某特定field进行group,产出一个结果流。如果在多流中包含有相同的field名,它们必须被重命名来避免结果tuple中field的冲突
  6. HashJoin和Cogroup一样,用于对多个流的join。但是它更适用于不需要grouping的场合下,这时它的性能更优。

Pipe类型对比表


Pipe type


Purpose


Input


Output


Pipe


instantiate a pipe; create or name a branch


name


a (named) pipe


SubAssembly


create nested subassemblies


 


 


Each


apply a filter or function, or branch a stream


tuple stream (grouped or not)


a tuple stream, optionally filtered or transformed


Merge


merge two or more streams with identical fields


two or more tuple streams


a tuple stream, unsorted


GroupBy


sort/group on field values; optionally merge two or morestreams with identical fields


one or more tuple streams with identical fields


a single tuple stream, grouped on key field(s) with optionalsecondary sort


Every


apply aggregator or buffer operation


grouped tuple stream


a tuple stream plus new fields with operation results


CoGroup


join 1 or more streams on matching field values


one or more tuple streams


a single tuple stream, joined on key field(s)


HashJoin


join 1 or more streams on matching field values


one or more tuple streams


a tuple stream in arbitrary order

Each、Every的语法如下:

new Each( previousPipe, argumentSelector, operation, outputSelector )
new Every( previousPipe, argumentSelector, operation, outputSelector )

这两个pipe都有四个参数:

  • 一个pipe实例
  • 一个参数选择器
  • 一个Operation实例
  • 一个输出选择器

Each与Every的主要不同在于Each用于处理单个元组,Every用于处理由GroupBy或CoGroup输出的分组tuple,这限制了它们分别可以实施的操作、结果的输出。

Each的操作可以是Functions和Filters的子类。比如你可以从日志文件中解析出特定field;过滤掉除了HTTPGET以外的请求,把timestring替换成datefield。

Every的操作可以是Aggregators和Buffer的子类。比如你可以用Every去统计每天GET请求数,它会为每天输出一个统计值。

大多数Operation子类都声明了resultfield(就是上图中的declaredfields),outputSelector指定输出Tuple中的field,而输出Tuple中的field来源于input的field和operation的结果这两个方面。如果outputSelector=Fields.ALL那么输出的Tuple就是input+result的数据merge后的结果。

对于Each来说argumentSelector默认为Fields.All,outputSelector默认为Fields.RESULT

对于Every来说Aggregator的result默认被追加到inputTuple上。比如,你在department域上做grouping,然后统计这个公寓的names,那么结果fields会是["department","num_employees"]

当Every与Bufferoperation一起使用时,行为和Aggregator很不一样,operationresult这次是和当前valuestuple关联在一起,而不是当前groupingtuple。这就像Each与Function一起使用时一样。这也许看起来不是很直观,但这提供了很大的灵活性。换一个说法,bufferoperation的result没有被追加到thecurrent
keys being grouped on,是由buffer来决定是emit它们ifthey
are relevant,而且对于Buffer来说,针对每个唯一的grouping有可能emit多个resultTuple。也就是说,一个Buffer可能或者可能不和Aggregator行为一致,但是Aggregator只是一个特殊的Buffer。

时间: 2024-08-30 20:09:26

cascading基本概念的相关文章

j2EE基础概念(总结)

j2ee|概念 Java基础方面: 1,作用域public,protected,private,以及不写时的区别 2,ArrayList和Vector的区别,HashMap和Hashtable的区别 3,char型变量能不能定义为一个中文?为什么? 4,多线程有几种表示方法,都是什么?同步有几种实现方法,都是什么? 5,继承时候类的执行顺序问题,一般都是选择题,问你将会打印出什么? 6,内部类的实现方式? 7,垃圾回收机制,如何优化程序? 8,float型float f=3.4是否正确? Jsp

XML轻松学习手册(2)XML概念

xml|概念 第二章 XML概念 导言 经过第一章的快速入门学习,你已经知道了XML是一种能够让你自己创造标识的语言,它可以将数据与格式从网页中分开,它可以储存数据和共享数据的特性使得XML无所不能.如果你希望深入学习XML,系统掌握XML的来龙去脉,那么我们首先还是要回到XML概念的问题上来.XML(Extensible Markup Language),一种扩展性标识语言."扩展性""标识""语言".每一个词都明确的点明了XML的重要特点和功

Web的26项基本概念和技术

Web 开发是比较费神的,需要掌握很多很多的东西,特别是从事前端开发的朋友,需要通十行才行.今天,本文向初学者介绍一些 Web 开发中的基本概念和用到的技术,从A到Z总共26项,每项对应一个概念或者技术. A - AJAX AJAX 全称为"Asynchronous JavaScript and XML"(异步JavaScript和XML),是一种创建交互式网页应用的网页开发技术.根据Ajax提出者Jesse James Garrett建议,AJAX: ●使用XHTML+CSS来表示信

《Spark大数据分析:核心概念、技术及实践》Spark Core

本节书摘来自华章出版社<Spark大数据分析:核心概念.技术及实践>一书中的第1章,第节,作者穆罕默德·古勒(Mohammed Guller)更多章节内容可以访问"华章计算机"公众号查看. Spark Core Spark是大数据领域最活跃的开源项目,甚至比Hadoop还要热门.如第1章所述,它被认为是Hadoop的继任者.Spark的使用率大幅增长.很多组织正在用Spark取代Hadoop. 从概念上看,Spark类似于Hadoop,它们都用于处理大数据.它们都能用商用硬

Cascading——针对Hadoop MapReduce的数据处理API

Cascading API的核心概念是管道和流.所谓管道,就是一系列处理步骤(解析.循环.过滤等等),这些步骤定义了将要进行的数据处理,而流就是带有数据源与数据接收 器(data-sink)的管道的联合. Cascading是一个新式的针对Hadoop clusters的数据处理API,它使用富于表现力的API来构建复杂的处理工作流,而不是直接实现Hadoop MapReduce的 算法. 该 处理API使开发者可以快速装配复杂的分布式流程,而无需"考 虑"MapReduce. 同时还

前端(第一节课 HTML、CSS 、JAVAscript的概念)

HTML.CSS .JAVAscript的概念 1.HTML HTML 是用来描述网页的一种语言. HTML 指的是超文本标记语言 (Hyper Text Markup Language) HTML 不是一种编程语言,而是一种标记语言 (markup language) 标记语言是一套标记标签 (markup tag) HTML 使用标记标签来描述网页 2.CSS 层叠样式表(英文全称:Cascading Style Sheets)是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标

XML轻松学习手册(二):XML概念_XML/RSS

导言 经过第一章的快速入门学习,你已经知道了XML是一种能够让你自己创造标识的语言,它可以将数据与格式从网页中分开,它可以储存数据和共享数据的特性使得XML无所不能.如果你希望深入学习XML,系统掌握XML的来龙去脉,那么我们首先还是要回到XML概念的问题上来.XML(Extensible Markup Language),一种扩展性标识语言."扩展性""标识""语言".每一个词都明确的点明了XML的重要特点和功能.我们来仔细分析: 一. 扩展性

XML轻松学习手册(2)XML概念_XML/RSS

第二章 XML概念 导言 经过第一章的快速入门学习,你已经知道了XML是一种能够让你自己创造标识的语言,它可以将数据与格式从网页中分开,它可以储存数据和共享数据的特性使得XML无所不能.如果你希望深入学习XML,系统掌握XML的来龙去脉,那么我们首先还是要回到XML概念的问题上来.XML(Extensible Markup Language),一种扩展性标识语言."扩展性"标识"语言".每一个词都明确的点明了XML的重要特点和功能.我们来仔细分析: 一. 扩展性 二

《Spark大数据分析:核心概念、技术及实践》一 第3章 Spark Core

第3章 Spark Core Spark是大数据领域最活跃的开源项目,甚至比Hadoop还要热门.如第1章所述,它被认为是Hadoop的继任者.Spark的使用率大幅增长.很多组织正在用Spark取代Hadoop. 从概念上看,Spark类似于Hadoop,它们都用于处理大数据.它们都能用商用硬件以很低的成本处理大数据.然而,相比于Hadoop,Spark有很多的优势,这些将在本章进行介绍. 本章主要介绍Spark Core,这也是Spark生态系统的基础.我们首先概述Spark Core,然后