flink 框架学习(1)入门

411 阅读3分钟

我正在参与掘金创作者训练营第4期,点击了解活动详情,一起学习吧!

前言

flink是设计来快速处理数据流的一种大数据组件,在新的大数据处理大环境下,分布式以及流处理是无法绕过的重中之重。本系列旨在简单的讨论和研究一下flink的使用和源码原理。

环境

首先flink 需要java环境,因为flink是由java和scala两种语言来支持完成的。在电脑上可以使用命令查看一下java的环境

$ java -version

看到这样的回复就表示环境是准备好的。

image.png 最新版本的flink官网上提示需要java版本 jdk11 。

然后可以上官网下载flink的jar包 下载地址, 然后解压缩这个软件包。可以看见目录如下

image.png 直接使用命令bash启动flink或者直接点击运行sh

$ bash start-cluster.sh

注意如果使用sh 可能会导致这种异常

flink-1.14.3/bin/config.sh: line 32: `    done < <(find "$FLINK_LIB_DIR" ! -type d -name '*.jar' -print0 | sort -z)'

这种异常的原因是因为 这个文件不支持sh的文本格式有语法错误。

简单点击localhost:8081地址就可以访问flink的web ui

WeChat3454a0c5083f7672d91fcf7b0bd31025.png

第一个jar

在刚刚的下载文件地址可以找到一个example文件夹,点击 add new 按钮 上传到服务器

image.png 直接submit,参数都可以不填,然后查看一下结果

image.png 这样就执行成功了。 具体的执行结果和日志可以在log里面查看

WeChat6f27bb61817591d4a46f48f8bb8fb9b4.png

如何自己打包自己的代码

首先在maven文件中添加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>
<dependency>
   <groupId>org.apache.flink</groupId>
   <artifactId>flink-clients_${scala.binary.version}</artifactId>
   <version>${flink.version}</version>
</dependency>

然后修改文件build的配置:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>2.3</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <createDependencyReducedPom>false</createDependencyReducedPom>
                        <transformers>
                            <transformer
                                    implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                <resource>META-INF/spring.handlers</resource>
                            </transformer>
                            <transformer
                                    implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                <resource>META-INF/spring.schemas</resource>
                            </transformer>
                            <transformer
                                    implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                <mainClass>${application}</mainClass>
                            </transformer>
                        </transformers>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>8</source>
                <target>8</target>
            </configuration>
        </plugin>
    </plugins>
    <pluginManagement>
        <plugins>
            <plugin>
                <artifactId>maven-clean-plugin</artifactId>
                <version>3.1.0</version>
            </plugin>
            <plugin>
                <artifactId>maven-resources-plugin</artifactId>
                <version>3.0.2</version>
            </plugin>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.0</version>
            </plugin>
            <plugin>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.22.1</version>
            </plugin>
            <plugin>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.0.2</version>
            </plugin>
            <plugin>
                <artifactId>maven-install-plugin</artifactId>
                <version>2.5.2</version>
            </plugin>
            <plugin>
                <artifactId>maven-deploy-plugin</artifactId>
                <version>2.8.2</version>
            </plugin>
            <plugin>
                <artifactId>maven-site-plugin</artifactId>
                <version>3.7.1</version>
            </plugin>
            <plugin>
                <artifactId>maven-project-info-reports-plugin</artifactId>
                <version>3.0.0</version>
            </plugin>
        </plugins>
    </pluginManagement>
</build>

然后简单修改一下官方的例子,主要是改一下文件的地址,这个代码的内容就和上文的例子完全一致。

public class WordCount {

    public static void main(String[] args) throws Exception{
        // 创建执行环境
        ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();

        // 从文件中读取数据
        String inputPath = "xxx/Document/1.txt";
        //这里和spark很相似了
        DataSet<String> inputDataSet = env.readTextFile (inputPath);

        // 对数据集进行处理,按空格分词展开,转换成(word, 1)二元组进行统计
        DataSet<Tuple2<String, Integer>> resultSet = inputDataSet.flatMap(new MyFlatMapper())
                .groupBy(0)   // 按照第一个位置的word分组
                .sum(1);    // 将第二个位置上的数据求和
        resultSet.print();
    }

    // 自定义类,实现FlatMapFunction接口
    public static class MyFlatMapper implements FlatMapFunction<String, Tuple2<String, Integer>>
    {
        public void flatMap(String value, Collector<Tuple2<String, Integer>> out) throws Exception {
            // 按空格分词
            String[] words = value.split(" ");
            // 遍历所有word,包成二元组输出
            for (String word : words) {
                out.collect(new Tuple2<String,Integer>(word, 1));
            }
        }
    }
}

点击maven的package或者使用命令 mvn-package 即可打包jar文件,注意要上传with-denpendencies这个版本的jar,这个版本的jar包里有打包进去的依赖文件。

image.png

然后我们就可以启动运行这个自制的wordcout jar了,启动以后的运行结果与官方的jar结果输出完全的一致。

WeChat518dc0116813cef4c8bc0744a195326b.png 其中重要的一句代码

final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment().setRuntimeMode(RuntimeExecutionMode.STREAMING);

这个代码的功能就是区分和建立执行环境

//流处理环境,支持flink所有功能,所有的检查点,处理事件都将启用
STREAMING,
//使用批处理语义
BATCH,
//用于无界数据源
AUTOMATIC

在代码中可以清晰的阅读到,flink是一种支持流批一体化的大数据工具。

总结

今天我们实验了如何在电脑上部署一个简单的standlone的单机flink系统,以及如何编写自定义jar,配置自定义的jar的maven ,以及包括如何上传以及查看运行结果。flink的关键点还在于他强大的扩展能力,窗口能力,以及计算方式选择的灵活度。只要简单的使用flink的各种function就可以构建自己的计算系统。在flink新支持的sql系统还可以在不更改代码的情况下,简单的修改自己的计算系统的功能支持。