前置环境

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

flink程序在idea调试_大数据

配置Masters文件

[root@master conf]# vi masters
# 将localhost:8081改为以下内容
master:8081
配置Slaves文件
[root@master conf]# vi slaves
# 文件里有 localhost 的请先删掉
slave1
slave2

flink程序在idea调试_java_02

拷贝配置好的程序到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程序在idea调试_java_03

单机版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).

flink程序在idea调试_java_04

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集群搭建完成