【翻译】了解Flink-对DataStream API的介绍 -- Learn Flink-Intro to the DataStream API
翻译来源 Learn Flink:Intro to the DataStream API
本手册的重点是充分地全面介绍DataStream API,使您能够开始编写流应用程序。
流式可以传输什么?
Flink的Java和Scala的DataStream API将让您用流传输可以序列化的任何内容。Flink自己的序列化器用于:
- 基本类型,String, Long, Integer, Boolean, Array
- 复合类型:Tuples, POJOs, and Scala case classes
并且Flink回退到Kryo进行其他类型的序列化。也可以将其他序列化器与Flink一起使用。特别是Avro得到了很好的支持。
Java元组和POJO
元组原文tuples。
Flink的本机序列化程序可以在元组和POJO上高效运行。
元组
对于Java,Flink定义了自己的Tuple0到Tuple25类型。
Tuple2<String, Integer> person = Tuple2.of("Fred", 35);
// zero based index!
String name = person.f0;
Integer age = person.f1;
POJO
如果满足以下条件,则Flink将数据类型识别为POJO类型(并允许“按名称”字段引用):
- 该类是公共的和单独的(没有非静态内部类)
- 该类具有公共的无参数构造函数
- 类(包括所有超类)中的所有非静态,非瞬态字段都是公共的(并且是non-final),或者具有公共的getter和setter方法,这些方法遵循针对getter和setter的Java bean命名约定。
例子:
public class Person {
public String name;
public Integer age;
public Person() {};
public Person(String name, Integer age) {
. . .
};
}
Person person = new Person("Fred Flintstone", 35);
Flink的序列化器支持POJO类型的模式演变。
Scala元组和case classes
这块不做介绍
一个完整的例子
本示例将有关人的记录流作为输入,并对其进行过滤以仅包括成年人。
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.api.common.functions.FilterFunction;
public class Example {
public static void main(String[] args) throws Exception {
final StreamExecutionEnvironment env =
StreamExecutionEnvironment.getExecutionEnvironment();
DataStream<Person> flintstones = env.fromElements(
new Person("Fred", 35),
new Person("Wilma", 35),
new Person("Pebbles", 2));
DataStream<Person> adults = flintstones.filter(new FilterFunction<Person>() {
@Override
public boolean filter(Person person) throws Exception {
return person.age >= 18;
}
});
adults.print();
env.execute();
}
public static class Person {
public String name;
public Integer age;
public Person() {};
public Person(String name, Integer age) {
this.name = name;
this.age = age;
};
public String toString() {
return this.name.toString() + ": age " + this.age.toString();
};
}
}
流执行环境
每个Flink应用程序都需要一个执行环境,示例中的env。流应用程序需要使用StreamExecutionEnvironment。
应用程序中进行的DataStream API调用会组成构建一个作业图,该作业图已附加到 StreamExecutionEnvironment。调用env.execute(),作业图被打包,然后发送到JobManager,JobManager并行作业并且分配图片段给Task Managers执行。作业的每个并行切片都会在一个task slot中执行。
请注意,如果您不调用execute(),则您的应用程序将不会运行。
此分布式运行时要求应用程序可以被序列化。它还要求对于群集中的每个节点所有依赖的东西均可用。
基本的stream sources
上面的示例用 env.fromElements(...)构造了一个DataStream
List<Person> people = new ArrayList<Person>();
people.add(new Person("Fred", 35));
people.add(new Person("Wilma", 35));
people.add(new Person("Pebbles", 2));
DataStream<Person> flintstones = env.fromCollection(people);
在使用样例时,另一种便捷方法是从套接字将一些数据放入流中。
DataStream<String> lines = env.socketTextStream("localhost", 9999)
或一个文件
DataStream<String> lines = env.readTextFile("file:///path");
在实际应用程序中,最常用的数据源是那些支持低延迟、高吞吐量、并行读取以及回退和重放(高性能和容错能力的先决条件)的数据源,例如Apache Kafka,Kinesis和各种文件系统。REST API和数据库也经常用于流。
基本的stream sinks
上面的示例用adults.print()将其结果打印到任务管理器日志中(当在IDE中运行时,它将显示在IDE的控制台中)。这将对流的每个元素调用toString()。
输出看起来像这样
1> Fred: age 35
2> Wilma: age 35
其中1>和2>指示哪个子任务(即线程)产生了输出。
在生产中,常用的接收器包括StreamingFileSink,各种数据库和几个发布-订阅系统。
调试
在生产中,您的应用程序将在远程集群或一组容器中运行。程序失败也是远程失败。JobManager和TaskManager日志对于调试此类故障非常有用,但是Flink支持的IDE内进行本地调试要容易得多。您可以设置断点,检查局部变量,并逐步执行代码。您也可以进入Flink的代码,如果您想了解Flink的工作原理,这可能是了解其内部的一种好方法。
上手
至此,您已经足够了解如何开始编码和运行一个简单的DataStream应用程序了。克隆flink-training仓库,然后按照README中的说明进行第一个练习: 过滤一个流(Ride Cleansing)。