DataStream API Tutorial
一.Setting up a Maven Project
(首先在虚拟机上要先装好maven并配置好setting文件和环境变量)
mvn archetype:generate \
-DarchetypeGroupId=org.apache.flink \
-DarchetypeArtifactId=flink-quickstart-java \
-DarchetypeVersion=1.8.0 \
-DgroupId=wiki-edits \
-DartifactId=wiki-edits \
-Dversion=0.1 \
-Dpackage=wikiedits \
-DinteractiveMode=false
注释:此段代码可在任意文件夹下运行,然后在该文件夹下生成一个maven工程:wiki-edits
$ tree wiki-edits
wiki-edits/
├── pom.xml
└── src
└── main
├── java
│ └── wikiedits
│ ├── BatchJob.java
│ └── StreamingJob.java
└── resources
└── log4j.properties
查看该maven 工程的结构,如果没有安装tree,yum install tree
rm wiki-edits/src/main/java/wikiedits/*.java
删除,自动生成maven工程里的初始Java程序,但并没有把 BatchJob.java 和StreamingJob.java 删除掉。而且后续如果强制删除,在运行jar报的时候会出现找不到相关Java代码的错误,所以还是就这样,不要强制删,否则会报错!!!!!!
接下来配置 pom文件
<dependencies>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-java</artifactId>
<version>${flink.version}</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-java_2.11</artifactId>
<version>${flink.version}</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-clients_2.11</artifactId>
<version>${flink.version}</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-connector-wikiedits_2.11</artifactId>
<version>${flink.version}</version>
</dependency>
</dependencies>
其中 flink.version设为1.7.0
Writing a Flink Program
package wikiedits;
import org.apache.flink.api.common.functions.FoldFunction;
import org.apache.flink.api.java.functions.KeySelector;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.datastream.KeyedStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.windowing.time.Time;
import org.apache.flink.streaming.connectors.wikiedits.WikipediaEditEvent;
import org.apache.flink.streaming.connectors.wikiedits.WikipediaEditsSource;
public class WikipediaAnalysis {
public static void main(String[] args) throws Exception {
//flink程序的第一步见识创建一个流式StreamExecutionEnvironment(或者ExecutionEnvironment批量处理),可以设置
//执行参数并创建从外部系统读取的源
StreamExecutionEnvironment see = StreamExecutionEnvironment.getExecutionEnvironment();
//创建一个从wikiped iRC日志中读取的源,并通过处理Datastream的wilipediaEvent的元素,获得每个在特定长时间窗口中添加或删除的的字节数和用户名,对于键入流
//需要提供一个keySelector
DataStream<WikipediaEditEvent> edits = see.addSource(new WikipediaEditsSource());
//如下所示
KeyedStream<WikipediaEditEvent, String> keyedEdits = edits
.keyBy(new KeySelector<WikipediaEditEvent, String>() {
@Override
public String getKey(WikipediaEditEvent event) {
return event.getUser();
}
});
//我们希望在流上加上窗口,并根据这些窗口中的元素计算结果。窗口指定要在其上执行计算Stream的切片。
//在无限的元素流上计算聚合时需要Windows,所以我们这里采用时间窗口为5秒
DataStream<Tuple2<String, Long>> result = keyedEdits
.timeWindow(Time.seconds(5))//5秒钟翻滚
//调用fold函数 keyedStream->DataStream,具有初始值的被keys化数据流上的“滚动”折叠,将当前数据元与最后折叠的值组合并发出新值,
.fold(new Tuple2<>("", 0L), new FoldFunction<WikipediaEditEvent, Tuple2<String, Long>>() {
@Override
public Tuple2<String, Long> fold(Tuple2<String, Long> acc, WikipediaEditEvent event) {
acc.f0 = event.getUser();
acc.f1 += event.getByteDiff();
return acc;
}
});
result.print();
//所有的操作(例如创建源,转换和接收器)仅构建内部操作的图形。只有在execute(被调用时,才会在集群上抛出或在本地计算机上执行此操作图。)
see.execute();
}
}
运行有两种形式:
1.在IDEA中直接运行
2.打包成jar包,放到本地运行
mvn clean package
$ mvn exec:java -Dexec.mainClass=wikiedits.WikipediaAnalysis
我是直接在IDEA上直接运行的。
奖金练习:在群集上运行并写入Kafka
作为第一步,我们必须添加Flink Kafka连接器作为依赖关系,以便我们可以使用Kafka接收器。将其添加到pom.xml
依赖项部分中的文件:一定要注意这里的kafka的版本是否一致!!!!否则会报错!!!
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-connector-kafka-0.10_2.11</artifactId>
<version>1.7.0</version>
</dependency>
要讲数据写入kafka,则不能直接print(),而是要用flink的函数进行写入kafka.
result
//从一个tuple2转换成一个string流,来使用mapfunction,这样将简单字符串写入kafka更容易
.map(new MapFunction<Tuple2<String,Long>, String>() {
@Override
public String map(Tuple2<String, Long> tuple) {
return tuple.toString();
}
})//创建一个kafka的生产者,指定kafka的主机名和端口号,wiki-result的创建的topic
//FlinkKafkaProducer010(String brokerList, String topicId, SerializationSchema<T> //serializationSchema)
//Creates a FlinkKafkaProducer for a given topic.
.addSink(new FlinkKafkaProducer010<>("localhost:9092", "wiki-result", new SimpleStringSchema()));
打包成jar包,两种方法:
1,在IDEA中maven工程打包
2,在本地maven工程文件夹下 命令行打包
mvn clean package
现在我们准备启动Flink集群并运行写入Kafka的程序。转到安装Flink的位置并启动本地群集:
bin/start-cluster.sh
启动kafka,我的配置是zookeeper是伪分布模式,所以将三台都启动了
./zkServer.sh start
./zkServer.sh status
./zkServer.sh stop
kafka也是伪分布模式
分别启动
bin/kafka-server-start.sh config/server.properties &
创建topic
bin/kafka-topics.sh --create --zookeeper 192.168.188.111:2181 -replication-factor 1 --partition 1 -- topic wiki-result
查看topic list
bin/kafka-topics.sh --list --zookeeper localhost:2181
zookeeper,kafka ,flink 全都启动之后,运行jar包
//bin/flink run -c 包名.主函数名 jar包地址 ,设置好执行路径 否则会报错!!!!
bin/flink run -c wikiedits.WikipediaAnalysis /root/wiki-edits/target/wiki-edits-0.1.jar
把maven工程建立在flink的文件夹下,可直接执行
bin/flink run -c wikiedits.WikipediaAnalysis path/to/wikiedits-0.1.jar
通过使用Kafka控制台使用者检查Kafka主题来观察程序的输出:
bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topic wiki-result
或者在flink的webUI上看程序运行 端口为8081