这将是一套完整详细且持续更新的、长期维护的 原创 Flink系列教程、文档,其中会包含商用实例详解、Flink源码讲解、机制剖析、周边组件讲解等,旨在帮助开发者快速融入Flink开发,或作为工具文档参阅。也希望更多的开发者可以参与到大数据相关的技术讨论中来,共同商讨疑难杂症,丰富社区。——尽际
本文标题: Flink介绍与环境梳理
文章作者: 尽际
发布时间: 2019年07月17日 - 22:27:30
最后更新: 2019年07月22日 - 22:27:30
原始链接: https://www.jianshu.com/p/86d0cbe2f45a
许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。
一、Flink介绍与环境梳理
在这部分系列教程中,暂且略过大数据相关介绍与Flink在生态圈中的定位介绍,毕竟,读者可以通过搜索引擎查阅到大量关于这部分内容的相关说明。因此,我们将直接讲解如何使用 Flink。
为了更好的融入Flink,以及更好的接受这个学习过程,我们将在各种实例中穿插讲解相关必要的知识点。因此,在讲解各种专业概念之前,先开始准备部署一套Flink集群吧。
1.1 选择并下载 Flink 安装包
本系列教程将使用 Apache 编译好的 Flink 软件包进行安装。如有需要,后期也会整理如何针对不同的需求对 Flink 源码进行修改与编译。
1.1.1 重大 Flink 版本介绍
下面将简单介绍几个(截止到2019年07月)最主流的、被使用的Flink版本。这部分内容暂且作为了解即可,后续会慢慢展开介绍。
1. Apache Flink 1.6.4
Flink 1.6.4 是 Flink 1.6.x 系列版本的第 4 次修订版,x所代表的数字一般代表小版本的变动,主要修复一些已知的重要的BUG。包括基于YARN运行Job时容器分配不均、连接器无法正常连接、监控指标异常等。
另外还更新了部分 Maven 依赖如下:
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-java</artifactId>
<version>1.6.4</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-java_2.11</artifactId>
<version>1.6.4</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-clients_2.11</artifactId>
<version>1.6.4</version>
</dependency>
Flink 1.6.4 是 Flink 1.6.x 中最稳定的版本,很多大型企业会根据1.6.4的Flink版本进行定制修改,或业务开发。
2. Apache Flink 1.7.2
在 Flink 1.7.x 系列相比于 Flink 1.6.x 系列,修复了420多个已知问题,并增加很多功能,其中最值得关注的几个重要内容如下:
- 支持 Scala 2.12 API
- 支持写入数据到亚马逊 S3 系统
- 支持处理流式数据时,在 SQL 中使用 MATCH_RECOGNIZE 语法
- 支持时态表(特殊的维度表)以及时态表和流式数据的 JOIN 操作
- 支持通过文件定义 SQL 视图(通过SQL CLI),即通过类似SQL的语法生成Flink Job
- 支持 Kafka 2.0 Connector,并能够实现 EXACTLY_ONCE 语义
在此基础之上,Flink 1.7.2 版本相比于 Flink 1.7.0 又修复了 40 多个已知问题,并同样更新部分 Maven 依赖如下:
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-java</artifactId>
<version>1.7.2</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-java_2.11</artifactId>
<version>1.7.2</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-clients_2.11</artifactId>
<version>1.7.2</version>
</dependency>
3. Apache Flink 1.8.1
在 Flink 1.8.x 系列相比于 Flink 1.7.x 系列,增加的最值得关注的几个重要内容如下:
- 支持连续清理数据分析过程中产生的状态数据
- 支持过滤 Kafka 恢复的分区
- 解绑 Flink 软件包与 Hadoop 二进制包
其中 Flink 1.8.1 变更的 Maven 依赖如下:
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-java</artifactId>
<version>1.8.1</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-java_2.11</artifactId>
<version>1.8.1</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-clients_2.11</artifactId>
<version>1.8.1</version>
</dependency>
并且,原先依赖 flink-table 的开发者需要转向于依赖 flink-table-planner 与 flink-table-api-java-bridge(Java API) 或 flink-table-api-scala-bridge(Scala API)。
额外补充:Flink 1.9.0 的 snapshot 版本已经出炉,目前并非稳定版本,因此暂且不做过多介绍。
1.1.2 下载指定的Flink版本
下面列出了上述各个主流 Flink 版本的下载地址,读者也可自行前往官网进行下载。
- Flink 1.6.4-scala_2.11 with hadoop 2.7
- Flink 1.7.2-scala_2.11 with hadoop 2.7
- Flink 1.8.1-scala_2.11
本系列教程将直接使用最新稳定版 Flink 1.8.1 版本作为实例进行演绎操作。
下载完成后,得到名为 flink-1.8.1-bin-scala_2.11.tgz 的压缩包。
1.1.3 下载指定的Hadoop依赖
在使用Flink的情景中,如果涉及到对 Hadoop 组件的操作,则需要下载对应的jar包。
以 Flink 1.8.1、Hadoop 2.7.x 为例,下载完成 Flink 压缩包后,继续 Hadoop 依赖包,链接如下:
下载完成后,得到名为 flink-shaded-hadoop-2-uber-2.7.5-7.0.jar 的依赖包。
1.2 确认现有的集群环境
在开始安装 Flink 之前,先来确认一下笔者目前所使用的安装环境。
1.2.1 Linux版本与环境筛查
-
虚拟机的配置项
表1-1 列出了三台虚拟机的核心配置。这是目前最关心的几项内容,不再详述其余配置项。
提示:3 台虚拟机的配置均为CentOS 6.8 版本,其与 CentOS 7.x 系列版本的使用方式大同小异,对于操作Flink而言并无分别。如果读者想体验更新的CentOS系统,自行切换即可。
- 表1-1 虚拟机的核心配置项
配置项 | linux01 (第一台虚拟机) | linux02 (第二台虚拟机) | linux03 (第三台虚拟机) |
---|---|---|---|
内存 | 4 GB | 2 GB | 2 GB |
CPU内核数 | 2 | 1 | 1 |
硬盘 | 50 GB | 50 GB | 50 GB |
网络适配器 | NAT | NAT | NAT |
-
禁用SELinux
分布式框架在进行端口通信时,SELinux 有可能阻塞其中的通信,因此暂且将其禁用。 在 CentOS 6.8 中,使用如下命令编辑 SELinux 配置文件:
# vi /etc/sysconfig/selinux00000
并将 SELINUX 选项改为: SELINUX:disable
然后保存退出即可。 -
关闭防火墙
防火墙也可以导致分布式框架之间的通信被拒绝,因此暂且关闭防火墙。
在 CentOS 6.8 系统中,使用如下命令关闭 iptables 防火墙:
# service iptables stop # chkconfig iptables off
提示:在 CentOS 7.x 系统中,用 firewalld 替代了 iptables。关闭防火墙的命令如下:
# systemctl stop firewalld.service # systemctl disable firewalld.service
-
配置网卡文件
为了能够在 Windows 中通过 SSH 终端远程控制虚拟机,并实现分布式框架之间的通信,需
要修改虚拟机的网卡文件。
在 CentOS 6.8 中编辑网卡配置文件的命令如下:
# vi /etc/sysconfig/network-scripts/ifcfg-eth0
编辑内容如下:
# 当前虚拟机的 IP 地址,前三段与网关地址一致 IPADDR=192.168.216.20 # 固定的子网掩码地址 NETMASK=255.255.255.0 # 网关地址,需要与虚拟机 NAT 设置中的网关的 IP 地址一致 GATEWAY=192.168.216.2 # 首选 DNS,设置为网关的 IP 地址即可 DNS1=192.168.216.2 # 备选 DNS,设置为如下即可 DNS2=8.8.8.8 # 设置为静态配置 IP 地址的模式 BOOTPROTO=static # 是否开机自动启动网卡 ONBOOT=yes
编辑完成后,执行以下命令重启网卡:
# service network restart
配置其余两台虚拟机网卡的过程与上述内容基本一致,只需要修改 IPADDR 中 IP 地址的最 后一段,使其不与其他虚拟机重复即可。
-
修改 IP 地址与主机名的映射关系
在 CentOS 6.8 中编辑 network 文件的命令如下:
# vi /etc/sysconfig/network
在本例中,将其修改为如下内容:
192.168.128.20 linux01 192.168.128.21 linux02 192.168.128.22 linux03
-
实现 3 台虚拟机之间的无秘钥访问
集群中各虚拟机之间需要通过 SSH 协议进行无秘钥访问。在配置时请注意,每台虚拟机都可以通过 SSH 协议无秘钥访问本机。 读者可根据如下步骤快速实现无秘钥访问。
下面以第 1 台虚拟机上的操作为例。 首先,执行以下命令生成秘钥:
$ ssh-keygen -t rsa
然后,分发公钥至 3 台虚拟机,执行命令如下:
$ ssh-copy-id linux01; ssh-copy-id linux02; ssh-copy-id linux03;
其他两台虚拟机重复执行上述两个步骤即可。
-
配置 Java 环境变量
本教程采用的 Java 环境是 JDK 1.8 版本,如果读者使用了低于此版本的 JDK,请自行更换, 并在 Linux 的系统变量与用户变量中配置 JDK。
配置样例如下:
JAVA_HOME=/home/admin/modules/jdk1.8.0_121 export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/ lib/tools.jar export PATH=$PATH:$JAVA_HOME/bin
此处省略JDK下载与安装的步骤。
1.2.2 已部署的 Hadoop 相关节点
在生产环境中,大多情况会下,Flink会与Hadoop相关服务配合使用,因此在搭建Flink集群之前,最好已经完成Hadoop相关的服务部署。
表1-2 中列举了虚拟机中已经部署的框架服务。
- 表1-2 已部署的框架服务
框架类别 | linux01(第一台虚拟机) | linux02(第二台虚拟机) | linux03(第三台虚拟机) |
---|---|---|---|
HDFS(Hadoop 2.7.2) | NameNode、DataNode | DataNode | DataNode、SecondaryNameNode |
YARN-MR(Hadoop 2.7.2) | NodeManager、JobHistoryServer | ResourceManager、NodeManager | NodeManager |
Zookeeper | QuorumPeerMain | QuorumPeerMain | QuorumPeerMain |
读者可以参考作者简书中的Hadoop相关文章完成部署。如有需要,也可私信索取并下载 3 台已经完成上述部署配置的虚拟机进行使用。
1.4 本章小结
本章简单介绍了Flink多个版本之间的重要区别,并罗列了稍后搭建Flink集群需要使用的虚拟机环境。在下一章中,将详细演示如何基于不同模式搭建Flink集群。