核心库-批流计算
文章平均质量分 88
.....
优惠券已抵扣
余额抵扣
还需支付
¥159.90
¥299.90
购买须知?
本专栏为图文内容,最终完结不会低于15篇文章。
订阅专栏,享有专栏所有文章阅读权限。
本专栏为虚拟商品,基于网络商品和虚拟商品的性质和特征,专栏一经购买无正当理由不予退款,不支持升级,敬请谅解。
研发咨询顾问
专注全栈开发和项目管理,诚接商务\业务合作,及问题难点解答和远程协助! 可私信或留言给作者,消息会在6小时内回复哦 (每篇文章末尾有作者名片,可添加联系,秒通过)
展开
-
hadoop和spark的mapTask和reduceTask对比和区别(超级详细)
所以reduceTask才有优先级的说法:repartition() > spark.sql.shuffle.parallelism > spark.default.parallelism。如果该参数不设置,默认为集群可用的cpu数。[1] 默认情况:reduceTas个数 = spark.default.parallelism, 如果该参数不设置,默认为集群可用的cpu数。[2] 全局设置(只设置reduceTask):spark.sql.shuffle.parallelism=12。原创 2023-07-12 16:51:42 · 251 阅读 · 0 评论 -
Spark和MR重点区分
如果HDFS中dfs.block.size设置为128m,而输入的目录中文件有100个,则划分后的split个数至少为100个。分片是按照splitszie的大小进行分割的,一个split的大小在没有设置的情况下,默认等于hdfs block的大小。分组(计算规则): 在大数据组件里面,是计算规则的名词,如加减乘除都是计算规则。分区数(执行程序速度): 在大数据组件里面,是执行程序速度名词, 是加快计算和程序处理速度的概念名词。)MapReduce的mapTask个数是由源数据或文件的切片来计数的。原创 2023-05-21 11:24:45 · 73 阅读 · 0 评论 -
Spark和Flink对比
解答:spark streaming 的 checkpoint 仅仅是针对 driver的故障恢复做了数据和元数据的checkpoint(就是消防数据出现了宕机,然后恢复,重新消费),当然支持RDD手动设置checkpoint(不过设置存放的目录)。正常的远行顺序是:先远行上游OperatorChain(读取数据),在远行中间OperatorChain(中间处理),最后远行下游的OperatorChain(数据输出)。一个job任务=多个OperatorChain。原创 2023-05-21 11:23:57 · 92 阅读 · 0 评论 -
Spark代码错误收集
是不允许嵌套的,有点像for循环不能嵌套for循环,除非有一个rdd是经过强行计算的,另外一个rdd没有计算,这样的话支持嵌套。(1)有时候我们在进行数据分隔的时候,如果以上面的数据为案例的话(上面数据存在部分缺失),以@符号进行分隔。但实际上spark如果识别到“行末字段”有数据的情况下,那"前面字段"无数据情况下支持为null。如果“行末字段”没有数据的情况下,那"前面字段"无数据情况下是不支持为null的)。(2)那么正常情况下会出现1行2行数据的5个字段(这是数据完整的情况下),原创 2023-05-21 11:22:45 · 60 阅读 · 0 评论 -
flink-Transform语法小结
每组窗口都会调用该方法,功能和Reduce()差不多,只是它的过程复杂,可以获取窗口的时间等属性,最终"每组的数据"计算后,都会变成dataStream。算是一个大招方法,麻烦的自身要定义代码如何处理,如果源码有提供的话某些实现功能的话,就先不考虑Process(),如果源码没有我们需要的功能,那就可以使用Process()。,一般我们窗口等收集到一定数据,就开始关闭窗口,且会调用函数对收集的数据做计算。包括:sum() ,min() , max(),minBy(),maxBy()。原创 2023-05-20 07:41:52 · 71 阅读 · 0 评论 -
flink-CEP(超级详细)
而CEP只要水位线就可以,窗口的话可带可不带, 只要单独设置了水位线(或事件时间升序,或事件时间乱序,都会有水位线的效果),而且它处理较为严重的乱序事件,可以说功能很强大。当且仅当数据为a,c,b,b时,对于followedBy模式而言命中的为{a,b},对于followedByAny而言会有两次命中{a,b},{a,b}(1)还是一样,没有设置窗口,但设置的事件时间是升序的,其实就是当前时间戳为水位线,跟延迟1s是一个意思。当且仅当数据为a,b或者为a,c,b,,模式均被命中,中间的c会被忽略掉。原创 2023-05-20 07:40:12 · 143 阅读 · 0 评论 -
flink-SQL-API
SQL query(包括批处理和流处理) 会经过 Calcite 解析器转变成 SQL 节点树,通过验证后构建成 Calcite 的抽象语法树,在进行优化。年龄","性别","身高","地址"))) //千万注意 这里最好不好 手打文字,最好从原文本复制过来。需要注意的是,下面导入包,你可放在上面,但是可能把跟跟别的包冲突,所以,你可以放在下面。需要注意的是,下面导入包,你可放在上面,但是可能把跟跟别的包冲突,所以,你可以放在下面。年龄","性别","身高","地址")) )原创 2023-05-20 07:37:16 · 51 阅读 · 0 评论 -
flink-Table-API
但要注意 此时select里面是要k v1 v2的格式,必须要要有操作,不能直接输出源数据,且由于做了groupBy的操作 所以 转换DataStream的时候,就不能使用toAppendStream 而是toRetractStream。:表示 指定的时间是哪一个字段。值得注意的是,Table API and SQL目前尚未完全完善,还在积极的开发中,所以并不是所有的算子操作都可以通过其实现。(4)动态表的查询与静态表一样,但是,在查询动态表的时候,SQL 会做连续查询,不会终止。而as 'win:表示。原创 2023-05-20 07:35:20 · 70 阅读 · 0 评论 -
FlinkExactlyOnce各环节的精确实现
(4)但这里 还有一个问题就是,虽然Transform和Sink组合使用已近保证了ExactlyOnce,但是由于本实验还没有加入SourceExactlyOnce,所以回滚数据已经丢失了,因为我们也可以看到,nc -l 6767 命令运行了2次,人为干预下输入数据下才使回滚丢失数据得到了弥补或找回。可以看出sink的ExactlyOnce是最难的。(3)我们可以看到回滚的数据是不会继续累计算的,所以下次重启flink-job,还是从提交成功的数据继续计算,而不是回滚的数据继续计算。原创 2023-05-20 07:33:51 · 68 阅读 · 0 评论 -
FlinkExactlyOnce核心概念
当它收到JobMananer的checkpoint完成的通知时,它才正式提交事务到外部端,并节将外部端预接受的数据改为确认(即可以消费),这就是实现结果的真正写入,而这种方式真正实现了 exactly-once,但这种方式它需要一个提供“事务支持”的外部sink系统,显然 成本会高。在中间处理的恢复的情况下,这可能需要一些时间,延迟外部端的数据接受。而两阶段提交是来每一条的数据都会做一个预提交,但外部端接受的数据,是不能消费的,最后在真正的提交,将外部的预接受的数据改为已确认,外部端就可以消费数据。原创 2023-05-20 07:30:20 · 59 阅读 · 0 评论 -
flink-ProcessingAPI
方法,是一个回调函数。(注意点,如果是以事件为时间,而且使用了定时器,那么建议最好加水位线,虽然不加水位线可以远行程序,但是远行的时候,返回的处理数据会不符合定义的逻辑,而且定时器也无法触发) 比如:assignAscendingTimestamps(_.eventTime * 1000L)即1s延迟+定时器为3s=4s,所以事件时间到4s才可以触发该定时器。这里是删除内存里面的状态值,而这个状态值是时间值,是给定时器用的,每个控键流有一个状态(所以要注意清理),由于是value状态,只能存放一个值。原创 2023-05-20 07:16:21 · 76 阅读 · 0 评论 -
flink-时间语义和水位线API(超级详细)
(注意点,如果是以事件为时间,而且使用了定时器,那么建议最好加水位线,虽然不加水位线可以远行程序,但是远行的时候,返回的处理数据会不符合定义的逻辑,而且定时器也无法触发) 比如:assignAscendingTimestamps(_.eventTime * 1000L)即1s延迟+定时器为3s=4s,所以事件时间到4s才可以触发该定时器。窗口左边时间:1547718188;),时间窗口左闭右开,右开的时间其实和水位线的时间是一样的,因为当前 的水位线时间的数据是不能处理的,但有些窗口不是左闭右开。原创 2023-05-19 09:36:31 · 75 阅读 · 0 评论 -
flink-时间语义和水位线介绍
我们知道,流处理从事件产生,到流经 source,再到 operator,中间是有一个过程和时间的,虽然大部分情况下,流到 operator 的数据都是按照事件产生的时间顺序来的,但是也不排除由于网络、分布式等原因,导致乱序的产生,所谓乱序,就是指 Flink 接收到的事件的先后顺序不是严格按照事件的 Event Time 顺序排列的。我们设置的允许最大延迟到达时间为 2s,所以时间戳为 7s 的事件对应 的 Watermark 是 5s,时间戳为 12s 的事件的 Watermark 是 10s。原创 2023-05-19 09:33:39 · 53 阅读 · 0 评论 -
flink-WindowAPI(超级详细)
注意:下面案例中,是当远行控制台不在打印日志的时候(此时程序就正式开始计时),就立马粘贴数据,就开始滑动2s(真正利用到的窗口大小就2s长度),然后在滑动2s(那么利用到的窗口大小就4s长度),在滑动2s(真正利用的长度就为6s长度了)。包括:timeWindow(...),timeWindowAll(...),countWindow(...),countWindowAll(...)等 ...。调用该方法 .timeWindow(Time.seconds(6), Time.seconds(2))原创 2023-05-19 09:30:10 · 76 阅读 · 0 评论 -
flink-DataStream-Sink
注意:在写代码的时候,如果没有sink操作可能会报以下错误,Exception in thread "main" java.lang.RuntimeException: No new data sinks have been defined since the last execution. The last execution refers to the latest call to 'execute()', 'count()', 'collect()', or 'print()'.其实是正常的。原创 2023-05-19 09:16:44 · 213 阅读 · 0 评论 -
flink-DataStream-Transform(超级详细)
在流API里面:比分组和聚合操作是keyBy()函数,但这个会显示技术的过程,比如源数据是[word:num] =(Java,11),(scala,22),(java,8),(Java,9)。那么keyby("word").sum("num"),那么计算结果会显示 (Java,11),(Java,33), (Java,41)。是之前的数据,y是新来的数据(注 这里本来就是分组的x.id=y.id), 我们是要求是 y数据时间戳为x时间戳+1,而y的温度+10。原创 2023-05-19 09:04:26 · 50 阅读 · 0 评论 -
flink-DataStream-Source(超级详细)
据的时候,不能直接对源数据的字段进行内部的字符串截取操作,否者会包异常该flink.streaming.runtime.tasks.ExceptionInChainedOperatorException: Could not forward element to next。连接mysql的驱动用的是java连接的,scala条用java,java调用mysql-->设置并行度,如果设置的是1,那么在控制台就不会显示,如果设置的是>=1,就会显示。,那么读取的数据返回就是DataSet类型的,批处理环境。原创 2023-05-18 20:54:48 · 198 阅读 · 0 评论 -
flink-Job提交和参数配置
可以看到默认的配置文件中taskmanager.numberOfTaskSlots:1 每个TaskManager的slots的个数为1,其实整个设置要根据电脑的cpu核素,如果是2核就可以设置为2(电脑的几核决定了可以同时做几件事情,4核就可以同时做4事情,也就是平行度为4)。(1)fink设置语法env.setParallelism(2)//设置并行度,如果设置的是1,那么在控制台就不会显示,如果设置的是>=1,就会显示。,jar包进行正在远行时 spark或flink集群的webUI是才会启动。原创 2023-05-18 20:45:27 · 616 阅读 · 0 评论 -
Flink架构以及Standalone安装和Yarn模型安装(超级详细)
Flink中的工作进程。)JobManager会先接收到要执行的应用程序,这个应用程序会包括:作业图(JobGraph)、逻辑数据流图(logical dataflow graph)和打包了所有的类、 库和其它资源的JAR包。下面是有默认的配置的,删除掉,在插入,不要重复配置,会出错,也不乱设置,不然程序一直运行不会停止,测试过发现这个情况,所以cpu核算不要乱写,否则工作节点会一直申请资源。首先hadoop集群安装起来,和之前安装模式是一样的,可以参考hadoop的查看笔记,确保可以访问一下的页面。原创 2023-05-18 20:42:05 · 140 阅读 · 0 评论 -
Spark调优代码操作(全网超级详细)
内容文件参考"付费专栏"可领取。专栏购买者提供本内容"永久答疑和远程协助"服务。一诺千金!N.1 基础概念1)cpu或核心是物理线程一个核心就是一个物理线程,核心数2就有两个物理线程。2)自定义划分系统线程是逻辑线程因特尔的超线程技术可以把一个物理线程模拟出两个线程来用,充分发挥CPU性能。线程数4就是代表核心数2的两个物理线程可以模拟成四个线程来使用。3)关系图目前市场上,1个cpu的可以最少分支2个线程。好的cpu最多分支10以上线程N.1 CPU和内存分配优化1)相关配置(1)请参考 01.3 Job原创 2023-05-17 11:22:14 · 115 阅读 · 0 评论 -
spark-SpakrExactlyOnce整体实现
获取offsetRanges这个值比较特殊 ,如果要提前出来,必须kafakDStream所得到的第一手数据才包含offsetRanges,所以kafakDStream的不能有操作改变原有的数据流结构,如.flatMap()会破坏原有的结构,所有只能有foreachRDD来提取,此外还要进行序列化包装。理论情况:特备注意 我们这里演示的是Source的ExactlyOnce ,所以以kafka都要取出来 进行先拷贝出来,然后在进行数据偏移量的提交。无提交的offset时,消费新产生的该分区下的数据。原创 2023-05-17 11:12:14 · 67 阅读 · 0 评论 -
SpakrExactlyOnce核心概念(超级详细)
如果在执行RDD lineage的过程中失败,那么只要源数据不发生变化,无论重新执行多少次lineage,都一定会得到同样的、确定的结果。不过,因为写HDFS比较消耗性能,要在备份完数据之后才能进行更新zookeeper以及汇报位置等,这样会增加job的执行时间,这样对于任务的执行提高了延迟度。当Driver进程挂掉后,Driver下的Executor都会被杀掉,当更新完zookeeper消费偏移量的时候,Driver如果挂掉了,就会存在找不到数据的问题,相当于丢失数据。所以消费者过多也是浪费的。原创 2023-05-17 11:10:29 · 78 阅读 · 0 评论 -
sparkJob任务远行过长进行自动杀死
(1)我们需要访问job的任务信息,可以通过API访问,结果如下,但需要注意,每个任务的端口是递增的,比4040,4041等,每次一个页面只能查看一个任务。而且对于一般的格式 是可以获取的,如果是特别离谱的json 就可能查找不到。案例 ,我们对程序进行请求http://134.224.115.40:4041/api/v1/applications/,实际上,这是没有什么意义的。一般情况是 "http://134.224.115.40:4042/api/v1/applications/"原创 2023-05-17 11:05:07 · 134 阅读 · 0 评论 -
spark-Checkpoint容错恢复(超级详细)
而checkpoint执行完之后,rdd已经没有之前所谓的依赖rdd了,而只有⼀个强⾏为其设置的checkpointRDD,checkpoint之后rdd的lineage就改变了。)checkpoint的元数据会记录jar的序列化的二进制文件,因为你改动过代码,然后重新编译,新的序列化jar文件,在checkpoint的记录中并不存在。(1)当我们spark 的容错机制使得某个任务或数据块丢失,都可以从最开始的数据源重新获取数据计算,然后恢复数据块和任务,如果计算比较多,计算链比较长,这个恢复过程就很长。原创 2023-05-16 09:54:31 · 250 阅读 · 0 评论 -
sparkBatch任务周期性执行
如果是每次提交线程池的线程是复用之前的线程 如“static val myThe=new myThread 即类属性”, cachedThreadPool.execute(myThe), 那就不用把sparkJob会话给关闭掉, 因为这样可以复用之前的spark会话,也是是优化的方法。本地的“访问服务器”会导致内存或cpu不足或线程太多,每个线程内的spark-job处理速度太慢,导致线程提交spark-job的任务越来越多,造成spark-job好多任务执行同时执行,性能减低。原创 2023-05-16 09:36:56 · 176 阅读 · 0 评论 -
spark-Stream与Batch数据关联
当进行sparkStreming在进行map{}操作的时候,如果你要涉及到sparkSql操作,用到了两条数据流要进行关联匹配的话,是不能使用的,因为回报错(空指针异常,是模糊的错,几乎没有办法解决),只能讲sparkSql进行强制计算,才可以关联。如果要进行sparkSpl数据源更新的话(一般来讲这是比较常见的操作,数据库不可能一直不变的,但数据库的更新频率也是比较慢的)更新数据库的源(每天更新一次),注意更新数据库,要放在rdd外面更新,数据和 sparkStream的数据进行关联。原创 2023-05-16 09:31:18 · 112 阅读 · 0 评论 -
spark-Streaming-Transform
对(K,V)对的DStream调用此函数,返回同样(K,V)对的新DStream,但是新DStream中的对应V为使用reduce函数整合而来。对于DStreams中元素类型为K调用此函数,得到包含(K,Long)对的新DStream,其中Long值表明相应的K在源DStream中每个RDD出现的频率。源目录生成数据的时间 和 spark读取目录的时间 两个时间不能是"倍数关系"。)如果输入数据就不在输入了,可以看出,如果不输入数据,随着时间的推移,窗口的数据也就慢慢没有了,以下是运行结果。原创 2023-05-16 09:27:54 · 58 阅读 · 0 评论 -
spark-Streaming-Source
的源数据 配置是一个事件为一行数据,如假设flume500事件(500行数据)给spark,但spark采集接受是作为一个整体事件(即RDD),所以在spark内部的处理机制是以RDD为单位(RDD里面500行数据实际上是作为一个“整体字符串”, spark每次只能采集一个RDD,而RDD里面的数据内容换行符号实际上没有真正意义达到分割,需要在代码里面在此手动声明下)监控文里面的一般最好不要修改,因为修改就会导致文件的所有内容都好比是新增,而source又会把文件重新读取一遍,所以最好使用追加的方式。原创 2023-05-15 16:48:08 · 142 阅读 · 0 评论 -
spark-Serializable序列化(超级详细)
Spark的计算是在executor上分布式执行的,故用户开发的关于RDD的map,flatMap,reduceByKey等transformation 操作(闭包)(1)如果要被序列化的对象很大,这个时候就最好将配置项spark.kryoserializer.buffer 的值(默认64k)设置的大些,使得其能够hold要序列化的最大的对象。并且driver向executor端传数据涉及到网络传输,网络只能传单一字符串和单一数字,不能传对象或者是复杂组合的元组等,所以需要将对象进行序列化才可进行传递。原创 2023-05-15 16:40:05 · 226 阅读 · 0 评论 -
spark-RDD与SqlDF转换
但特别注意:.rdd.map(a=>a).collect()不要乱用,一但用了返回类型就不是RDD类型。这样就不能用map等一些常用的函数。导入隐式类,但要注意 如果导入自动删除的话要关闭IDEA制动格式化功能。如果导入 还是报红baidu。进行列名更改 . 因为只有一列值 所以默认列名为value。但列名的话 默认是制动取名的 ,当然可以进行改名。转DataFrame。原创 2023-05-15 16:35:58 · 106 阅读 · 0 评论 -
spark-SQL-Sink
将数据保存到Excel文件中. 注意 写入数据会产生.crc后缀的元数据文件,如果要改动excel的写入文件的话,那要把元数据.crc文件给删除掉。特别注意 数据库 覆盖写入 不能对同一张表读取出来,在覆盖写会到原来的表(因为在覆盖的时候源数据已经被删除了,此时你就没有数据可以写人原表了)特备注意读和写不要在同一个文件里操作, 读写的文件一定要分开 不然 会出现文件被删除的情况(而且excel在打开的状态下不能写入数据文件)删除数据 不删除表, 如果不写这条,自动创建表的格式是会被篡改的。原创 2023-05-15 16:31:16 · 111 阅读 · 0 评论 -
spark-SQL-Transform
如果代码计算的结果不输出到数据库,比如输出离线文件excel,而且需要中文含义的字段,可以用 DF.withColumnRenamed("name",姓名)。当数据涉及的字段里是个数组或集合等情况下(这种情况一般是发生在noSQL数据库或json格式的数据),可以使用下面的操作来提取数据。不同的两个表的不同字段的连接,以studnetDS("字段1")===courseDS("字段2")为判断条件。如果这个字段里面是的值是:值是数组就用索引提取、值是Map就用key提取、值是Struct就用字段提取。原创 2023-05-15 16:29:12 · 240 阅读 · 0 评论 -
spark SQL-Source数据源(超级详细)
必须,是否使用表头,false的话自己命名表头(_c0),true则第一行为表头.但特别注意excel的表头一定要文本格式或字符串格式(一般最好在单元格前面加一个英文单引号,不要直接用excel设置文本 有时候不会生效).如何设置了false那还要设置.schema(myCustomSchema)如果这个字段里面是的值是:值是数组就用索引提取、值是Map就用key提取、值是Struct就用字段提取 col("data").apply("number")需要注意的是还要要设置读取区域。原创 2023-05-14 08:53:06 · 114 阅读 · 0 评论 -
sparkSQL-Source构建介绍(超级详细)
如果源数据是Array("hive", "Hadoop")等, 那么每次取出来的content,就是一个单词,如果在用索引定位 会定位成单词里的字母,所以注意 一般不要定位;是指本地,不会跑集群(即便master/work没有启动都可以运行,因为更集群是没有关系的)(local[*]只是通过最大的多线程模拟了集群而已,local[5]表示启动5个线程,但不算真正跑集群)。这样看起来就像一张表了。大一","李鸿卓",18,"男",175,65), ("大二","李思真",19,"女",165,60))原创 2023-05-14 08:53:28 · 78 阅读 · 0 评论 -
spark-RDD-Sink(超级详细)
如果要打jar提交到集群记得.setMaster("local[*]")要注释掉,因为这个是测试用的(多线程模拟了集群而已),不注释就要写 spark//ip:端口, 具体原因参考前面笔记。错误的分析 是 这conn 和pst 这两个对象 与rdd1对象 都是在同一个作用域创建的,作用域没有存在包含和被包含关系,类似于进程(线程)通信.连接mysql的驱动用的是java连接的,scala调用java,java调用mysql-->保存的是一个分区的数据集合,底层也实现了。不是线程安全的 但执行的效率表高。原创 2023-05-14 08:54:24 · 67 阅读 · 0 评论 -
spark-RDD-Transform算子(超级详细)
这种设计让Spark更加有效率地运行。(2)countByKey() : 针对(K,V)类型的RDD,返回一个(K,Int)的map,表示每一个key对应的元素个数。如:val rdd2 = sc.makeRDD(Array(("a",1),("b",3),("c",3),("d",5)))如:val rdd2 = sc.makeRDD(Array(("a",1),("b",3),("c",3),("d",5)))(seqOp:(U,T) => U,combOp:(U,U) => U)是两个隐式函数,原创 2023-05-14 08:54:38 · 108 阅读 · 0 评论 -
Spark环境对象总结
如果要打jar提交到集群记得.setMaster("local[*]")要注释掉,因为这个是测试用的(多线程模拟了集群而已),不注释就要写 spark//ip:端口, 具体原因参考前面笔记。)一般来讲是创建对象顺序如下, 不过SparkContext一般都是最先创建的。获取程序的ID,这个很重要,一般任务很多的情况下,需要这个来排除日志。获取程序的ID,这个很重要,一般任务很多的情况下,需要这个来排除日志。)开发sparkStreaming创建的环境对象。设置rdd分区数 也叫并行度,如果不设置默认和。原创 2023-05-14 08:52:33 · 52 阅读 · 0 评论 -
spark-Job内部结构+提交操作+参数配置
(4)task有rdd决定,rdd的并行度参数spark.default.parallelism(并行度指所有Executor可以同时执行的Task数,也是分区数)。(2)一个stage对应多个task,task由dirver发送到executor,stage是根据RDD之间的依赖关系的不同将Job划分成不同的Stage,遇到一个宽依赖则划分一个Stage;(3)stage正常的远行顺序是:先远行上游stage(读取数据),在远行中间stage(中间处理),最后远行下游的stage(数据输出)。原创 2023-05-13 09:45:02 · 78 阅读 · 0 评论 -
Spark架构和部署模式(全网最超级详细)
需要注意,端口虽然是连续分配个最新的任务,但是如果有前面的端口任务已近远行结束了,最新的任务会填补旧端口,继续远行,不会浪费端口号。)Spark的最大特点:基于内存,Spark是MapReduce的替代方案,而且兼容HDFS、Hive,可融入Hadoop的生态系统,以弥补MapReduce的不足。,就是spark或flink集群的webUI是启动可以访问的状态(即master和work在远行),jar包进行远行完成的,这些webUI还是可以访问的。好处是,执行时可以在本地看到所有的log,便于调试。原创 2023-05-13 08:48:43 · 155 阅读 · 0 评论