Spark生态圈
spark core 批计算 取代了MR spark streaming 流计算 取代了storm(没有自己的生态圈,所以不火) spark sql spark mlib 机器学习
问:spark core为什么会取代MR?spark计算速度为什么比MR快?
1. spark申请资源是粗粒度的资源申请(所有task执行完毕executor才会关闭,有利有弊,有些浪费机器资源),MR是细粒度调用,每一个task都会启动一个jvm,完事就关掉 2. Spark基于内存计算 cache persist (内存计算,pipeline操作 (怕波兰))
申请资源细粒度和粗粒度资源调用的区别以及利弊?
1.粗粒度 缺点:后台一直占用资源,端口4040 优点:只申请资源一次,跑task任务的时候不需要重新拉取,用空间换时间
2.细粒度 缺点:每次都需要申请资源,比较耗时 优点:由JVM管理,每次跑完任务,释放资源
请问map和filter如何打印
val rdd = sc.textFile("path") val rddMap = rdd.map( x=> { println("map" + x) x }) val filterRDD = rddMap.filter(x =>{ println("filter" + x) true }) filterRDD.count(); 答:map和filter交替打印 原理: filter(map(textFile)) RDD不存数据,只存计算逻辑,里面的task每次取一条数据,管道操作,所以从文件拿一条数据打印map 在打印filter,循环交替
sparkStriming流式计算缺点
批计算 无限的缩小 微批,时间足够短就成了流计算 实时性很差 流计算默认情况下无状态 batch 有状态的计算(需要我们找地方存储) updateStateByKey
什么是flink?
分布式有状态的计算引擎,他主要能够计算*数据流和有界的数据流,简单来说也能批计算也能流计算
1.UnBounded streams *计算 有开始时间,无结束时间,比如用户日志
2.Bounded streams 有界,有开始时间,有结束时间(可以自己定时间)
3.stateful compulation state可以放内存、磁盘、state状态可以关联上下文
SparkStreaming主要是批计算,认为流计算是批计算中特殊情况,无限压榨缩小时间范围
Fink主要是流计算,默认批计算是流计算中特殊情况,要卡住结束时间就可以有界批量计算
Flink特点和优势
1. 支持高吞吐、低延迟、高性能 2. 支持事件,结合watermark处理乱序数据 3. 支持有状态计算,并且支持多种状态 可以存放到内存、文件、RocksDB 4. 支持高度灵活的窗口(window)操作 time、count、session 5. 基于轻量级分布式快照(checkpoint)实现的容错 保证exactly-once语义 6. 基于JVM实现独立的内存管理 7. Save Points(保存点) 方便代码升级
spark集群(master-slave架构)和 Fink集群 (master-slave架构)
Master:(master) 管理集群中的所有worker,进而管理了集群资源 worker:(slave) worker管理各个节点上的资源(mem core) worker_memory 1G worker_cores 2 Driver:任务调度 --executor-cores 2 JobManager(master)相当于saprk的master+driver,既负责资源调度,又负责任务调度 TaskManager(slave) 1.JobManager分发task(JobManager有多个TaskManager) 2.TaskManager向JobManager注册,通过心跳保持连接,当其中一个TaskManager挂掉,就会重试,如果连接不上,就是用下一个TaskManager 3.TaskManager有多个slot
4.JobManager会触发checkpoint (checkpoint就是那个taskManager挂掉了,就T出去,让下一个上) 5.task slot 只对内存资源进行划分隔离,对CPU没有隔离,多个task slot共享CPU,内存是平分的 假如: TaskManager 3G 3core 则 task slot 1G 没有核
安装standalone集群
ke01 | ke02 | ke03 | ke04 |
JobManager | TaskManager | TaskManager | TaskManager |
1.下载链接: https://mirrors.tuna.tsinghua.edu.cn/apache/flink/flink-1.9.2/flink-1.9.2-bin-scala_2.11.tgz 2.解压:tar -zxf flink-1.9.2-bin-scala_2.11.tgz 3.修改flink-conf.yaml配置文件: 3.1 jobmanager.rpc.address: node01 JobManager地址 3.2 jobmanager.rpc.port: 6123 JobManagerRPC通信端口 3.3 jobmanager.heap.size: 1024m JobManager所能使用的堆内存大小 3.4 taskmanager.heap.size: 1024m TaskManager所能使用的堆内存大小 3.5 taskmanager.numberOfTaskSlots: 2 TaskManager管理的TaskSlot个数,依据当前物理机的核心数来配置,一般预留出一部分核心(25%)给系统及其他进程使用,一个slot对应一个core。如果core支持超线程,那么slot个数*2 3.6 rest.port: 8081 指定WebUI的访问端口 4.修改slaves配置文件 ke02 ke03 ke04 5.同步到其他节点 scp -r flink-1.9.2 ke02:`pwd` scp -r flink-1.9.2 ke03:`pwd` scp -r flink-1.9.2 ke04:`pwd` 6.配置环境 export FLINK_HOME=/opt/software/flink/flink-1.9.2 export PATH=$PATH:$FLINK_HOME/bin source /etc/profile 7.启动集群 node01上启动:start-cluster.sh
查看Flink WebUI
-
访问JobManager节点的8081端口
常用提交Application到Flink集群运行方式
(1)通过命令方式提交Application flink run -c com.msb.stream.WordCount StudyFlink-1.0-SNAPSHOT.jar -c 指定主类 -d 独立运行、后台运行 -p 指定并行度 (2)通过WebUI方式提交Application 在Web中指定Jar包的位置、主类路径、并行书等 web.submit.enable: true一定是true,否则不支持Web提交Application