介绍
Apache Flink是用于分布式流和批处理数据处理的开源平台。 Flink是具有多个API的流数据流引擎,用于创建面向数据流的应用程序。
Flink应用程序通常使用Apache Kafka进行数据输入和输出。
本文将为您提供将Apache Flink与MapR Streams结合使用的简单步骤。 MapR Streams是用于大规模流式传输事件数据的分布式消息传递系统,它已基于Apache Kafka API(0.9.0)集成到MapR融合数据平台中 。
先决条件
- MapR 5.2
- 您可以使用MapR融合数据平台沙盒
- 开发主机上安装的MapR Client
- 吉特
- Maven 3.x或更高版本
创建您的Flink流项目
第一步是创建一个Java应用程序。 最简单的方法是使用flink-quickstart-java原型,其中包含核心依赖关系和打包任务。 本文类似于Apache Flink快速入门示例 ,其中重点明确介绍了MapR Streams的数据输入和输出。
在此应用程序中,我们将创建两个作业:
-
WriteToKafka
:生成随机字符串,并使用Kafka Flink连接器及其Producer API将其发布到MapR Streams主题。 -
ReadFromKafka
:读取相同的主题,并使用Kafka Flink连接器及其使用方在标准输出中输出消息。 API。
完整项目可在GitHub上找到:
让我们使用Apache Maven创建项目:
mvn archetype:generate \
-DarchetypeGroupId=org.apache.flink\
-DarchetypeArtifactId=flink-quickstart-java \
-DarchetypeVersion=1.1.0 \
-DgroupId=com.mapr.demos \
-DartifactId=mapr-streams-flink-demo \
-Dversion=1.0-SNAPSHOT \
-DinteractiveMode=false
Maven将创建以下结构:
$ tree mapr-streams-flink-demo/
mapr-streams-flink-demo/
├── pom.xml
└── src
└── main
├── java
│ └── com
│ └── mapr
│ └── demos
│ ├── BatchJob.java
│ ├── SocketTextStreamWordCount.java
│ ├── StreamingJob.java
│ └── WordCount.java
└── resources
└── log4j.properties
该项目配置为创建一个Jar文件,该文件包含您的Flink项目代码,还包括运行它所需的所有依赖关系。
该项目包含其他一些示例作业。 我们在本文中不需要它们,因此您可以出于教育目的保留它们,也可以将它们从项目中删除。
添加Kafka和MapR流依赖项
打开pom.xml
并将以下依赖项添加到您的项目中:
1-添加MapR Maven存储库
在<repositories>
元素中添加:
<repository>
<id>mapr-releases</id>
<url>http://repository.mapr.com/maven/</url>
<snapshots><enabled>false</enabled></snapshots>
<releases><enabled>true</enabled></releases>
</repository>
2-添加MapR Streams库
在<dependencies>
:
<dependency>
<groupId>com.mapr.streams</groupId>
<artifactId>mapr-streams</artifactId>
<version>5.2.0-mapr</version>
</dependency>
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>0.9.0.0-mapr-1602</version>
</dependency>
3-添加Flink Kafka连接器库
第一步,我们必须添加Flink Kafka连接器作为依赖项,以便我们可以使用Kafka接收器。 将此添加到“依赖项”部分的pom.xml文件中:
您现在必须添加Flink Kafka Connector依赖项才能使用Kafka接收器。 在<dependencies>
元素中添加以下条目:
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-connector-kafka-0.9_2.10</artifactId>
<version>${flink.version}</version>
</dependency>
4-排除Kafka客户端以允许使用MapR Streams客户端
如您所知,MapR Streams使用Kafka 0.9.0 API生成和使用消息。 因此,我们现在需要删除(排除)Apache Kafka Client API,以确保Flink可以使用MapR流。
在Flink Kafka Connector依赖项中,添加以下排除项:
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-connector-kafka-0.9_2.10</artifactId>
<version>${flink.version}</version>
<exclusions>
<exclusion>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka_2.10</artifactId>
</exclusion>
</exclusions>
</dependency>
现在,Flink项目已准备就绪,可以通过Kafka Connector使用DataStream,因此您可以从MapR Streams发送和接收消息。
现在,让我们在MapR中创建一个Stream并编写一些简单的Flink代码以使用它。
创建MapR流和主题
流是主题的集合,您可以通过以下方式将其作为一个组进行管理:
- 设置适用于该流中所有主题的安全策略
- 为流中创建的每个新主题设置默认的分区数
- 为流中每个主题中的消息设置生存时间
您可以在文档中找到有关MapR Streams概念的更多信息。
在您的Mapr群集或沙盒上,运行以下命令:
$ maprcli stream create -path /apps/application-stream -produceperm p -consumeperm p -topicperm p
$ maprcli stream topic create -path /apps/application-stream -topic flink-demo
安装和使用MapR Kafka实用程序
在您的集群上安装mapr-kafka
软件包:
yum install mapr-kafka
打开两个终端窗口,并使用以下命令运行生产者和消费者Kafka实用程序:
制片人
/opt/mapr/kafka/kafka-0.9.0/bin/kafka-console-producer.sh --broker-list this.will.be.ignored:9092 --topic /apps/application-stream:flink-demo=
消费者
/opt/mapr/kafka/kafka-0.9.0/bin/kafka-console-consumer.sh --new-consumer --bootstrap-server this.will.be.ignored:9092 --topic /apps/application-stream:flink-demo
在生产者窗口中,您可以发布一些消息,并在消费者窗口中查看它们。 我们将使用这些工具来跟踪MapR Streams和Flink之间的交互。
编写您的Flink应用程序
现在,让我们使用Flink Kafka Connector将消息发送到MapR Streams并使用它们。
制片人
生产者使用SimpleStringGenerator()
类生成消息,并将该字符串发送到/apps/application-stream:flink-demo
主题。
public static void main(String[] args) throws Exception {
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
Properties properties = new Properties();
// properties.setProperty("bootstrap.servers", "<kafka-broker>:9092"); // not used by MapR Streams
properties.setProperty("streams.buffer.max.time.ms", "200");
DataStream<String> stream = env.addSource(new SimpleStringGenerator());
stream.addSink(new FlinkKafkaProducer09<>("/apps/application-stream:flink-demo", new SimpleStringSchema(), properties));
env.execute();
}
SimpleStringGenerator()
方法代码在此处可用。
主要步骤是:
- 在任何Flink应用程序的基础上创建一个新的
StreamExecutionEnvironment
- 在应用程序环境中创建一个新的
DataStream
时,SimpleStringGenerator
类实现了[SourceFunction](https://ci.apache.org/projects/flink/flink-docs-release-1.1/api/java/)
的基本接口在Flink中流式传输数据源。 - 将
FlinkKafkaProducer09
器添加到流中; 由于MapR Streams基于Kafka API 0.9,因此可以使用FlinkKafkaProducer09类; 有2个小差异:- 由于MapR Streams使用
/opt/mapr/conf/mapr-clusters.conf
类中定义的群集位置,因此不使用代理列表(第一个参数)。
- 由于MapR Streams使用
消费者
使用者只需从/ apps / application-stream:flink-demo主题中读取消息,然后将它们打印到控制台中。
public static void main(String[] args) throws Exception {
// create execution environment
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
Properties properties = new Properties();
// properties.setProperty("bootstrap.servers", "<kafka-broker>:9092"); // not used by MapR Streams
properties.setProperty("group.id", "flink_consumer");
DataStream<String> stream = env.addSource(new FlinkKafkaConsumer09<>(
"/apps/application-stream:flink-demo", new SimpleStringSchema(), properties) );
stream.rebalance().map(new MapFunction<String, String>() {
private static final long serialVersionUID = -6867736771747690202L;
@Override
public String map(String value) throws Exception {
return "Stream Value: " + value;
}
}).print();
env.execute();
}
主要步骤是:
- 创建一个新的
StreamExecutionEnvironment
,它是任何Flink应用程序的基础。 - 使用消费者信息创建一组属性。 在此应用程序中,我们只能设置使用者
group.id
。 请注意,MapR Streams不使用bootstrap.servers
属性,因此无需进行设置。 - 使用
FlinkKafkaConsumer09
从MapR Streams主题获取消息。/apps/application-stream:flink-demo
生成并运行应用程序
让我们直接从Maven(或从您最喜欢的IDE)运行应用程序。
1-建立专案:
$ mvn clean package
2-运行Flink生产者作业
$ mvn exec:java -Dexec.mainClass=com.mapr.demos.WriteToKafka
3-运行Flink消费者工作
$ mvn exec:java -Dexec.mainClass=com.mapr.demos.ReadFromKafka
在终端中,您应该看到生产者生成的消息
现在,您可以在Flink群集上部署并执行此作业。
结论
在本文中,您学习了如何将Flink与MapR Streams结合使用来写入和读取数据流。 关键元素是Maven依赖项的配置,以将项目配置为使用MapR Streams库而不是Kafka库。
翻译自: https://www.javacodegeeks.com/2016/10/getting-started-apache-flink-mapr-converged-data-platform.html