flink从入门到放弃(二)flink demo 之 wordcount

flink windows/linux demo

    • 环境准备
    • maven依赖管理
    • maven打包配置
    • java代码
    • 打包以及运行
    • 结果

环境准备

  • linux/window 安装jdk1.8
  • 安装 maven 记得要改成阿里镜像,可以增加下载速度,具体修改过程见上篇文章
  • 安装 netcat window直接下载解压即可,64位电脑运行32位版本也可以的。linux不同版本命令不一样,ubuntu的命令是sudo apt-get -y install netcat-traditional
  • idea或者eclipse,建议idea
  • 下载flink windows环境直接到官网下载,linux下 wget http://mirrors.tuna.tsinghua.edu.cn/apache/flink/flink-1.9.1/flink-1.9.1-bin-scala_2.11.tgz ,下载后解压
  • flink解压后最好添加路径,这样方便后续执行命令

maven依赖管理

我使用的是IDEA,新建一个maven工程即可,一路默认,自己取一个工程名字即可。在pom.xml内的project标签内添加以下依赖和打包配置。

<dependencies>

        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-java</artifactId>
            <version>1.9.1</version>
            <scope>provided</scope>
        </dependency>
        
<!--因为我上面下载的是flink-1.9.1-bin-scala_2.11.tgz-->
<!--所以这里填flink-streaming-java_2.11,下面也一样,注意scala版本号-->
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-streaming-java_2.11</artifactId>
            <version>1.9.1</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-clients_2.11</artifactId>
            <version>1.9.1</version>
            <scope>provided</scope>
        </dependency>

  <!--下面是打印日志的,可以不加-->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.25</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.25</version>
        </dependency>

    </dependencies>

maven打包配置

<build>
        <plugins>
 <!--下面是打出带依赖包的jar包的配置,不可少-->
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

java代码

这是官网的demo,但我加上了详细的注释,看完注释,应该可以对flink有个初步的了解了。


import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.common.functions.ReduceFunction;
import org.apache.flink.api.java.utils.ParameterTool;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.windowing.time.Time;
import org.apache.flink.util.Collector;

public class FlinkDemo {

    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() {
            return word + " : " + count;
        }

    }

    // 这是一个基于DataStream API的 flink的典型的流处理demo
    // 后面的文章还会提到用于批处理的DataSet API 和用于查询的 Table API
    public static void main(String[] args) throws Exception{
        final String hostname;
        final int port;
        try {
            final ParameterTool params = ParameterTool.fromArgs(args);
            hostname = params.has("hostname") ? params.get("hostname") : "localhost";
            port = params.has("port") ? params.getInt("port"):9000;
        } catch (Exception e) {
            System.err.println("建议指定hostname和port");
            return;
        }
        // get the execution environment
        //通常getExecutionEnvironment即可,可以根据具体环境进行选择。
        // 也可以创建本地或者远程环境createLocalEnvironment()和createRemoteEnvironment(String host,int port,String和.jar文件)
        //这是流处理入口,批处理使用ExecutionEnvironment
        final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        // get input data by connecting to the socket,
        // 基于Socket的 DataStream API socketTextStream(hostName,port,delimiter,maxRetry)
        // 该函数第三个参数的意思是分隔符,第四个是获取数据的最大尝试次数,这两个参数是可选参数
        // 此外,还有基于file的DataStream API readTextFile(String path) 基于Collection的API等,会在后面的文章中细说
        DataStream<String> text = env.socketTextStream(hostname, port, "\n");
        //可以把text打印出来验证后面的计算对不对
        text.print();
        // parse the data, group it, window it, and aggregate the counts
        DataStream<WordWithCount> windowCounts = text.flatMap(
                new FlatMapFunction<String, WordWithCount>() {
                    public void flatMap(String value, Collector<WordWithCount> out) {
                        //利用正则表达式以一个以上空格进行划分
                        for (String word : value.split("\\s+")) {
                            out.collect(new WordWithCount(word, 1L));
                        }
                    }
                })
                .keyBy("word")
                .timeWindow(Time.seconds(5))
                .reduce(new ReduceFunction<WordWithCount>() {
                    public WordWithCount reduce(WordWithCount a, WordWithCount b) {
                        return new WordWithCount(a.word, a.count + b.count);
                    }});
        // print the results with a single thread, rather than in parallel
        //并行度,后续文章会详细解释 slot,slot与Parallelism的关系
        windowCounts.print().setParallelism(1);
        //flink在内存管理分配方案上,Memory Manage pool部分默认是懒加载,需显示调用执行
        env.execute("Socket Window WordCount");
    }
}

打包以及运行

  1. 打包命令 mvn clean package 如果执行成功,则会在工程目录的target目录下出现一个XXX-1.0-SNAPSHOT-jar-with-dependencies.jar 包
  2. windows 上的运行步骤,
    • flink/bin下寻找脚本start-cluster.bat,运行,即会弹出两个java黑框,一个是jobmanager,一个是taskmanager。
    • 在netcat解压目录下,打开cmd(powershell),运行nc.exe -lp 9000
    • 在flink/bin下另起一个powershell, 执行以下命令 flink run -j E:\jar包路径\XXX-1.0-SNAPSHOT-jar-with-dependencies.jar --class com.xxx.FlinkDemo --port 9000 --hostname localhost
    • 上面命令中 -j 后面带可执行jar包 -c(–class) 后面带程序入口类,即main方法所在类
    • 执行完成后,会出现Starting execution of program字样,即成功
    • 然后再在nc运行的powershell中随意输入字符,单词
    • 即可在jobmanager所在的powershell框中看到输出,记住,不是执行flink命令的powershell框
  3. linux上的运行步骤
    • flink/bin 下执行start-cluster.sh, 运行结果见后面截图
    • 使用netcat造测试数据,linux下命令和windows不一样,nc -l 9000
    • rz上传XXX-1.0-SNAPSHOT-jar-with-dependencies.jar 包
    • flink run -j ./flink-1.0-SNAPSHOT-jar-with-dependencies.jar -c com.xxx.FlinkDemo --port 9000 --hostname 127.0.0.1
    • 这个任务提交命令和windows下是一样的
    • 接着就在netcat窗口下输入测试字符串
    • 查看结果的地方在flink/log/flink-bd-taskexecutor-X-XXXX.out,不是直接在控制台看结果

结果

  • windows环境下的运行结果
    flink从入门到放弃(二)flink demo 之 wordcount_第1张图片
  • linux下的结果
    flink从入门到放弃(二)flink demo 之 wordcount_第2张图片
    netcat测试数据

flink从入门到放弃(二)flink demo 之 wordcount_第3张图片

你可能感兴趣的:(大数据)