Flink 笔记01:安装部署与快速入门


stypora-copy-images-to: img
typora-root-url: ./


Flink 笔记01:安装部署与快速入门

1602831101602

一、课程回安排与内容提纲

大数据技术框架转折点:2017年,天猫双十一大屏展示,由以前JStorm框架变为Blink(Flink)

Flink 1.10版本,阿里将Blink中模块组件开源融合到Apache Flink中,Flink SQL模块主要就是阿里贡献。

学习Flink分析引擎框架,分为2个部分讲解:

  • 1)、第一个部分、基础部分,核心点:对Flink框架基本使用,原理性东西,七天
  • 2)、第二个部分、项目实战,以Flink框架为主,整合其他大数据框架,进行数据处理分析,10天

1、Flink 基础课程安排

Flink 基础理论的讲解,涉及到各种重要概念、原理和 API 的用法,并且会有大量的示例代码实现:

​ 通过理论和实际的紧密结合,可以使学员对 Flink 有充分的认识和理解,在项目实战中对 Flink 和流式处理应用的场景、以及电商分析业务领域有更深刻的认识;并且通过对流处理原理的学习和与批处理架构的对比,可以对大数据处理架构有更全面的了解,为日后成长为架构师打下基础。

2、今日课程内容提纲

主要讲解Flink框架:基本入门和环境搭建

二、乘风破浪:Flink 概述

官网:https://flink.apache.org/

1611107819211

Apache Flink is a framework and distributed processing engine for stateful computations over *unbounded and bounded* data streams. Flink has been designed to run in all common cluster environments, perform computations at in-memory speed and at any scale.

  • 1)、framework,框架,类似MapReduce和Spark
  • 2)、分布式处理引擎,分布式并行计算框架
  • 3)、stateful computations,处理数据时,有状态的
    • 可以理解,实时词频统计,spark:1,spark:2,spark:3,。。。。
  • 4)、静态数据(批量数据,不变的)和动态数据(流式数据,源源不断产生)

img

在Flink框架中,将数据分为两种类型:有边界数据流(bounded data streams)和无边界数据流(unbound data streams),针对流式数据进行处理,关键点在于流式数据是否有结束点。

  • 1)、有边界数据流(bounded data streams)封装到数据结构:DataSet
  • 2)、无边界数据流(unbound data streams)封装到数据结构:DataStream
    • 类似SparkStreaming中数据结构:DStream

​ Flink 分析引擎,针对数据流进行分析,认为所有数据都是:数据流(Data Streams),可以理解为流式数据。接下来,Flink框架如何实时处理数据流的??

1611109053979

Flink 分析数据时如何进行分布式计算呢???

将Source、Transformation、Sink中每个操作(Operator)设置不同并行度(几个人干活)

1611109267581

三、Flink 安装部署

​ Flink 计算分析引擎,对数据流按照指定逻辑进行计算处理,所以当开发完应用程序以后,运行程序,需要分配资源,目前来说,Flink 程序运行部署与Spark 程序基本一致。

文档:https://ci.apache.org/projects/flink/flink-docs-release-1.10/ops/deployment/cluster_setup.html

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O6nFH0nT-1611842278846)(/img/1611112034402.png)]

企业中开发Flink应用程序,几乎都是运行在Hadoop YARN集群上。

当运行一个Flink Application应用程序时,首先需要给应用程序分配资源,再调度执行与监控。

  • 1)、Flink Client:提交运行Flink 应用程序
  • 2)、JobManager:管理资源,分配资源给Flink应用
  • 3)、TaskManager:运行Task任务的

1611112401441

需要考虑JobManager 高可用,是的用户可以任何时候提交应用执行,架构如下所示:

https://ci.apache.org/projects/flink/flink-docs-release-1.10/ops/jobmanager_high_availability.html#standalone-cluster-high-availability

1611124658608

关于Flink Standalone集群相关配置:

https://ci.apache.org/projects/flink/flink-docs-release-1.10/ops/config.html

实际项目中,如果启动Standalone 集群,如下参数需要考虑配置:

1、the amount of available memory per JobManager (jobmanager.heap.size),

2、the amount of available memory per TaskManager (taskmanager.memory.process.size and check memory setup guide),

3、the number of available CPUs per machine (taskmanager.numberOfTaskSlots),

4、the total number of CPUs in the cluster (parallelism.default) and

5、the temporary directories (io.tmp.dirs)

四、Flink on YANR

在实际项目中,往往将Flink应用程序,运行在YARN集群上,更多好处在于:共享集群资源。

https://ci.apache.org/projects/flink/flink-docs-release-1.10/ops/deployment/yarn_setup.html

1611126483088

  • 1)、Flink YARN Client
    • 提交Flink应用运行到ResourceManager,分配资源和调度执行
  • 2)、JobManager和AppMaster,属于同一个JVM 进程,YARN Contanier容器
    • 向RM申请资源,运行TaskManager;调度执行Task到TaskManager执行
  • 3)、TaskManager,也是一个JVM 进程,YARN Contanier容器
    • 执行Task任务

