Apache Flink之架构概述和环境(章节一)

版权声明:未经作者允许,不允许用于任何商业用途 https://blog.csdn.net/weixin_38231448/article/details/89538274

作者:jiangzz 电话:15652034180 微信:jiangzz_wx 微信公众账号:jiangzz_wy

背景介绍

继Spark之后第三代内存计算框架Flink应运而生,Flink作为第三代计算框架Flink吸取了二代大数据Spark计算的设计的精华,依然采用DAG模型做任务拆分,但是Spark在流处理领域上因为微观批处理实时性不高甚至在性能上还不能和一代流处理框架Storm匹敌。因此第三代计算引擎Flink诞生了,主要原因是Flink是一个纯流式计算引擎,而类似于Spark这种微批的引擎,只是Flink流式引擎的一个特例。在这一点上Flink的设计思路恰恰和Spark的实现相反。
如下图所示,Spark的模块和架构栈是基于RDD批处理实现的核心计算引擎,然后是在批处理之上实现了 DStream (微观批处理),所以导致了Spark Streaming在流处理的领域避免不了批处理延迟较高的诟病。
在这里插入图片描述
Apache Flink是一个框架和分布式处理引擎,用于对无界和有界数据流进行状态计算。因此可以看出针对有界数据的计算其实本质就是批处理,对于无界数据就是Flink中的流处理。所以对于Flink而言在实现上是站在流处理的概念上实现批处理,但是Spark计算却是站在批处理的视角上实现流处理。
在这里插入图片描述
不难看出Flink在架构的设计优雅程度上其实和Spark是非常相似的。资源管理上Flink同样可以运行在Standalone和yarn、k8s等,在上层上抽象出 流处理和批处理两个维度数据的处理方式分别处理unbound和bounded数据。并且在DataStream和DateSet API之上均有对应的实现例如SQL处理、CEP-Event (Complex event processing)、MachineLearing等。

Flink 架构

Flink运行时包含两种类型的进程:

  • JobManagers(也称为master)协调分布式执行。他们安排任务,协调检查点,协调故障恢复等。至少有一个Job Manager。高可用性设置将具有多个JobManagers,其中一个始终是leader,其他人处于standby状态。
  • TaskManagers(也称为worker)执行数据流的任务(或更具体地说,子任务),并缓冲和交换数据流。必须始终至少有一个TaskManager。

JobManagers和TaskManagers可以通过各种方式启动:直接在机器上作为standalone方式,在容器中,或由YARN或Mesos等资源框架管理。TaskManagers连接到JobManagers,宣布自己可用,并被分配工作。

Client不是运行时程序执行的一部分,但用于准备数据流并将数据流发送到JobManager。之后,客户端可以断开连接或保持连接以接收进度报告。客户端既可以作为触发执行的Java / Scala程序的一部分运行,也可以在命令行进程中运行./bin/flink run ...

在这里插入图片描述
每个worker(TaskManager)都是一个JVM进程,可以在不同的线程中执行一个或多个子任务。为了控制Worker接受的Task数量,Worker节点运行task slots(at least one)。每个Task Slot代表TaskManager的固定资源子集。例如,具有3个Task Slots的TaskManager将其1/3的托管内存专用于每个task slot.切分资源的目的是为了对一个任务的执行做资源隔离,也就意味着当前任务的执行一旦分配完slot之后,不会被其他job任务侵占。如果一个TaskManager 拥有多个Task Slots意味着更多Sub Tasks 共享同一个JVM。同一JVM中的任务共享TCP连接(通过多路复用)和心跳消息。

在这里插入图片描述
默认情况下,Flink允许子任务共享Task slot,即使它们是不同任务的子任务,只要它们来自同一个job即可。一个Slot槽可以保存Job的的整个工作流程。允许此Task Slots共享有两个主要好处:

  • Flink集群需要与作业中使用的TaskSlots总数。无需计算程序总共包含多少任务。
  • 更好的资源利用率。允许一个job中共享Task Slots 也就意味着系统可以更加充分的使得资源得到合理的利用。没有Task Slot共享,非密集源/ map()子任务将阻止与资源密集型 window subtasks一样多的资源。通过Task slot,将示例中的基本并行性从2增加到6可以充分利用时隙资源,同时确保繁重的子任务在TaskManagers之间公平分配.

