Flink三种运行方式:Local、Standalone、On Yarn。成功部署后分别用Scala和Java实现wordcount
版本:Flink 1.7.X
集群环境:Hadoop2.6
开发工具: IntelliJ IDEA
解压:tar -zxvf flink-1.7.X-bin-hadoop26-scala_2.11.tgz
cd flink-1.7.x
启动:./bin/start-cluster.sh
停止:./bin/stop-cluster.sh
可以通过master:8081监控集群状态
集群安装
1:修改conf/flink-conf.yaml
jobmanager.rpc.address: masterip
2:修改conf/slaves
slaveip1
slaveip2
3:拷贝到其他节点
scp -rq /usr/local/flink-1.7.x slaveip1:/usr/local
scp -rq /usr/local/flink-1.7.x slaveip2:/usr/local
4:在masterip(master)节点启动
bin/start-cluster.sh
5:访问http://masterip:8081
On Yarn实现逻辑
On Yarn实现逻辑
On Yarn实现逻辑
启动一个一直运行的flink集群
./bin/yarn-session.sh -n 2 -jm 1024 -tm 1024 [-d]
附着到一个已存在的flink yarn session
./bin/yarn-session.sh -id application_1463870264508_0029
执行任务
./bin/flink run ./examples/batch/WordCount.jar -input hdfs://masterip:9000/LICENSE -output hdfs://masterip:9000/wordcount-result.txt
停止任务 【web界面或者命令行执行cancel命令】
启动集群,执行任务
./bin/flink run -m yarn-cluster -yn 2 -yjm 1024 -ytm 1024 ./examples/batch/WordCount.jar
注意:client端必须要设置YARN_CONF_DIR或者HADOOP_CONF_DIR或者HADOOP_HOME环境变量,通过这个环境变量来读取YARN和HDFS的配置信息,否则启动会失败
[root@hadoop2 flink-1.5.0]# bin/yarn-session.sh -h
Usage:
Required
-n,--container 为YARN分配容器的数量 (=Number of Task Managers)
Optional
-D 动态属性
-d,--detached 以分离模式运行作业
-h,--help Yarn session帮助.
-id,--applicationId 连接到一个正在运行的YARN session
-j,--jar Flink jar文件的路径
-jm,--jobManagerMemory JobManager的内存大小,driver-memory [in MB]
-m,--jobmanager Address of the JobManager (master) to which to connect. Use this flag to connect to a different JobManager than the one specified in the configuration.
-n,--container TaskManager的数量,相当于executor的数量
-nm,--name 设置YARN应用自定义名称
-q,--query 显示可用的YARN资源 (memory, cores)
-qu,--queue 指定YARN队列
-s,--slots 每个JobManager的core的数量,executor-cores。建议将slot的数量设置每台机器的处理器数量
-st,--streaming 在流模式下启动Flink
-t,--ship 在指定目录中传送文件(t for transfer)
-tm,--taskManagerMemory 每个TaskManager的内存大小,executor-memory [in MB]
-yd,--yarndetached 如果存在,则以分离模式运行作业 (deprecated; use non-YARN specific option instead)
-z,--zookeeperNamespace 为高可用性模式创建Zookeeper子路径的命名空间
用法: run [OPTIONS]
"run" 操作参数:
-c,--class 如果没有在jar包中指定入口类,则需要在这里通过这个参数指定
-m,--jobmanager 指定需要连接的jobmanager(主节点)地址
使用这个参数可以指定一个不同于配置文件中的jobmanager
-p,--parallelism 指定程序的并行度。可以覆盖配置文件中的默认值。
使用run 命令向yarn集群提交一个job。客户端可以确定jobmanager的地址。当然,你也可以通过-m参数指定jobmanager。jobmanager的地址在yarn控制台上可以看到。
Scala实现代码
package com.skyell
import org.apache.flink.api.java.utils.ParameterTool
import org.apache.flink.streaming.api.scala.StreamExecutionEnvironment
import org.apache.flink.streaming.api.windowing.time.Time
/**
* 滑动窗口计算
*
* 每隔1秒统计最近2秒数据,打印到控制台
*/
object SocketWindowWordCountScala {
def main(args: Array[String]): Unit = {
// 获取socket端口号
val port: Int = try{
ParameterTool.fromArgs(args).getInt("port")
}catch {
case e: Exception => {
System.err.println("No port set use default port 9002--scala")
}
9002
}
// 获取运行环境
val env: StreamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment
// 连接socket获取数据
val text = env.socketTextStream("master", port, '\n')
//添加隐式转换,否则会报错
import org.apache.flink.api.scala._
// 解析数据(把数据打平),分组,窗口计算,并且聚合求sum
val windowCount = text.flatMap(line => line.split("\\s"))
.map(w => WordWithCount(w, 1))
.keyBy("word") // 针对相同word进行分组
.timeWindow(Time.seconds(2), Time.seconds(1))// 窗口时间函数
.sum("count")
windowCount.print().setParallelism(1) // 设置并行度为1
env.execute("Socket window count")
}
// case 定义的类可以直接调用,不用new
case class WordWithCount(word:String,count: Long)
}
Java实现代码
package com.skyell;
import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.java.DataSet;
import org.apache.flink.api.java.ExecutionEnvironment;
import org.apache.flink.api.java.operators.DataSource;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.util.Collector;
public class BatchWordCountJava {
public static void main(String[] args) throws Exception{
String inputPath = "D:\\DATA\\file";
String outPath = "D:\\DATA\\result";
// 获取运行环境
ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
// 读取本地文件中内容
DataSource text = env.readTextFile(inputPath);
// groupBy(0):从0聚合 sum(1):以第二个字段加和计算
DataSet> counts = text.flatMap(new Tokenizer()).groupBy(0).sum(1);
counts.writeAsCsv(outPath, "\n", " ").setParallelism(1);
env.execute("batch word count");
}
public static class Tokenizer implements FlatMapFunction>{
public void flatMap(String value, Collector> out) throws Exception {
String[] tokens = value.toLowerCase().split("\\W+");
for (String token: tokens
) {
if(token.length()>0){
out.collect(new Tuple2(token, 1));
}
}
}
}
}
pom依赖配置
org.apache.flink
flink-java
1.7.0
provided
org.apache.flink
flink-streaming-java_2.11
1.7.0
provided
org.apache.flink
flink-scala_2.11
1.7.0
provided
org.apache.flink
flink-streaming-scala_2.11
1.7.0
provided