- 博客(33)
- 收藏
- 关注
原创 Guava 在大数据计算场景下的使用指南
场景推荐工具维度聚合MultimapTable缓存加速Cache字符串清洗SplitterJoiner双向映射BiMap限流写入集合比较SetsMaps不可变共享提升开发效率、增强代码健壮性、避免重复造轮子。合理搭配可显著减少样板代码。
2025-06-12 15:41:59
422
原创 34、Spark实现读取XLS文件
spark.read.format(“xls”).option(“path”, logPath).load()能够跑通。但是对应xls大文件还是会oom。具体了解后得到原因:SSTRecord存储了整个excel中所有字符串去重后结果,LabelSSTRecord只是存储了该字符串值在SSTRecord中的索引位置。所以在逐条处理xls文件数据的时候遇到SSTRecord还是会oom。搜索了poi流式读取xls的方案,HSSFEventFactory提供了HSSFListener进行逐条处理数据。
2025-04-21 10:33:55
308
原创 33、SparkStreaming作业监控,日志收集,自动重启shell脚本
自从上了flink后,其实已经好几年没有编写SparkStreaming作业了。但是还有一个机器学习的作业是通过sparkml+sparkstreaming的。这个不方便迁移到flink上,所以一直保留着。再有就是,我们的spark作业都是运行在k8s上的。并没有工具或者平台进行sparkstreaming作业的监控和维护。
2025-02-25 16:51:28
291
原创 32、dolphinscheduler调度工具邮件告警标题信息修改
将打包好的 dolphinscheduler-service-3.2.2.jar放到部署服务器的dolphinscheduler的libs目录下。我需要将其邮件标题修改为 Flow’xxxx’scheduler failed。代码很清晰,我只需要将setTitle这里改为我需要的信息即可。前提:dolphinscheduler版本为3.2.2。效果如下:达到预期效果。
2025-02-17 15:31:09
289
原创 31、spark-on-kubernetes中任务报错No space left on device
最终的解决办法,在spark.local.dir参数里配置多个目录,eg:spark.local.dir: ‘/data1,/data2,/data3’。这个场景下,spark.local.dir的默认目录(/var/data/spark-{UUID})是以emptydir挂载卷的方式挂载的,大小默认40g。对应一些作业来说,这个大小不够,任务就会抛出磁盘容器不足异常。前提:我的spark版本为2.4.5, spark-operator版本为:v1beta2-1.0.0-2.4.5。
2025-02-10 16:23:32
411
原创 30、Flink中操作已经配置好的远程文件系统
解决办法:使用flink-core里的fileSystem来操作。这样就不用去使用对应文件系统的客户端了,而是直接使用的是当前flink中配置的远程文件系统。背景:flink作业中既配置了obs作为chk的远程文件系统,又在作业中读取obs文件内容时,使用obsclient会导致任务无法创建chk目录而启动失败。
2025-02-05 11:13:38
346
原创 29、Spark写数据到Hudi时,同步hive表的一些坑
修改’spark.sql.sources.schema.part.0’时,因为schema带有备注,会很长,导致超过hive表元数据mysql表字段的长度限制。同步hive表是在 数据写入hudi目录后,根据目录里的schema来创建的hive表,所以创建的hive表没有带着dataframe的comment信息。两种方式获取到的schema都是没有comment信息的。再看,org.apache.hudi.hive.ddl.QueryBasedDDLExecutor#createTable方法。
2025-01-13 11:14:20
1975
原创 28、使用StreamPark管理作业中,关于默认环境变量设置和默认动态参数设置的修改
还有为了cpu配置能和内存配置比例合理(cpu都默认1核,不合理,需要按照cci上的1:2到1:8之间,默认让jobmanager的cpu内存比例为1:4,taskmanager的为1:2),为了减少使用的复杂度。在使用过一段时间的streampark后,发现flink on k8s作业配置过于繁琐了,特别是pod-template.yaml的编写(主要是环境变量设置,),动态参数的编写,很多都是重复,只是需要修改作业名称。这部分的代码修改很简单,主要是找对修改的地方即可。设置环境变量的方法(
2025-01-08 11:22:23
426
原创 27、使用StreamPark管理Flink作业中,关于对Flink客户端的conf进行占位符替换的修改
这里主要是把作业名称给它替换了😅,这也是临时的一个办法,后面看启动脚本环境变量注入失败的问题的时候发现,确实是一个普遍,有大佬用其它办法解决的,社区也在后面的版本中修复了,后面再说吧😅。但是在用flink客户端提交作业到k8s上时,flink-conf都是从客户端的conf目录里传上去的成一个 configMap,作业是去读取自己对应的configmap,同一个客户端,那么所有任务的configmap都是一样的(包括log的),如何让各自任务获取到各自的作业名称呢?**解决办法:**环境变量+占位符。
2025-01-03 11:36:19
616
原创 26、使用StreamPark管理Flink作业中,关于flink on k8s部分的提交处理
拿到jobmanager url后会通过flink的restapi去拉取job list,但是这个时候cci上taskmanager还没启动来(太慢了~),就会拿到空的joblist,同样clusterid也是没有的,所以后面走的org.apache.streampark.flink.kubernetes.watcher.FlinkJobStatusWatcher#inferStateFromK8sEvent方法也是拿到不对的状态。已经整体迁移到华为云了,就没办法再想其它云产品了。1.监控指标太少了,
2024-12-27 11:26:32
504
原创 25、Flink on k8s作业日志收集
因为云上Flink作业管理产品太贵了,最近在预研Flink on k8s自建的方案,作业跑起来很简单,但是在日志收集这一块儿,我想将日志收集到对象存储上,但是没找到直接能将日志落在对象存储上的日志插件;也考虑过统一日志收集的方案,效果是挺好,但是需要额外的组件和资源;对于当前就几十个flink作业规模来说,大可不必了,就花了点时间写了一个日志落obs的插件。代码已经放在github上了(https://github.com/wjcwin/log4j-obs)。
2024-12-23 16:34:17
320
原创 24、Spark读取Hive时的SqlParser发生变更导致sql执行不通过
查看hive表的ddl语句中关于spark.sql的配置,TBLPROPERTIES里有个参数 ‘spark.sql.sources.provider’=‘parquet’, 这个参数会将spark的datasource转为parquet,而不是我们期望的hive,那么直接删除即可。可以看到报错内容里,spark sql 的解析啥的都走的 SparkSqlParser,并非我们期望的 hive解析器。hivesql 语法中这个场景并不会报这个错误。
2024-12-18 15:03:19
424
原创 23、编写一个Spark作业用于合并Hive表小文件
spark write hive时,产生的文件个数与 spark.sql.shuffle.partitions 参数和分区个数有关,当结果数据很少的时候,会出现小文件问题。注意,distribute by 会将每个分区的数据合并为一个文件,假如单个分区数据太大,也会造成大文件的问题;但是不加这个的话,因为动态分区修剪不会进行文件合并,也就达不到合并小文件的效果。这个可以让输出结果文件大小自适应,避免小文件问题。
2024-12-18 14:59:14
481
原创 22、Spark通过HoodieSparkSessionExtension方式读取Hudi表数据时,parquetRowConvert转换字段类型异常
查看源码,大致了解到,因为数据是以parquet的格式存储的,当触发了列裁剪,谓词下推等优化项时,会在parquet层进行操作,就会调用ParquetRowConverter,对parquet里的类型和读取出来的目标类型进行一个类型转换,在这个转换过程中,optional int64 是不能转为timestamp;目前可以知道,我们这个pay_time数据在parquet中是以int64类型存储的,但是为啥直接读hive的时候没这个问题呢,因为int64在hive的类型转换中可以转为为timestamp。
2024-12-18 14:55:29
473
原创 21、spark读取Hudi的EXTERNAL Hive表,报错,找不到cannot resolve ‘`xxxxx`‘ given input columns:
debug一遍后,找到原因:这个hudi的hive表之前进行过 add field,但是spark.table的时候,会默认先从hive表的TBLPROPERTIES 中的spark.sql.sources.schema.part.0获取schema,而这个属性参数,只有spark往hive写数据的时候才会发生变更,而通过hive-sql对表进行增加字段并不会改变这个属性参数。因为这个问题的表较多,需要写一段代码来批量监测和处理。使用的是spark 2.4.5;hudi0.10.0;
2024-12-13 17:46:12
384
原创 20、Spark作业通过HoodieSparkSessionExtension方式读取Hudi数据时,分区字段混乱导致读数失败
可以从源码中看到,metaClient从hudi表配置文件中获取分区字段信息,然后在判断分区字段信息是否在schema中抛出我们看到的异常,然后找下对应hudi表的配置文件,位于 .hoodie/hoodie.properties;从这个配置文件中可以看到里面的分区字段为ymd,与我们对应hive表分区字段ym对应不上,将配置文件中的ymd改为ym,任务就能正常读数了。为啥会发生这个情况呢,当时没有深究,但是大胆猜测,应该是之前对表进行重新分区导致的。
2024-12-13 17:43:30
262
原创 19、一次同源派生两个DataFrame进行join操作产生笛卡尔积的问题排查
这样的结果是第二个join的条件中 d2(“lotcodeassist”) === t_fee_static(“lotcodeassist”)失效,最终产生了二十多亿条的结果数据,但是实际的预期结果是九万多条而已。从代码中可以看到,t_dict和d2都是从同一个表cloud_brain.t_dict经过不同的过滤规则而来,最后和t_fee_static进行join操作。2.4.5中,两个DataFrame是从同一个表派生出来的,只要它们的字段名相同,Spark在执行计划中仍会认为它们是相同的。
2024-12-13 17:39:35
283
原创 17、使用SparkTs进行时序预测
之前也做过时序预测的业务,只不过使用的是pyspark+fbprophet(下次记录一下pyspark+fbprophet的使用笔记),这次使用sparkts里的holtWinters模型批量对多个商户的营业额进行预测。
2024-12-05 20:50:15
1593
原创 16、SparkMl的简单使用
SparkMl使用的不多,一两年前业务上需要就用了一下,之后就没再使用了,最近又有需求了,使用SparkMl做了一下时序预测,先在这一篇笔记里记录一下之前使用SparkMl的简单应用。这个案例使用的是随机森林模型。
2024-12-04 16:53:58
383
原创 15、Flink-动态修改窗口大小
通过查询数据库表去修改size大小,那么我们修改数据库表的数据不就达到动态改变窗口的大小了么;因为 assignWindows 方法是每条数据都会执行,那么肯定不能让来一条数据去查一次吧,多久查一次合适呢,那就上个窗口结束的时候吧,通过属性flushTime来决定查数据库的时机吧。先看下 TumblingProcessingTimeWindows 源码,窗口的大小就是用户传入的时间大小,那么我们把这个时间大小设置成外部获取或者根据指定情况来变化的不就可以,啊,easy,easy;
2024-12-04 11:38:34
296
原创 14、spark读取hudi数据时,判断数据新鲜程度
方法中对延迟情况放到一个map中,如果一个任务对一个表数据进行两次获取,那么第二次check直接从map中获取且不会推送机器人了。:hudi表目录下的.hoodie元数据目录下有commit文件,而最新的commit文件就存储着上次写入hudi表的数据的Kafka偏移量,通过和Kafka里最新的offset进行比对,就能得到这个表的lag值,lag值越大或者占topic消息队列的总缓存量的比例越大,或者commit文件的时间越早 那么就表示这个hudi表当前的数据越不新鲜了,根据阈值发出告警。
2024-12-03 10:35:54
741
原创 13、简单的自定义Spark Source输出源
大数据任务输出数据时有时会写到一些缓存中,如redis,大数据那肯定会有大量数据,但redis在内存超过一定容量后成本就太高了,然后有一个开源项目PIKA(https://github.com/OpenAtomFoundation/pika/blob/unstable/README_CN.md),基于rocksdb,完全兼容 Redis 协议(说是完全兼容,发现好像没有info命令和redis的不太一样),而rocksdb基于磁盘存储数据的,还有不错的查询性能,不错,替代redis作为大数据量的缓存。
2024-11-28 11:20:18
312
原创 12、记录一次Spark写大数据量到对象存储极度缓慢而了解到的Filecommitter一些知识点
数据数据量很大其实也还好,不是很夸张,就是分区较多几千个吧,然后上游任务也没有控制好小文件,导致每个分区里都要好多小文件,在此背景下,任务执行了好几个小时了,我看driver和executor都还在运行没有停下来意思,那不用多想,肯定是哪儿出了问题,按照我排除数据任务问题的思路,先去看看driver的日志,没有啥异常,日志老早就不打了,再看看executor的日志,一样,日志老早也不打了,并且executor的日志最后一行显示的是最后的task执行成功并反馈到了driver。webUI上也是执行完成了。
2024-11-25 15:42:43
1300
原创 11、用jvm-profiler监控Spark任务的内存,cpu使用率
这个插件呢,是个Java agent,不侵入代码,友好,带有这个插件的sparkjob会在后台每隔指定时间间隔往我们指定的reporter(console,Kafka等)发送内存cpu资源消耗数据。刚好我们在配置一个spark任务的时候指定cpu内存资源时都是按照经验写的🙃,多数情况下为了保证任务正常运行,资源都是给多了,其实浪费了,而有了这个插件就能为我们对资源参数优化提供数据支撑了。说完废话,开整~,我的任务运行在k8s中,通过spark-k8s-operator。
2024-11-25 15:33:59
430
原创 10、Spark离线任务一种数据血缘获取方式
pulsar是一个消息中间件,消息数据队列,用得较多,但spline里并没有定义,所以需要我们自己动手来定义🤖</</</</编写pulsarplugin/*** @author: 王建成* @description: spline pulsar 数据源插件*/// 偏函数中 模式匹配到 PulsarRelation 后通过extractValue 从对象中抽取需要的属性,然后将属性中信息数据来构建 ReadNodeInfo.keySetsourceId,))
2024-11-25 15:25:05
665
原创 7、Flink使用状态记得配置StateTtlConfig
在KeyedProcessFunction 和 ProcessWindowFunction中,我们常常会定义一些KeyedState状态,而这些状态跟key和窗口是一一对应的,一个key第一次到达状态算子后产生状态数据,后续没有对应key的数据到达算子,假如不对状态进行清理,内存遭不住。.setStateVisibility(StateTtlConfig.StateVisibility.NeverReturnExpired) //是否读取已过期的状态数据。
2024-11-19 14:10:34
483
原创 6、flink 中使用jodatime 序列化问题解决
简介:Additional kryo (http://kryo.googlecode.com) serializers for standard jdk types (e.g. currency, jdk proxies) and some for external libs (e.g. joda time, cglib proxies, wicket).> type):如果类型最终被 Kryo 序列化,之后它将会被注册到 Kryo,以确定值写入标签信息(integer ID)。
2024-11-19 14:04:22
336
原创 5、spark.sql.codegen.wholeStage: ‘false‘ 关闭spark sql 语句长度校验
如题,当在Spark 任务中,通过一些例如递归等方式 去构建dataframe或者dataframe的过滤条件等,可能会出现spark sql 长度超过限制的报错,可以通过设置 spark.sql.codegen.wholeStage: ‘false’ 来关闭长度校验。
2024-11-19 13:57:28
173
原创 4、spark dataframe null 值 join 恒为false
本以为spark dataframe中 null值也可以作为join条件,没想到是错的,记录一下啊😣;看下面的验证代码块可以看到结果。
2024-11-15 17:48:58
136
原创 3、Spark groupby()实现分组后集合排序
因为是collect_list后数组里的元素是json,所以sort_array是按照字典顺序排序的,结果就不对。思路一:to_json+groupBy+collect_list+sort_array(先说结论,不可行❌)
2024-11-15 15:10:42
285
原创 2、spark读取腾讯云云hdfs(chdfs)不允许公网访问
本地调试访问chdfs出现无法访问问题,查看源码发现,是使用自定义类加载器加载远程地址的插件报,而这个远程地址是内网地址。这个包里有一个CHDFSHadoopFileSystem类,在doInitialize()方式报错跑不通🙃。随后通过使用代理的方式再次运行。
2024-11-15 13:39:12
166
原创 1、Hadoop报错ConcurrentModificationException
这个是Hadoop内部读取配置信息时 使用hashtable 产生了 并发修改错误;这个报错是jira里的,自己的找不到了。在使用腾讯云emr的时候遇到,升级emr内的Hadoop版本得以解决;
2024-11-15 11:03:42
274
原创 Java多线程+阻塞队列爬取网页图片
初学者,用java写了个爬虫玩,爬取蜂鸟网上的图片,但是只能获得一页数据,请教大神帮忙看看代码哪里出错了长话短说,直接贴出代码package picture;import com.google.gson.Gson;import jindong.utils.HttpClientUtils;import org.apache.http.HttpEntity;import org.apach...
2018-09-24 14:59:35
505
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人