在这里插入图片描述

环境搭建

Hadoop环境

  • 设置CentOS进程数和文件数(重启生效)
[root@CentOS ~]# vi /etc/security/limits.conf

* soft nofile 204800
* hard nofile 204800
* soft nproc 204800
* hard nproc 204800

优化linux性能,可能修改这个最大值

  • 配置主机名(重启生效)
[root@CentOS ~]# vi /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=CentOS
[root@CentOS ~]# rebbot
  • 设置IP映射
[root@CentOS ~]# vi /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.239.131 CentOS
  • 防火墙服务
# 临时关闭服务
[root@CentOS ~]# service iptables stop
iptables: Setting chains to policy ACCEPT: filter [  OK  ]
iptables: Flushing firewall rules: [  OK  ]
iptables: Unloading modules: [  OK  ]
[root@CentOS ~]# service iptables status
iptables: Firewall is not running.
# 关闭开机自动启动
[root@CentOS ~]# chkconfig iptables off
[root@CentOS ~]# chkconfig --list | grep iptables
iptables        0:off   1:off   2:off   3:off   4:off   5:off   6:off
  • 安装JDK1.8+
[root@CentOS ~]# rpm -ivh jdk-8u171-linux-x64.rpm 
[root@CentOS ~]# ls -l /usr/java/
total 4
lrwxrwxrwx. 1 root root   16 Mar 26 00:56 default -> /usr/java/latest
drwxr-xr-x. 9 root root 4096 Mar 26 00:56 jdk1.8.0_171-amd64
lrwxrwxrwx. 1 root root   28 Mar 26 00:56 latest -> /usr/java/jdk1.8.0_171-amd64
[root@CentOS ~]# vi .bashrc 
JAVA_HOME=/usr/java/latest
PATH=$PATH:$JAVA_HOME/bin
CLASSPATH=.
export JAVA_HOME
export PATH
export CLASSPATH
[root@CentOS ~]# source ~/.bashrc
  • SSH配置免密
