前置环境
Hadoop集群必须部署完成,如果还没有搭建请先前往>>Hadoop全分布搭建笔记
程序版本
scala-2.11.8 flink-1.10.2-bin-scala_2.11
组件介绍
Flink是一个面向数据流处理和批量数据处理的可分布式的开源计算框架,它基于同一个Flink流式执个独立的开源框架行模型(streaming execution model),能够支持流处理和批处理两种应用类型。由于流处理和批处理所提供的SLA(服务等级协议)是完全不相同,流处理一般需要支持低延迟、Exactly-once保证,而批处理需要支持高吞吐、高效处理,所以在实现的时候通常是分别给出两套实现方法,或者通过一来实现其中每一种处理方案。比较典型的有:实现批处理的开源方案有MapReduce、Spark;实现流处理的开源方案有Storm;Spark的Streaming 其实本质上也是微批处理。
操作流程
上传 Scala & Flink
使用FTP工具(xftp)上传Scala和Flink的程序包到master
[root@master ~]# ls
flink-1.10.2-bin-scala_2.11.tgz scala-2.11.8.tgz
解压Scala & Flink
[root@master ~]# tar xf scala-2.11.8.tgz -C /usr/local/src/
[root@master ~]# tar xf flink-1.10.2-bin-scala_2.11.tgz -C /usr/local/src/
# 解压后,cd进入解压目录
[root@master ~]# cd /usr/loal/src/
[root@master src]# ls
flink-1.10.2 hadoop jdk scala-2.11.8
# 修改文件夹名称
[root@master src]# mv scala-2.11.8/ scala
[root@master src]# mv flink-1.10.2/ flink
[root@master src]# ls
flink hadoop jdk scala
配置环境变量
使环境变量仅对root用户生效,编辑root用户的环境变量
[root@master src]# vi /root/.bash_profile
修改后的文件状态
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
export JAVA_HOME=/usr/local/src/jdk
export HADOOP_HOME=/usr/local/src/hadoop
export SCALA_HOME=/usr/local/src/scala
export FLINK_HOME=/usr/local/src/flink
PATH=$PATH:$HOME/bin:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$SCALA_HOME/bin:$FLINK_HOME/bin
export PATH
生效环境变量
[root@master src]# source /root/.bash_profile
配置Flink
进入Flink配置目录:cd /usr/local/src/flink/conf/
编辑Flink配置文件:vi flink-conf.yaml
flink-conf.yaml中配置key: value时候在“:”后面需要有一个空格,否则配置不会生效
# 修改主节点名称 (主机名或IP地址都可)
jobmanager.rpc.address: master
# 添加hadoop的配置文件目录
fs.hdfs.hadoopconf: /usr/local/src/hadoop/etc/hadoop
# 添加hdfs配置文件路径,用于访问hdfs系统
fs.hdfs.hdfssite: /usr/local/src/hadoop/etc/hadoop/hdfs-site.xml
配置Masters文件
[root@master conf]# vi masters
# 将localhost:8081改为以下内容
master:8081
配置Slaves文件
[root@master conf]# vi slaves
# 文件里有 localhost 的请先删掉
slave1
slave2
拷贝配置好的程序到slave:scp网络拷贝命令 -r 拷贝文件夹
# 拷贝Scala环境
[root@master ~]# scp -r /usr/local/src/scala/ slave1:/usr/local/src/
……
[root@master ~]# scp -r /usr/local/src/scala/ slave2:/usr/local/src/
……
# 拷贝Flink环境
[root@master ~]# scp -r /usr/local/src/flink/ slave1:/usr/local/src/
……
[root@master ~]# scp -r /usr/local/src/flink/ slave2:/usr/local/src/
……
# 拷贝环境变量
[root@master ~]# scp /root/.bash_profile slave1:/root/
.bash_profile 100% 304 308.9KB/s 00:00
[root@master ~]# scp /root/.bash_profile slave2:/root/
.bash_profile 100% 304 352.9KB/s 00:00
切换到slave服务机,生效环境变量
[root@slave1 ~]# source /root/.bash_profile
[root@slave2 ~]# source /root/.bash_profile
启动Flink集群
[root@master ~]# start-cluster.sh
Starting cluster.
Starting standalonesession daemon on host master.
Starting taskexecutor daemon on host slave1.
Starting taskexecutor daemon on host slave2.
异常情况:JDK版本低于1.8
Exception in thread "main" java.lang.UnsupportedClassVersionError: org/apache/flink/runtime/entrypoint/StandaloneSessionClusterEntrypoint : Unsupported major.minor version 52.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:482)
查看集群状态
查看Flink进程状态:jps
master
[root@master ~]# jps
5633 SecondaryNameNode
6565 StandaloneSessionClusterEntrypoint
6613 Jps
5350 NameNode
5479 DataNode
5895 NodeManager
5775 ResourceManager
[root@slave1 ~]# jps
10214 Jps
9641 DataNode
9737 NodeManager
10169 TaskManagerRunner
[root@slave2 ~]# jps
9627 DataNode
9723 NodeManager
10204 Jps
10158 TaskManagerRunner
查看Spark Web页面状态(master IP地址加上8081端口):172.16.2.11:8081
单机版Flink
如需使用单机版Flink,请先停止前面已经开启的集群版Flink,命令:stop-cluster.sh
[root@master conf]# start-scala-shell.sh local
Starting Flink Shell:
Starting local Flink cluster (host: localhost, port: 8081).
Connecting to Flink cluster (host: localhost, port: 8081).
NOTE: Use the prebound Execution Environments and Table Environment to implement batch or streaming programs.
Batch - Use the 'benv' and 'btenv' variable
* val dataSet = benv.readTextFile("/path/to/data")
* dataSet.writeAsText("/path/to/output")
* benv.execute("My batch program")
*
* val batchTable = btenv.fromDataSet(dataSet)
* btenv.registerTable("tableName", batchTable)
* val result = btenv.sqlQuery("SELECT * FROM tableName").collect
HINT: You can use print() on a DataSet to print the contents or collect()
a sql query result back to the shell.
Streaming - Use the 'senv' and 'stenv' variable
* val dataStream = senv.fromElements(1, 2, 3, 4)
* dataStream.countWindowAll(2).sum(0).print()
*
* val streamTable = stenv.fromDataStream(dataStream, 'num)
* val resultTable = streamTable.select('num).where('num % 2 === 1 )
* resultTable.toAppendStream[Row].print()
* senv.execute("My streaming program")
HINT: You can only print a DataStream to the shell in local mode.
scala>
至此——Flink集群搭建完成