Example Program 示例程序
以下程序是一个完整的,单词统计
from flink.plan.Environment import get_environment
from flink.functions.GroupReduceFunction import GroupReduceFunction
class Adder(GroupReduceFunction):
def reduce(self, iterator, collector):
count, word = iterator.next()
count += sum([x[0] for x in iterator])
collector.collect((count, word))
env = get_environment()
data = env.from_elements("Who's there?",
"I think I hear them. Stand, ho! Who's there?")
data \
.flat_map(lambda x, c: [(1, word) for word in x.lower().split()]) \
.group_by(1) \
.reduce_group(Adder(), combinable=True) \
.output()
env.execute(local=True)
程序框架:
正如我们在示例中已经看到的那样,Flink程序看起来像python程序。
每个程序由相同的基本部分组成
获得环境:
1.Load/create 创建初始化数据
2.指定数据的转换
3.指定你的计算结果放在那里,执行你的程序
环境是所有Flink程序的基础。 你可以得到试用那些静态方法
get_environment()
为了指定数据源 执行环境有几个方法来读取文件
env = get_environment()
text = env.read_text("file:///path/to/file")
这个给一个数据集 你可以应用转换。
一旦有个数据集,就可以应用转换来创建新的数据集
你可以写到一个文件,再次转换 或者 与其他数据集组合
你自己通过调用你自己的自定义转换函数来转换
data.map(lambda x: x*2)
这个会创建一个新的数据集通过每个值加倍来创建新的数据集。
data.write_text("<file-path>", WriteMode=Constants.NO_OVERWRITE)
write_csv("<file-path>", line_delimiter='\n', field_delimiter=',', write_mode=Constants.NO_OVERWRITE)
output()
最后一种方法仅用于开发/调试在一个机器上, 它会把数据集输出到标准输出
(注意在一个cluster,结果会进去集群节点的标准输出流,并最终进入wokerers的.out文件)
一旦指定了完整的程序,就需要在环境中调用execute.这将在本地计算机上执行
或者提交程序在集群上执行,具体取决于Flink是如何启动的
项目设置:
除了设置Flink之外,不需要额外的工作。Python包可以在Flink发行版中找到。
Python API在安装了Python2.7或者3.4上进行了测试
默认情况下,Flink 通过调用python或者python3来启动程序
延迟求值
所有的Flink程序都是延迟执行的
当程序的主方法被执行时,数据加载和转换不会直接发生。
相反,每个操作是被创建和追加到程序的计划里。
操作是实际被执行当其中的一个执行方法被调用
延迟执行让你构建复杂的程序,Flink将其作为一个整体计划单元执行
Transformations 转换
数据转换将一个或者多个数据集转换为一个新的数据集
程序可以将多个转换到复杂的程序及
Map 获取一个元素并生成一个元素
FlatMap 获取一个元素并生成零个、一个或者多个元素
MapPartition 转换一个并行分区到一个简单的函数调用
这个函数获取分许作为一个迭代器, 然后可以产生一个任意数量的值
Filter 为每个元素计算一个布尔值,并保留返回值
指定关键点:
某些转换(比如join或者CoGroup) 需要在其参数DataSets定义一个键,
Flink的数据模型 不是基于键值对的,
Define keys for Tuples
Executing Plans
要使用Flink计划,进入Flink的发布版本 运行pyflink2.sh 用于python 2.7
pyflink3.sh 用于python 3.4
包含脚本的计划必须作为第一个参数传递
[root@centos6 flink]# pyflink.sh count_word.py
Starting execution of program
Program execution finished
Job with JobID 4a6fe06f3b281b76fdbf041d13031e2a has finished.
Job Runtime: 1961 ms
[root@centos6 flink]# vim count_word.py
[root@centos6 flink]# pyflink.sh count_word.py
Starting execution of program
Program execution finished
Job with JobID 13059c5993041ae84b4966dae9857e5b has finished.
Job Runtime: 1617 ms
[root@centos6 flink]#
(2, i)
(1, ho!)
(1, hear)
(1, them.)
(1, think)
(2, who's)
(1, stand,)
(2, there?)