当Flink on YARN运行时,可以认为在YARN集群资源在中运行Flink Standalone 集群,JobManager和TaskManager运行 YARN Contanier容器中。

  • 提交Flink应用运行到ResourceManager,申请应用管理者,分配资源和调度执行
  • resourcemanager在nodemanager启动一个容器运行appmaster,当appmaster运行完成后会在hdfs上拉取jar包和配置文件然后构建一个jobmanager主节点,当jobmanager构建完成后向resourcemanager请求资源,运行taskmanager,当resourcemanager分配完资源以后,每一个nodemanager会启动一个容器到hdfs上拉取jar包和配置文件,运行task

当Flink 程序运行在YARN上有2种模式:

  • 1)、Session 会话模式(共享集群资源
    • 多个Flink 程序运行在一个集群上(Flink Standalone集群
    • 先启动Flink Standalone集群(在YARN上运行),再提交运行Flink Job程序。

1611127310238

  • 2)、Job 分离模式(独立私有资源

    • 每个Flink应用程序运行,都会运行Flink Standalone集群
    • 此种方式,需要考虑资源浪费

    1611127395085

附录一、创建Maven模块

1)、Maven 工程结构

Maven Project工程GAV三要素:

1602865153921

工程目录结构:

1602865864590

2)、POM 文件内容

​ Maven 工程POM文件中内容(依赖包):

    <repositories>
        <repository>
            <id>apache.snapshots</id>
            <name>Apache Development Snapshot Repository</name>
            <url>https://repository.apache.org/content/repositories/snapshots/</url>
            <releases>
                <enabled>false</enabled>
            </releases>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
    </repositories>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>
        <maven.compiler.source>${java.version}</maven.compiler.source>
        <maven.compiler.target>${java.version}</maven.compiler.target>
        <flink.version>1.10.0</flink.version>
        <scala.version>2.11</scala.version>
        <scala.binary.version>2.11</scala.binary.version>
    </properties>

    <dependencies>
        <!-- Apache Flink 的依赖, 这些依赖项,不应该打包到JAR文件中. -->
        <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-runtime-web_${scala.binary.version}</artifactId>
            <version>${flink.version}</version>
        </dependency>

        <!-- flink操作hdfs,所需要导入该包-->
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-shaded-hadoop-2-uber</artifactId>
            <version>2.7.5-10.0</version>
        </dependency>

        <!-- 添加logging框架, 在IDE中运行时生成控制台输出. -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.7</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
            <scope>runtime</scope>
        </dependency>

    </dependencies>


    <build>
        <sourceDirectory>src/main/java</sourceDirectory>
        <testSourceDirectory>src/test/java</testSourceDirectory>
        <plugins>
            <!-- 编译插件 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.5.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <!--<encoding>${project.build.sourceEncoding}</encoding>-->
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.18.1</version>
                <configuration>
                    <useFile>false</useFile>
                    <disableXmlReport>true</disableXmlReport>
                    <includes>
                        <include>**/*Test.*</include>
                        <include>**/*Suite.*</include>
                    </includes>
                </configuration>
            </plugin>
            <!-- 打jar包插件(会包含所有依赖) -->
            <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>
                            <filters>
                                <filter>
                                    <artifact>*:*</artifact>
                                    <excludes>
                                        <!--
                                        zip -d learn_spark.jar META-INF/*.RSA META-INF/*.DSA META-INF/*.SF -->
                                        <exclude>META-INF/*.SF</exclude>
                                        <exclude>META-INF/*.DSA</exclude>
                                        <exclude>META-INF/*.RSA</exclude>
                                    </excludes>
                                </filter>
                            </filters>
                            <transformers>
                                <transformer
                                        implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <!-- 可以设置jar包的入口类(可选) -->
                                    <!--
                                    <mainClass>com.itcast.flink.batch.FlinkBatchWordCount</mainClass>
                                    -->
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

在Maven Module模块中添加日志属性文件:log4j.properties,内容如下:

# This affects logging for both user code and Flink
log4j.rootLogger=INFO, console

# Uncomment this if you want to _only_ change Flink's logging
#log4j.logger.org.apache.flink=INFO

# The following lines keep the log level of common libraries/connectors on
# log level INFO. The root logger does not override this. You have to manually
# change the log levels here.
log4j.logger.akka=INFO
log4j.logger.org.apache.kafka=INFO
log4j.logger.org.apache.hadoop=INFO
log4j.logger.org.apache.zookeeper=INFO

# Log all infos to the console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p %-60c %x - %m%n

# Suppress the irrelevant (wrong) warnings from the Netty channel handler
log4j.logger.org.apache.flink.shaded.akka.org.jboss.netty.channel.DefaultChannelPipeline=ERROR, console

五、补充

提交程序:

参数传递:

​ flink应用程序,提供解析工具类:parameterTool,要求参数传递: --host node2.itcast.cn --port 9999

ParameterTool 

image-20210128203347402

image-20210128203705482

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

章鱼哥TuNan&Z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值