大數據(二)flink 2 代碼demo

上節是介紹一些概念。下面是具體的例子。

代碼傳至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等)

其他的應用就將輸出結果顯示在前端。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章