Maven 3.0.4 (或者更高)
Java 8.x
Flink为了对用户使用Flink进行应用开发进行简化,官方提供了相应的项目模板进行过开发项目,用户不需要自己引入相应的依赖库,同时提供了基于java开发的项目模板和基于scala开发的项目模板。
创建项目主要有两种方式:
注意:
我使用的maven版本是3.6.0, 从3.0以上的版本中,DarchetyoeCatalog配置已经从命令中移除,需要用户在Maven Settings 中进行配置,或者直接将该选项移除,否则可能造成不能生成project的错误。
有些文章中指出:
$ mvn archetype:generate \
-DarchetypeGroupId=org.apache.flink \
-DarchetypeArtifactId=flink-quickstart-java \
-DarchetypeCattalog=https://repository.apache.org/content/repositories/snapshots/ \
-DarchetypeVersion=1.6.0
在maven版本3。0以后, -DarchetypeCattalog 这个参数已经不用。
因此需要采用以下命令:
$ mvn archetype:generate \
-DarchetypeGroupId=org.apache.flink \
-DarchetypeArtifactId=flink-quickstart-java \
-DarchetypeVersion=1.9.0
打包过程中会出现需要你命名groupId和artifactId 对应的填入相应的项目信息。
curl https://flink.apache.org/q/quickstart-SNAPSHOT.sh | bash -s 1.9.1
mvn archetype:generate
-DarchetypeGroupId=org.apache.flink \
-DarchetypeArtifactId=flink-quickstart-scala \
-DarchetypeVersion=1.9.1
打包过程中会出现需要你命名groupId和artifactId 对应的填入相应的项目信息。
curl https://flink.apache.org/q/quickstart-scala-SNAPSHOT.sh | bash -s 1.9.1
curl https://flink.apache.org/q/sbt-quickstart.sh | bash
org.apache.flink
flink-java
${flink.version}
org.apache.flink
flink-streaming-java_2.11
${flink.version}
org.apache.flink
flink-clients_2.11
${flink.version}
org.apache.flink
flink-scala_2.11
${flink.version}
org.apache.flink
flink-streaming-scala_2.11
${flink.version}
package org.myorg.quickstart;
import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.windowing.time.Time;
import org.apache.flink.util.Collector;
/**
* This is Description
*
* @author Jerome丶子木
* @date 2019/12/09
*/
public class WordCount {
public static void main(String[] args) throws Exception{
if (args.length != 2){
System.err.println("Usage:\nSocketTextStreamWordCount ");
return;
}
String hostname = args[0];
Integer port = Integer.parseInt(args[1]);
//设定执行环境设定
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
DataStreamSource stringDataStreamSource = env.socketTextStream(hostname, port);
//对数据集执行转换操作逻辑
DataStream windowCount = stringDataStreamSource.flatMap(new FlatMapFunction() {
@Override
public void flatMap(String value, Collector collector) throws Exception {
String regex = "\\s";
String[] splits = value.toLowerCase().split(regex);
for (String word : splits) {
System.out.println(word);
collector.collect(new WordWithCount(word, 1L));
}
}
})//打平操作,把每行单词转化为类型的数据
.keyBy("word") //针对相同的word数据进行分组
.timeWindow(Time.seconds(2),Time.seconds(1))//指定计算数据的窗口大小和滑动窗口大小
.sum("count");
//把数据打印到控制台
windowCount.print()
.setParallelism(1); //设置并行度1
//flink是懒加载,所以必须使用execute方法,上面才会执行
env.execute("WordCount");
}
public static class WordWithCount{
public String word;
public long count;
public WordWithCount(){}
public WordWithCount(String word, long count){
this.word = word;
this.count = count;
}
@Override
public String toString(){
StringBuilder res = new StringBuilder();
res.append("WordWithCount{ word = '");
res.append(word);
res.append("' , count= ");
res.append(count);
res.append("} ;");
return res.toString();
}
}
}
import org.apache.flink.api.java.utils.ParameterTool
import org.apache.flink.streaming.api.scala.{DataStream, StreamExecutionEnvironment,_}
/**
* This is Description
*
* @author Jerome丶子木
* @date 2019/12/10
*/
object WordCount2 {
def main(args: Array[String]): Unit = {
val params = ParameterTool.fromArgs(args)
//第一步: 设定执行环境设定
val env = StreamExecutionEnvironment.getExecutionEnvironment
//第二步: 指定数据源地址,读取输入数据
val text = env.readTextFile("/Users/jerome/develop/test/text/text1.txt")
//第三部: 对数据集指定转换操作逻辑
val counts: DataStream[(String, Int)] = text
.flatMap(_.toLowerCase.split(","))
.filter(_.nonEmpty)
.map((_, 1))//转换成tuple
.keyBy(0)//按照第一个字段分区
.sum(1)//对第二个字段求和
if (params.has("output")){
counts.writeAsText(params.get("output"))
}else{
println("Printing result to stdout . Use --output to specify output path. ")
counts.print()
}
env.execute("Streaming WordCount")
}
}
原因可能是端口占用,通过命令查看端口是否被占用
sudo lsof -i:9000
//.timeWindow(Time.seconds(2),Time.seconds(1))//指定计算数据的窗口大小和滑动窗口大小
将TypeInfomation类隐式参数引入到当前程序中:
import org.apache.flink.api.scala._