Flink(二)

本文详细介绍了Flink的Standalone和Yarn模式安装步骤,包括集群配置、环境变量设置、启动流程。并展示了如何运行Flink的WordCount示例,包括使用Socket传输数据和Java/Scala代码实现。此外,还探讨了Flink的高可用性(HA)配置,以及JobManager和TaskManager的添加与管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Flink集群搭建

Flink可以选择的部署方式有:
Local、Standalone(资源利用率低)、Yarn、Mesos、Docker、Kubernetes、AWS。

Standalone模式安装

  • 软件要求

Java 1.8.x或更高版本
ssh(必须运行sshd才能使用管理远程组件的Flink脚本)
集群部署规划

节点名称masterworkerzookeeper
bigdata111masterzookeeper
bigdata112masterworkerzookeeper
bigdata113workerzookeeper
  • 解压
    tar -zxvf flink-1.6.1-bin-hadoop28-scala_2.11.tgz -C /opt/module/

  • 修改配置文件
    修改flink/conf/masters,slaves,flink-conf.yaml

[root@bigdata111 conf]$ sudo vi masters
bigdata111:8081
[root@bigdata111 conf]$ sudo vi slaves
bigdata112
bigdata113
[root@bigdata111 conf]$ sudo vi flink-conf.yaml
taskmanager.numberOfTaskSlots:2 //52行
jobmanager.rpc.address: bigdata11 //33行

可选配置
每个JobManager(jobmanager.heap.mb)的可用内存量
每个TaskManager(taskmanager.heap.mb)的可用内存量
每台机器的可用CPU数量(taskmanager.numberOfTaskSlots)
集群中的CPU总数(parallelism.default)和
临时目录(taskmanager.tmp.dirs)

  • 拷贝安装包到各节点
    [root@bigdata111 module]$ scp -r flink-1.6.1/ itstar@bigdata112:pwd
    [root@bigdata111 module]$ scp -r flink-1.6.1/ itstar@bigdata113:pwd
  • 配置环境变量
    配置所有节点Flink的环境变量

**[root@bigdata11 flink-1.6.1]$ vi /etc/profile

export FLINK_HOME=/opt/module/flink-1.6.1
export PATH=$PATH:$FLINK_HOME/bin

[root@bigdata11 flink-1.6.1]$ source /etc/profile**

  • 启动flink
    [root@bigdata111 flink-1.6.1]$ ./bin/start-cluster.sh
    Starting cluster.
    Starting standalonesession daemon on host bigdata11.
    Starting taskexecutor daemon on host bigdata12.
    Starting taskexecutor daemon on host bigdata13.

jps查看进程
在这里插入图片描述

  • WebUI查看
    http://bigdata111:8081

  • 运行测试任务
    [root@bigdata111 flink-1.6.1]$ bin/flink run -m bigdata111:8081 ./examples/batch/WordCount.jar --input /opt/module/datas/word.txt
    [root@bigdata111 flink-1.6.1]$ bin/flink run -m bigdata111:8081 ./examples/batch/WordCount.jar --input hdfs:///LICENSE.txt --output hdfs:///out

  • Flink 的 HA
    首先,我们需要知道 Flink 有两种部署的模式,分别是 Standalone 以及 Yarn Cluster 模式。对于 Standalone 来说,Flink 必须依赖于 Zookeeper 来实现 JobManager 的 HA(Zookeeper 已经成为了大部分开源框架 HA 必不可少的模块)。在 Zookeeper 的帮助下,一个 Standalone 的 Flink 集群会同时有多个活着的 JobManager,其中只有一个处于工作状态,其他处于 Standby 状态。当工作中的 JobManager 失去连接后(如宕机或 Crash),Zookeeper 会从 Standby 中选举新的 JobManager 来接管 Flink 集群。
    对于 Yarn Cluaster 模式来说,Flink 就要依靠 Yarn 本身来对 JobManager 做 HA 了。其实这里完全是 Yarn 的机制。对于 Yarn Cluster 模式来说,JobManager 和 TaskManager 都是被 Yarn 启动在 Yarn 的 Container 中。此时的 JobManager,其实应该称之为 Flink Application Master。也就说它的故障恢复,就完全依靠着 Yarn 中的 ResourceManager(和 MapReduce 的 AppMaster 一样)。由于完全依赖了 Yarn,因此不同版本的 Yarn 可能会有细微的差异。这里不再做深究。

  • 修改配置文件
    修改flink-conf.yaml,HA模式下,jobmanager不需要指定,在master file中配置,由zookeeper选出leader与standby。

#jobmanager.rpc.address: bigdata11
high-availability: zookeeper   //73行

#指定高可用模式(必须) //88行
high-availability.zookeeper.quorum:bigdata111:2181,bigdata112:2181,bigdata113:2181
#ZooKeeper仲裁是ZooKeeper服务器的复制组,它提供分布式协调服务(必须) //82行
high-availability.storageDir: hdfs:///flink/ha/       

#JobManager元数据保存在文件系统storageDir中,只有指向此状态的指针存储在ZooKeeper中(必须) //没有
high-availability.zookeeper.path.root: /flink         

#根ZooKeeper节点,在该节点下放置所有集群节点(推荐) //没有
high-availability.cluster-id:/flinkCluster           

#自定义集群(推荐)
state.backend: filesystem
state.checkpoints.dir: hdfs:///flink/checkpoints
state.savepoints.dir: hdfs:///flink/checkpoints

修改zookeeper/conf/zoo.cfg

server.1=bigdata111:2888:3888
server.2=bigdata112:2888:3888
server.3=bigdata113:2888:3888

修改flink/conf/masters*