[root@CentOS ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
4b:29:93:1c:7f:06:93:67:fc:c5:ed:27:9b:83:26:c0 root@CentOS
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
|         o   . . |
|      . + +   o .|
|     . = * . . . |
|      = E o . . o|
|       + =   . +.|
|        . . o +  |
|           o   . |
|                 |
+-----------------+
[root@CentOS ~]# ssh-copy-id CentOS
The authenticity of host 'centos (192.168.40.128)' can't be established.
RSA key fingerprint is 3f:86:41:46:f2:05:33:31:5d:b6:11:45:9c:64:12:8e.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'centos,192.168.40.128' (RSA) to the list of known hosts.
root@centos's password: 
Now try logging into the machine, with "ssh 'CentOS'", and check in:

  .ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.
[root@CentOS ~]# ssh root@CentOS
Last login: Tue Mar 26 01:03:52 2019 from 192.168.40.1
[root@CentOS ~]# exit
logout
Connection to CentOS closed.
  • 配置HDFS|YARN

hadoop-2.9.2.tar.gz解压到系统的/usr目录下然后配置[core|hdfs|yarn|mapred]-site.xml配置文件。

[root@CentOS ~]# vi /usr/hadoop-2.9.2/etc/hadoop/core-site.xml

<!--nn访问入口-->
<property>
    <name>fs.defaultFS</name>
    <value>hdfs://CentOS:9000</value>
</property>
<!--hdfs工作基础目录-->
<property>
    <name>hadoop.tmp.dir</name>
    <value>/usr/hadoop-2.9.2/hadoop-${user.name}</value>
</property>

[root@CentOS ~]# vi /usr/hadoop-2.9.2/etc/hadoop/hdfs-site.xml

<!--block副本因子-->
<property>
    <name>dfs.replication</name>
    <value>1</value>
</property>
<!--配置Sencondary namenode所在物理主机-->
<property>
    <name>dfs.namenode.secondary.http-address</name>
    <value>CentOS:50090</value>
</property>
<!--设置datanode最大文件操作数-->
<property>
        <name>dfs.datanode.max.xcievers</name>
        <value>4096</value>
</property>
<!--设置datanode并行处理能力-->
<property>
        <name>dfs.datanode.handler.count</name>
        <value>6</value>
</property>

[root@CentOS ~]# vi /usr/hadoop-2.9.2/etc/hadoop/yarn-site.xml

<!--配置MapReduce计算框架的核心实现Shuffle-洗牌-->
<property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
</property>
<!--配置资源管理器所在的目标主机-->
<property>
    <name>yarn.resourcemanager.hostname</name>
    <value>CentOS</value>
</property>
<!--关闭物理内存检查-->
<property>
        <name>yarn.nodemanager.pmem-check-enabled</name>
        <value>false</value>
</property>
<!--关闭虚拟内存检查-->
<property>
        <name>yarn.nodemanager.vmem-check-enabled</name>
        <value>false</value>
</property>

[root@CentOS ~]# vi /usr/hadoop-2.9.2/etc/hadoop/mapred-site.xml

<!--MapRedcue框架资源管理器的实现-->
<property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
</property>
  • 配置hadoop环境变量
[root@CentOS ~]# vi .bashrc
HADOOP_HOME=/usr/hadoop-2.9.2
JAVA_HOME=/usr/java/latest
CLASSPATH=.
PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop

export JAVA_HOME
export CLASSPATH
export PATH
export M2_HOME
export MAVEN_OPTS
export HADOOP_HOME
export HADOOP_CONF_DIR
export HADOOP_CLASSPATH=$(hadoop classpath)

[root@CentOS ~]# source .bashrc
  • 启动Hadoop服务
[root@CentOS ~]# hdfs namenode -format # 创建初始化所需的fsimage文件
[root@CentOS ~]# start-dfs.sh
[root@CentOS ~]# start-yarn.sh

Flink环境

下载Flink安装文件,并且文件解压到/usr文件夹

[root@CentOS ~]# tar -zxf flink-1.8.0-bin-scala_2.11.tgz -C /usr/

下载地址: http://mirror.bit.edu.cn/apache/flink/flink-1.8.0/flink-1.8.0-bin-scala_2.11.tgz

启动Flink会话

[root@CentOS flink-1.8.0]# ./bin/yarn-session.sh -n 7  -tm 1024 -s 2 -d
...
Flink JobManager is now running on centos:47486 with leader id 00000000-0000-0000-0000-000000000000.
JobManager Web Interface: http://centos:47486

在这里插入图片描述
编写代码

<dependency>
  <groupId>org.apache.hadoop</groupId>
  <artifactId>hadoop-common</artifactId>
  <version>${hadoop.version}</version>
</dependency>
<dependency>
  <groupId>org.apache.hadoop</groupId>
  <artifactId>hadoop-hdfs</artifactId>
  <version>${hadoop.version}</version>
</dependency>
<dependency>
  <groupId>org.apache.flink</groupId>
  <artifactId>flink-scala_${flink.scala.version}</artifactId>
  <version>${flink.version}</version>
</dependency>
<!--插件-->
<plugin>
  <!-- 这是个编译scala代码的 -->
  <groupId>net.alchim31.maven</groupId>
  <artifactId>scala-maven-plugin</artifactId>
  <version>3.2.2</version>
  <executions>
    <execution>
      <id>scala-compile-first</id>
      <phase>process-resources</phase>
      <goals>
        <goal>add-source</goal>
        <goal>compile</goal>
      </goals>
    </execution>
  </executions>
</plugin>
<!-- 数据打包fatjars -->
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-shade-plugin</artifactId>
  <version>2.4.3</version>
  <executions>
    <execution>
      <phase>package</phase>
      <goals>
        <goal>shade</goal>
      </goals>
      <configuration>
        <filters>
          <filter>
            <artifact>*:*</artifact>
            <excludes>
              <exclude>META-INF/*.SF</exclude>
              <exclude>META-INF/*.DSA</exclude>
              <exclude>META-INF/*.RSA</exclude>
            </excludes>
          </filter>
        </filters>
      </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>

编写WorldCount,将程序打包成jar

val env = ExecutionEnvironment.getExecutionEnvironment
env.readTextFile("hdfs://CentOS:9000/demo/words/")
  .flatMap(_.split("\\W+"))
  .map((_,1))
  .groupBy(0)
  .sum(1)
  .print()

执行

[root@CentOS flink-1.8.0]# ./bin/flink run -c com.jiangzz.demo01.TestBatch -m CentOS:59800 -p 3 /root/original-flinkbatch-1.0-SNAPSHOT.jar
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/flink-1.8.0/lib/slf4j-log4j12-1.7.15.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/hadoop-2.9.2/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
2019-04-25 13:29:47,838 INFO  org.apache.flink.yarn.cli.FlinkYarnSessionCli                 - Found Yarn properties file under /tmp/.yarn-properties-root.
2019-04-25 13:29:47,838 INFO  org.apache.flink.yarn.cli.FlinkYarnSessionCli                 - Found Yarn properties file under /tmp/.yarn-properties-root.
Starting execution of program
(day,2)
(a,1)
(demo,1)
(up,1)
(good,2)
(is,1)
(study,1)
(this,1)
Program execution finished
Job with JobID 5b35ef6eb8951510adcf461d6cd5d45f has finished.
Job Runtime: 31367 ms
Accumulator Results:
- a15eb45b31ea5df2e656861d6e7749d4 (java.util.ArrayList) [8 elements]

在这里插入图片描述

Flink Yarn集成原理

在这里插入图片描述
启动新的Flink YARN会话时,客户端首先检查所请求的资源(ApplicationMaster的内存和vcores)是否可用。之后,它将包含Flink和配置的jar上传到HDFS(步骤1)。客户端的下一步是请求YARN容器以启动ApplicationMaster(步骤2、3)。由于客户端将配置和jar文件注册为容器的资源,因此在该特定机器上运行的YARN的NodeManager将负责准备容器(例如,下载文件)。完成后,将启动ApplicationMaster(AM)。JobManager和AM在同一容器中运行。一旦它们成功启动,AM就知道JobManager(它自己的主机)的地址。它正在为TaskManagers生成一个新的Flink配置文件(以便它们可以连接到JobManager)。该文件也上传到HDFS。此外,AM容器还提供Flink的Web界面。 YARN代码分配的所有端口都是临时端口。这允许用户并行执行多个Flink YARN会话。之后,AM开始为Flink的TaskManagers分配容器,这将从HDFS下载jar文件和修改后的配置。完成这些步骤后,即可建立Flink并准备接受作业。

Standalone模式

[root@CentOS flink-1.8.0]# vi conf/flink-conf.yaml

jobmanager.rpc.address: CentOS
# The RPC port where the JobManager is reachable.
jobmanager.rpc.port: 6123

# The heap size for the JobManager JVM
jobmanager.heap.size: 1024m
# The heap size for the TaskManager JVM
taskmanager.heap.size: 1024m
# The number of task slots that each TaskManager offers. Each slot runs one parallel pipeline.
taskmanager.numberOfTaskSlots: 8
# The parallelism used for programs that did not specify and other parallelism.
parallelism.default: 3

[root@CentOS flink-1.8.0]# vi conf/slaves

CentOS

启动Flink集群

[root@CentOS flink-1.8.0]# ./bin/start-cluster.sh

访问web页面
在这里插入图片描述
提交job任务如下:

[root@CentOS flink-1.8.0]# ./bin/flink run -m CentOS:8081 -c com.jiangzz.demo01.TestBatch /root/original-flinkbatch-1.0-SNAPSHOT.jar
Starting execution of program
(day,2)
(a,1)
(demo,1)
(up,1)
(good,2)
(is,1)
(study,1)
(this,1)
Program execution finished
Job with JobID 515fa31d6641100f11a20d37232fff6c has finished.
Job Runtime: 18229 ms
Accumulator Results:
- c9ca57cd45122888fa33e38682138617 (java.util.ArrayList) [8 elements]

更多精彩内容关注

微信公众账号

猜你喜欢

转载自blog.csdn.net/weixin_38231448/article/details/89538274
今日推荐