Chapter 11 Greenplum MapReduce 规范
本规范描述了定义GreenplumMapReduce作业的文档格式和模式。
MapReduce是由Google开发的用于在一系列商品服务器上处理和生成大型数据集的编程模型。 GreenplumMapReduce允许熟悉MapReduce模型的编程人员编写map和reduce函数,并将其提交给Greenplum数据库并行引擎进行处理。
为了使Greenplum能够处理MapReduce函数,在文档中定义函数,然后将文档传递给GreenplumMapReduce程序gpmapreduce,以供Greenplum数据库并行引擎执行。 Greenplum数据库系统分配输入数据,在一组机器上执行程序,处理机器故障,并管理所需的机器间通信。
有关gpmapreduce的信息,请参阅Greenplum数据库实用程序指南。
本节介绍GreenplumMapReduce文档格式的一些基本知识,以帮助您开始创建自己的GreenplumMapReduce文档。 Greenplum使用YAML 1.1文档格式,然后实现自己的模式来定义MapReduce作业的各个步骤。
所有的GreenplumMapReduce文件必须首先声明他们正在使用的YAML规范的版本。之后,三个短划线( - )表示文档的开始,三个点(...)表示文档的结束,而不开始新的文档。注释行以英镑符号(#)为前缀。可以在同一个文件中声明多个GreenplumMapReduce文档:
%YAML 1.1
# Begin Document1
# ...
# Begin Document 2
在Greenplum MapReduce文档中,有三种基本类型的数据结构或节点:标量,序列和映射。
标量是由空格缩进的基本字符串。 如果您有一个跨越多行的标量输入,则前面的管道(|)表示文字样式,其中所有换行都很重要。 或者,前一个括号(>)将单个换行符折叠为具有相同缩进级别的后续行的空格。 如果字符串包含具有保留含义的字符,则必须引用字符串,或者必须使用反斜线(\)转义特殊字符。
# Read each newline literally
somekey:| thisvalue contains two lines
and each line is read literally
# Treat each newline as a space anotherkey: >
this value contains two lines
but is treated as one continuous line
# This quoted string contains a specialcharacter ThirdKey: "This is a string: not a mapping"
一个序列是列表中的每个条目在它自己的行上用短划线和空格( - )表示的列表。 或者,您可以在方括号内指定内联序列作为逗号分隔列表。
一个序列提供一组数据并给它一个命令。 当您将一个列表加载到GreenplumMapReduce程序中时,顺序将保留。
# list sequence
- this
- is
- a list -with
- five scalarvalues
# inlinesequence
[this, is, a list, with, five scalarvalues]
mapping用于将数据值与称为键的标识符配对。 映射为每个keys:值对使用冒号和空格(:),或者也可以在花括号内以逗号分隔列表的形式内联指定。 该键用作从映射中检索数据的索引。
# a mapping ofitems title:War and Peace author: Leo Tolstoy date: 1865
# same mappingwritten inline
{title: Warand Peace, author: Leo Tolstoy, date: 1865}
Keys用于将元信息与每个节点相关联,并指定期望的节点类型(标量,序列或映射)。 有关GreenplumMapReduce程序所期望的密钥,请参阅GreenplumMapReduce文档模式。
Greenplum MapReduce程序按顺序处理文档的节点,并使用缩进(空格)来确定文档层次以及节点之间的关系。 空白的使用是重要的。 不应仅仅为了格式化而使用空白区域,并且不应该使用标签。
GreenplumMapReduce Document Schema
Greenplum MapReduce使用YAML文档框架并实现自己的YAML模式。 Greenplum MapReduce文档的基本结构是:
%YAML 1.1
---
VERSION: 1.0.0.2
DATABASE: dbname
USER: db_username
HOST: master_hostname
PORT: master_port
DEFINE:
- INPUT:
NAME: input_name
FILE:
- hostname:/path/to/file
GPFDIST:
- hostname:port/file_pattern
TABLE: table_name
QUERY: SELECT_statement
EXEC: command_string
COLUMNS:
- field_name data_type
FORMAT: TEXT | CSV
DELIMITER: delimiter_character
ESCAPE: escape_character
NULL: null_string
QUOTE: csv_quote_character
ERROR_LIMIT: integer
ENCODING: database_encoding
- OUTPUT:
NAME: output_name
FILE: file_path_on_client
TABLE: table_name
KEYS:
- column_name
MODE: REPLACE | APPEND
- MAP:
NAME: function_name
FUNCTION: function_definition
LANGUAGE: perl | python | c
LIBRARY: /path/filename.so
PARAMETERS:
- nametype
RETURNS:
- nametype
OPTIMIZE: STRICT IMMUTABLE
MODE: SINGLE | MULTI
- TRANSITION | CONSOLIDATE | FINALIZE:
NAME: function_name
FUNCTION: function_definition
LANGUAGE: perl | python | c
LIBRARY: /path/filename.so
PARAMETERS:
- nametype
RETURNS:
- nametype
OPTIMIZE: STRICT IMMUTABLE
Greenplum MapReduce Specification ReferenceGuide
539
MODE: SINGLE | MULTI
- REDUCE:
NAME: reduce_job_name
TRANSITION: transition_function_name
CONSOLIDATE: consolidate_function_name
FINALIZE: finalize_function_name
INITIALIZE: value
KEYS:
- key_name
- TASK:
NAME: task_name
SOURCE: input_name
MAP: map_function_name
REDUCE: reduce_function_name
EXECUTE
- RUN:
SOURCE: input_or_task_name
TARGET: output_name
MAP: map_function_name
REDUCE: reduce_function_name...
需要。 Greenplum MapReduce YAML规范的版本。 当前版本是1.0.0.1。
可选的。 指定Greenplum中的哪个数据库连接到。 如果未指定,则默认为默认数据库或$ PGDATABASE(如果已设置)
可选的。 指定用于连接的数据库角色。 如果未指定,则默认为当前用户或$ PGUSER(如果已设置)。 您必须是Greenplum超级用户才能运行用不可信的Python和Perl编写的函数。 常规数据库用户可以运行用可信的Perl编写的函数。 您还必须是数据库超级用户才能运行包含FILE,GPFDIST和EXEC输入类型的MapReduce作业。
可选的。 指定Greenplum主控主机名称。 如果未指定,则默认为localhost或$ PGHOST。
可选的。 指定Greenplum主端口。 如果未指定,则默认为5432或$ PGPORT(如果设置)。
需要。 这个MapReduce文档的一系列定义。 DEFINE部分必须至少有一个INPUT定义。.
INPUT
需要。 定义输入数据。 每个MapReduce文档都必须至少定义一个输入。 文档中允许有多个输入定义,但每个输入定义只能指定其中一种访问类型:文件,gpfdist文件分发程序,数据库中的表,SQL命令或操作系统命令。 有关gpfdist的信息,请参阅Greenplum数据库实用程序指南。
这个输入的名字。 关于MapReduce作业中其他对象的名称(例如map函数,任务,reduce函数和输出名称),名称必须是唯一的。 此外,名称不能与数据库中的现有对象(例如表,函数或视图)冲突。
FILE
一个或多个输入文件的序列,格式为:seghostname:/path /to/fiiename。 您必须是Greenplum数据库超级用户才能使用FILE输入运行MapReduce作业。 该文件必须位于Greenplum分段主机上。
一个或多个运行gpfdist文件分发程序的序列,格式为:hostname [:port] / fiie_pattern。 您必须是Greenplum数据库超级用户才能使用GPFDIST输入运行MapReduce作业,除非服务器配置参数“服务器配置”参数设置为打开。.
数据库中现有表的名称。
在数据库中运行的SQL SELECT命令。
在Greenplum段主机上运行的操作系统命令。
该命令默认由系统中的所有段实例运行。
例如,如果每个段主机有四个段实例,则该命令将在每个主机上运行四次。 您必须是Greenplum数据库超级用户才能使用EXEC输入运行MapReduce作业,并将服务器配置参数“服务器配置”参数设置为打开。
可选的。 列被指定为:column_name[data_type]。 如果未指定,则默认为值文本。 DELIMITER字符是分隔两个数据值字段(列)的字符。 换行是由换行符(0x0a)决定的。
可选的。 指定数据的格式 - 分隔文本(TEXT)或逗号分隔值(CSV)格式。 如果未指定数据格式,则默认为TEXT。
可选FILE,GPFDIST和EXEC输入。 指定分隔数据值的单个字符。 默认值是TEXT模式下的制表符,CSV模式下的逗号。分隔符只能出现在任何两个数据值字段之间。 不要在行的开头或结尾放置分隔符。
可选FILE,GPFDIST和EXEC输入。 指定用于C转义序列(例如\ n,\ t,\ 1oo等)的单个字符,以及用于转义可能被视为行或列分隔符的数据字符。 确保选择实际列数据中任何地方都没有使用的转义字符。 默认的转义字符是文本格式文件的\(反斜线)和csv格式文件的“(双引号)”,但是可以指定另一个字符来表示转义。也可以通过指定禁用转义 值为'OFF'作为转义值,这对于诸如文本格式的网络日志数据这样的数据是非常有用的,这些数据具有许多嵌入的反斜杠,这些反斜杠不是为了转义。
NULL
可选FILE,GPFDIS7和EXEC输入。 指定表示空值的字符串。 TEXT格式的默认值是\ N,CSV格式的没有引号的空值。 即使在TEXT模式下,如果您不想区分空字符串的空值,您可能更喜欢空字符串。 与此字符串匹配的任何输入数据项都将被视为空值。
可选FILE,GPFDIST和EXEC输入。 指定CSV格式文件的引号字符。 缺省值为双引号(“)。在CSV格式的文件中,如果数据值字段包含逗号或嵌入的新行,则必须用双引号括起来,包含双引号字符的字段必须用双引号括起来, 每个双引号都必须用一对连续的双引号表示,为了正确解析数据行,必须始终正确打开和关闭引号。
如果输入行有格式错误,只要在输入处理期间任何Greenplum段实例的错误限制计数没有达到,它们将被丢弃。 如果未达到错误限制,则将处理所有好行,并丢弃任何错误行。
用于数据的字符集编码。 指定一个字符串常量(如“SQL-ASCII”),一个整数编码号或DEFAULT来使用默认的客户端编码。
可选的。 定义输出MapReduce作业的格式化数据的位置。 如果输出未定义,则默认为STDOUT(客户端的标准输出)。 您可以将输出发送到客户端主机上的文件或数据库中的现有表。
NAME
此输出的名称。 默认输出名称是STDOUT。 关于MapReduce作业中其他对象的名称(例如map函数,任务,reduce函数和输入名称),名称必须是唯一的。 此外,名称不能与数据库中的现有对象(例如表,函数或视图)冲突。
在MapReduce客户端机器上指定一个文件位置,以格式输出数据: /path/to/filename.
指定数据库中用于输出数据的表的名称。如果这个表在运行MapReduce作业之前不存在,它将使用KEYS指定的分配策略创建。
可选的TABLE输出。指定用作Greenplum数据库分发密钥的列。如果EXECUTE任务包含REDUCE定义,则REDUCE键将默认用作表分配键。否则,表格的第一列将被用作分配键。
MODE
可选的TABLE输出。如果未指定,则默认为创建表,如果该表不存在,则返回错误。声明APPEND将输出数据添加到现有表(提供的表模式与输出格式匹配),而不删除任何现有数据。声明REPLACE会删除表,如果它存在,然后重新创建它。如果不存在,APPEND和REPLACE都将创建一个新表。
需要。每个MAP函数都采用(键,值)对结构化的数据,处理每对数据,并生成零个或多个输出(键,值)对。 Greenplum MapReduce框架然后从所有输出列表中收集具有相同关键字的所有对,并将它们组合在一起。该输出然后传递给REDUCE任务,该任务由TRANSITION |组成CONSOLIDATE | FINALIZE函数。有一个名为IDENTITY的预定义MAP函数返回(键,值)对不变。虽然(键,值)是默认参数,但您可以根据需要指定其他原型。
TRANSITION | CONSOLIDATE | FINALIZE
TRANSITION,CONSOLIDATE和FINALIZE都是REDUCE的组成部分。
TRANSITION功能是必需的。 CONSOLIDATE和FINALIZE函数是可选的。默认情况下,所有状态都是第一个输入参数,但也可以定义其他原型。
TRANSITION函数迭代给定键的每个值,并在状态变量中累加值。当在键的第一个值上调用转换函数时,状态将设置为由REDUCE作业的INITALIZE指定的值(或数据类型的默认状态值)。一个转换需要两个参数作为输入;关键减少的当前状态,然后下一个值,然后产生一个新的状态。
如果指定了CONSOLIDATE函数,则在通过Greenplum互连重新分配密钥以进行最终聚合(两阶段聚合)之前,将在段级别执行TRANSITION处理。只有给定密钥的结果状态值被重新分配,导致较低的互连流量和较高的并行性。
CONSOLIDATE像TRANSITION一样处理,除了(state +value)
=> state, it is (state + state) =>state.
如果指定了FINALIZE函数,它将采用由CONSOLIDATE(如果存在)或TRANSITION生成的最终状态,并在发出最终结果之前执行任何最终处理。 TRANSITION和CONSOLIDATE函数不能返回一组值。如果您需要REDUCE作业来返回一个集合,则需要FINALIZE将最终状态转换为一组输出值。
NAME
需要。该函数的名称。关于MapReduce作业中其他对象的名称(例如函数,任务,输入和输出名称),名称必须是唯一的。您还可以指定内置到Greenplum数据库的函数的名称。如果使用内置功能,请不要提供LANGUAGE或FUNCTION主体。
FUNCTION
可选的。使用指定的LANGUAGE指定函数的全部主体。如果未指定FUNCTION,则使用与NAME对应的内置数据库函数。
LANGUAGE
在使用FUNCTION时需要。指定用于解释函数的实现语言。此发行版对perl,python和C有语言支持。如果调用内置数据库函数,则不应指定LANGUAGE。
UBRARY
LANGUAGE为C时不可用(其他语言功能不允许)。要使用这个属性,VERSION必须是1.0.0.2。指定的库文件必须在运行MapReduce作业之前安装,并且它必须存在于所有Greenplum主机(主节点和分段)的同一文件系统位置。
parameter
可选的。功能输入参数。默认的类型是文本。
MAP默认值 - 键值文本,值文本TRANSITION默认值 - 状态文本,值文本
CONSOLIDATE默认 - state1文本,state2文本(必须有两个相同数据类型的输入参数)
FINALIZE默认状态文本(仅限单个参数)
RETURNS
可选的。默认的返回类型是文本。
MAP默认值 - 键值文本,值文本
TRANSITION默认 - 状态文本(仅限单个返回值)
CONSOLIDATE默认状态文本(仅限单个返回值)
FINALIZE默认值文本
OPTIMIZE
该功能的可选优化参数:
STRICT - 函数不受NULL值的影响
IMMUTABLE -函数将始终返回给定输入的相同值
MODE
可选的。指定函数返回的行数。
MULTI - 每个返回0或更多行
函数的返回值必须是要返回的行数组,或者函数必须使用Python中的yield或Perl中的return_next作为迭代器来编写。 MULTI是MAP和FINALIZE函数的默认模式。
SINGLE - 每个输入记录只返回一行。 SINGLE是TRANSITION和CONSOLIDATE功能支持的唯一模式。当与MAP和FINALIZE函数一起使用时,SINGLE模式可以提供适度的性能改进。
REDUCE
需要。 REDUCE定义将TRANSITION |命名为CONSOLIDATE |FINALIZE函数将(键,值)对减少到最终的结果集。还可以执行几个预定义的REDUCE作业,这些作业都在名为value的列上进行操作:
IDENTITY - 返回(键,值)对不变
SUM - 计算数字数据的总和
AVG - 计算数字数据的平均值
COUNT - 计算输入数据的计数MIN - 计算数字数据的最小值MAX - 计算数字数据的最大值
NAME
需要。这个REDUCE工作的名字。关于MapReduce作业中其他对象的名称(函数,任务,输入和输出名称),名称必须是唯一的。此外,名称不能与数据库中的现有对象(例如表,函数或视图)冲突。
TRANSITION
需要。 TRANSITION功能的名称。
CONSOLIDATE
可选的。 CONSOLIDATE函数的名称。
FINALIZE
可选的。 FINALIZE函数的名称。
INITIALIZE
文本和浮点数据类型可选。所有其他数据类型都是必需的。
文本的默认值是11。 float的默认值是0.0。设置TRANSITION函数的初始状态值。
KEYS
可选的。默认为[key,*]。使用多列缩减时,可能需要指定哪些列是关键列,哪些列是值列。默认情况下,任何未传递给TRANSITION函数的输入列都是键列,而名为key的列始终是键列,即使它传递给TRANSITION函数。特殊指示符*表示未传递到TRANSITION功能的所有列。如果这个指标在密钥列表中不存在,则丢弃任何不匹配的列。
TASK
可选的。一个任务在Greenplum MapReduce作业流程中定义一个完整的端到端INPUT / MAP/ REDUCE阶段。它与EXECUTE类似,除非不立即执行。一个任务对象可以被称为INPUT来进一步处理阶段。
NAME
需要。这个任务的名字。对于MapReduce作业中其他对象的名称(例如map函数,reduce函数,输入和输出名称),名称必须是唯一的。此外,名称不能与数据库中的现有对象(例如表,函数或视图)冲突。
SOURCE
INPUT或其他任务的名称。
MAP
可选的。 MAP函数的名称。如果未指定,则默认为IDENTITY。
REDUCE
可选的。 REDUCE函数的名称。如果未指定,则默认为IDENTITY。
EXECUTE
需要。 EXECUTE定义了GreenplumMapReduce作业流水线中的最后一个INPUT / MAP/ REDUCE阶段。
RUN
SOURCE
需要。 INPUT或TASK的名称。
TARGET
可选的。 OUTPUT的名称。默认输出是STDOUT。
MAP
可选的。 MAP函数的名称。如果未指定,则默认为IDENTITY。减少
可选的。 REDUCE函数的名称。默认为IDENTITY。