Flink集群搭建
Flink可以选择的部署方式有:
Local、Standalone(资源利用率低)、Yarn、Mesos、Docker、Kubernetes、AWS。
Standalone模式安装
- 软件要求
Java 1.8.x或更高版本
ssh(必须运行sshd才能使用管理远程组件的Flink脚本)
集群部署规划
节点名称 | master | worker | zookeeper |
---|---|---|---|
bigdata111 | master | zookeeper | |
bigdata112 | master | worker | zookeeper |
bigdata113 | worker | zookeeper |
-
解压
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