运行flink官网wikiipedia程序问题总结之一步一个脚印儿

 

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值