翻译来源 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。这是一种将简单的流放在一起以用于样例或测试的便捷方法。StreamExecutionEnvironment还有一种 fromCollection(Collection)方法。因此,您可以这样做:

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)

进一步阅读

【翻译】了解Flink-对DataStream API的介绍 -- Learn Flink-Intro to the DataStream API的更多相关文章

  1. Flink应用程序结构开发介绍

    Flink程序遵循一定的编程模式.DataStream API 和 DataSet API 基本具有相同的程序结构.以下为一个流式程序的示例代码来对文本文件进行词频统计. package com.re ...

  2. 【大数据面试】Flink 04:状态编程与容错机制、Table API、SQL、Flink CEP

    六.状态编程与容错机制 1.状态介绍 (1)分类 流式计算分为无状态和有状态 无状态流针对每个独立事件输出结果,有状态流需要维护一个状态,并基于多个事件输出结果(当前事件+当前状态值) (2)有状态计 ...

  3. Odoo 二次开发教程(五)-新API的介绍与应用

    [关于odoo新API的介绍,Internet上资料很少,或者不够完整详实,这会对初学者造成很大的困惑,本篇的目的就是希望能帮助新手了解新API的大概] odoo 新api的实现是借助于python装 ...

  4. Tyk API网关介绍及安装说明

    Tyk API网关介绍及安装说明 Tyk是一个开源的轻量级API网关程序. 什么是API网关 API网关是一个各类不同API的前置服务器.API网关封装了系统内部架构,对外提供统一服务.此外还可以实现 ...

  5. spring3 的restful API RequestMapping介绍

    原文链接:http://www.javaarch.net/jiagoushi/694.htm spring3 的restful API RequestMapping介绍 在spring mvc中 @R ...

  6. Android基础知识之API等级介绍

    原文:http://android.eoe.cn/topic/android_sdk :可以让开发者通过一个表示API级别的整数来描述程序在android平台上的兼容性,系统会将与系统本身提供的API ...

  7. FileNet P8 工作流生命周期管理和 Process Engine API 应用介绍

    摘录:https://www.ibm.com/developerworks/cn/data/library/techarticles/dm-0902wangzheng/ FileNet P8 工作流生 ...

  8. Tesseract-OCR-05-主要API功能介绍

    Tesseract-05-主要API功能介绍 tesseract本身代码是由c/c++混编而成的,其中有用的简单的接口函数几乎都是在baseapi.h中 从其处理过程中,不难得出: 它还需要有一个im ...

  9. API HOOK介绍 【转】

    什么是“跨进程 API Hook”? 众所周知Windows应用程序的各种系统功能是通过调用API函数来实现.API Hook就是给系统的API附加上一段小程序,它能监视甚至控制应用程序对API函数的 ...

  10. OpenStack Restful API框架介绍

    1  pecan框架介绍 1.1  什么是pecan pecan是一个轻量级的python web框架,最主要的特点是提供了简单的配置即可创建一个wsgi对象并提供了基于对象的路由方式. 主要提供的功 ...

随机推荐

  1. QueryObject

    1 package com.ygm.aa.page.qo; 2 3 import lombok.Getter; 4 import lombok.NoArgsConstructor; 5 import ...

  2. kvm 透传显卡至win10虚拟机

    环境 已安装nvidia 显卡 驱动 操作系统:CentOS Linux release 7.9.2009 (Core) 内核版本:Linux 5.4.135-1.el7.elrepo.x86_64 ...

  3. VOLO论文笔记

    Outlook Attention 设给定输入为 \(X \in R^{H \times W \times C}\), 首先经过两个线性映射得到两个输出A 和 V,A叫做outlook weight ...

  4. pytest框架增加log打印(包括pytest的执行结果、自定义的log信息)

    前言: 之前同事在跑脚本的时候报错了,发现没法把需要的log信息打印出来,我这边定位问题比较麻烦,所以增加了log的打印.这个问题之前已经处理过了,本来以为是小问题,结果今天又要用到这个小技巧的时候居 ...

  5. [jQuery]判断页面是否滚动到底部

    方法1:判断可见高度+滚动高度是否等于内容高度 但经过测试UC.QQ.华为浏览器,这个方法不生效.(打印查因:可能由于屏幕缩放,可见高度和滚动高度会偏小. $(this).scroll(functio ...

  6. 打开Access时电脑出现蓝屏,错误编号0x00000116的问题解决

    Windows7 64位旗舰版,在打开Access 2013,Onenote 2013时均会出现蓝屏,现就出现蓝屏问题解决方法给大家做一个分享. 步骤: 1.右击我的电脑,打开设备管理器 2.按顺序1 ...

  7. lowcodeEngine 组件面板的拖拽功能

    设计器和渲染器处在不同的 Frame 渲染器以单独的 iframe 嵌入,xxx-simulator-renderer 通过和 host进行通信来和设计器打交道,比如点击渲染画布任意一个位置,需要能计 ...

  8. Java基础_字符串比较

    字符串之间的比较 compareTo "==" equals compareTo 示例: compareTo(string) compareToIgnoreCase(String) ...

  9. 实现接口开启线程(实现Runnable接口)

    步骤 定义类实现Runnable接口 重写run()方法 在测试类创建子类对象 创建线程对象把子类对象作为参数传入构造方法 用线程对象调用start()方法开启线程 //1.类实现Runnable接口 ...

  10. idea中怎么查找替换数据?

    快捷键全局查询所有:crtl+shift+F 快捷键全局替换所有:crtl+shift+R 1.crtl+f crtl+r 快捷键全局查询所有:crtl+shift+F 快捷键全局替换所有:crtl+ ...