上節是介紹一些概念。下面是具體的例子。
代碼傳至GITHUB 傳送地址
一般都是flink消費kafka的數據來實時統計數據的
引入flink相關jar包
<properties>
<flink.version>1.7.0</flink.version>
<scala.binary.version>2.11</scala.binary.version>
<kafka-clients>2.5.0</kafka-clients>
</properties>
<dependencies>
<!--flink Java相關依賴-->
<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_${scala.binary.version}</artifactId>
<version>${flink.version}</version>
</dependency>
<!--flink連接相關依賴-->
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-connector-filesystem_2.12</artifactId>
<version>${flink.version}</version>
</dependency>
<!--flink 核心包-->
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-core</artifactId>
<version>${flink.version}</version>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
<scope>provided</scope>
</dependency>
<!--kafka -->
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>2.5.0</version>
</dependency>
<!-- flink kafka -->
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-connector-kafka-0.11_${scala.binary.version}</artifactId>
<version>${flink.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.50</version>
</dependency>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>1.2.12</version>
</dependency>
</dependencies>
下面舉個最簡單的例子,統計傳過來的單詞的個數。
public class WordCountMain {
public static void main(String[] args) throws Exception {
// 設置flink的運行環境,這裏會根據本地環境還是生成環境得到不同的對象。
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
//設置並行度1,默認是8
// env.setParallelism(1);
//定義加載或創建數據源(source),監聽9000端口的socket消息
//百度window上安裝 netcat ,裝完之後命令行 執行 nc -L -p 9000
DataStream<String> textStream = env.socketTextStream("localhost", 9000, "\n");
//這裏的輸出類型是String,所以DataStream泛型是String
//map算子是 1對1的 輸入對輸出
//這裏將s封裝前面加了 (index++) + ".您輸入的是:",一般都是轉化爲對象
// DataStream<String> result = textStream.map(s -> (index++) + ".您輸入的是:" + s);
// result.print();
//這裏的輸出類型是String,所以DataStream泛型是String
DataStream<Tuple2<String, Integer>> result2 = textStream.flatMap(new FlatMapFunction<String, Tuple2<String, Integer>>() {
/**
* 這裏是將字符串按字符串分組,再統計字符串的數量輸出
* @param s 輸入類型 string
* @param collector 輸出流 輸出類型 Tuple2<String, Integer>, Tuple2是flink定義的自定義類型,當參數有N個時,就用TopleN,目前最多22個
* @throws Exception
*/
@Override
public void flatMap(String s, Collector<Tuple2<String, Integer>> collector) throws Exception {
String[] splits = s.toLowerCase().split("\\W+");
for (String split : splits) {
if (split.length() > 0) {
collector.collect(new Tuple2<>(split, 1));
}
}
}
}).returns(Types.TUPLE(Types.STRING, Types.INT)).keyBy(0) //根據Tuple2的f0字段分組
.sum(1); //根據Tuple2的f1字段累加
result2.print();
env.execute("WordCount: ");
}
}
測試步驟 將com.shrek.test.flink.wordcount.WordCountMain跑起來,打開命令行 輸入各個字母
輸出結果
這個就是flink的大概計算流程。
一般統計某個實時數據用的,比如當天的交易量,金額,訪問量等等這些實時的數據
flink通過source取得數據(可以是kafka,也可以是日誌,數據庫等),
在通過flink的各個計算因子去map,keyby等操作,
最後將輸出結果實時sick到輸出段(redis,mysql,hbase等)
其他的應用就將輸出結果顯示在前端。