bigdata111:8081
bigdata112:8081

修改slaves

bigdata112
bigdata113

同步配置文件conf到各节点

  • 启动HA
    先启动zookeeper集群各节点(测试环境中也可以用Flink自带的start-zookeeper-quorum.sh),启动dfs ,再启动flink
    [root@bigdata111 flink-1.6.1]$ bin/start-cluster.sh
    WebUI查看,这是会自动产生一个主Master,如下
    在这里插入图片描述

  • 验证HA
    手动杀死bigdata12上的master,此时,bigdata11上的备用master转为主mater。

  • 手动将JobManager / TaskManager实例添加到群集
    您可以使用bin/jobmanager.sh和bin/taskmanager.sh脚本将JobManager和TaskManager实例添加到正在运行的集群中。
    添加JobManager
    bin/jobmanager.sh ((start|start-foreground) [host] [webui-port])|stop|stop-all
    添加TaskManager
    bin/taskmanager.sh start|start-foreground|stop|stop-all
    [root@bigdata112 flink-1.6.1]$ jobmanager.sh start bigdata112
    新添加的为从master。

Yarn模式安装

1在官网下载1.6.1版本Flink(https://archive.apache.org/dist/flink/flink-1.6.1/)。
2将安装包上传到要按照JobManager的节点(bigdata11)。
3进入Linux系统对安装包进行解压:(同上)
4修改安装目录下conf文件夹内的flink-conf.yaml配置文件,指定JobManager:(同上)
5修改安装目录下conf文件夹内的slave配置文件,指定TaskManager:(同上)
6将配置好的Flink目录分发给其他的两台节点:(同上)
1.明确虚拟机中已经设置好了环境变量HADOOP_HOME。
2.启动Hadoop集群(HDFS和Yarn)。
3.在bigdata11节点提交Yarn-Session,使用安装目录下bin目录中的yarn-session.sh脚本进行提交:
在yarn-site.xml文件中加入以下配置

<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>5</value>
</property>

/opt/module/flink-1.6.1/bin/yarn-session.sh -n 2 -s 4 -jm 1024 -tm 1024 -nm test -d
其中:
-n(–container):TaskManager的数量。
-s(–slots): 每个TaskManager的slot数量,默认一个slot一个core,默认每个taskmanager的slot的个数为1,有时可以多一些taskmanager,做冗余。
-jm:JobManager的内存(单位MB)。
-tm:每个taskmanager的内存(单位MB)。
-nm:yarn 的appName(现在yarn的ui上的名字)。
-d:后台执行。

  • 启动后查看Yarn的Web页面,可以看到刚才提交的会话
    在这里插入图片描述
  • 在提交Session的节点查看进程:
    在这里插入图片描述
  • 提交Jar到集群运行
    /opt/module/flink-1.6.1/bin/flink run -m yarn-cluster examples/batch/WordCount.jar
  • 提交后在Yarn的Web页面查看任务运行情况
    在这里插入图片描述
  • 任务运行结束后在控制台打印如下输出
    在这里插入图片描述

FlinkWordCount

使用Socket传输数据

[root@bigdata111 flink-1.6.1]# bin/flink run examples/streaming/SocketWindowWordCount.jar --port 9000
#另起一个Xshell客户端
[root@bigdata111 flink-1.6.1]# nc -l 9000
#查看日志输出
[root@bigdata111 flink-1.6.1]# vi log/flink-root-taskexecutor-1-bigdata111.out

Java代码运行WordCount
import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.windowing.time.Time;
import org.apache.flink.util.Collector;

/**
 * @Autho: Administrator and wind
 * @Version: 2019/12/26 & 1.0
 */
public class WordCountStreaming {

    public static void main(String[] args) throws Exception {
        String hostname = "192.168.1.121";
        int port = 9000;

        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        DataStreamSource<String> text = env.socketTextStream(hostname,port,"\n");

        DataStream<WordWithCount> windowCount = text.flatMap(new FlatMapFunction<String, WordWithCount>() {
            @Override
            public void flatMap(String line, Collector<WordWithCount> out) throws Exception {
                for (String word : line.split(" ")){
                    out.collect(new WordWithCount(word,1L));
                }
            }
        }).keyBy("word")//timeWindow(Time size, Time slide)
                .timeWindow(Time.seconds(2),Time.seconds(1))
                .sum("count");

        windowCount.print();
        env.execute("Streaming word count");
    }

    public static class WordWithCount{
        public String word;
        public long count;

        public WordWithCount(){};
        public WordWithCount(String word, long count){
            this.word = word;
            this.count = count;
        }

        public String toString(){
            return "WordWithCount{" +
                    "word='" + word + "\'" +
                    ", count= " + count +
                    "}";
        }

    }

}
Scala代码运行WordCount
import org.apache.flink.streaming.api.scala._
import org.apache.flink.streaming.api.windowing.time.Time

/**
 * @Autho: Administrator and wind
 * @Version: 2019/12/26 & 1.0
 *
 */
object ScalaWordCount {
  def main(args: Array[String]): Unit = {

    val environment = StreamExecutionEnvironment.getExecutionEnvironment;

    val text = environment.socketTextStream("192.168.1.121",9000,'\n');

    val windowCounts = text
        .flatMap(w => w.split(" "))
      .map(w => WordWithCount)
      .keyBy("word")
      .timeWindow(Time.seconds(5),Time.seconds(1))
      .sum("count")

    windowCounts.print()

    environment.execute("scala window")
  }

  case class WordWithCount(word:String, count:Long)


}

注意:导包用的 import org.apache.flink.streaming.api.scala._ 不然会有缺包的BUG

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值