Spark踩坑日记

Spark日记

一 spark-sql元数据踩坑

踩坑背景:

工作需要我一直常开一个spark-sql进程,然后做了一个需求是重刷某个表的分区数据,重刷任务是在airflow调度的,此时已经有两个spark-sql进程了,刷新完毕后在我常开的spark-sql中去访问该分区数据,报文件找不到的异常(忘记截图),这个文件在分区路径下确实不存在,但是分区下是有数据的。然后重启spark-sql,问题解决。

个人猜测

猜测是元数据引起,每个spark-sql会cache一份metadata,并且每个spark-sql进程相互独立

官网描述:
Spark SQL caches Parquet metadata for better performance. 
When Hive metastore Parquet table conversion is enabled, metadata of those converted tables are also cached. 
If these tables are updated by Hive or other external tools, you need to refresh them manually to ensure consistent metadata.

大概意思就是为了性能,对元数据做了缓存,并且提供了针对每个表的刷新命令

--sql
REFRESH TABLE tableName
//scala
spark.catalog.refreshTable("my_table")

二 表增加字段

代码:(增加多个字段信息)

alter table tranadm.name add columns
(col_cnt bigint COMMENT '点击下载次数'
,col_cnt_1 bigint COMMENT '下载完成次数'
,col2 bigint COMMENT '安装完成次数'
,col3 bigint COMMENT '点击下载offer次数'
,col4 bigint COMMENT '下载完成offer次数'
,col5 bigint COMMENT '安装完成offer次数'
);

三 特殊函数整理

3.1 pivot函数(透视函数)(行转列)

友情链接(非官方):https://blog.csdn.net/dafei1288/article/details/99744504

select 
*
from (
	select country,newsid,event,cnt,num 
    	from (select * from pvuv 
         	union all
         	select * from h5_data
         	)
    )
    pivot(
         max(cnt)as cnt,max(num) as num --需要透视的列,需要用计算函数套一层  可以指定别名也可以不指定 只是为了看数据时方便明白其含义
         for event in('h5','zs_new_validex','zs_newscard_cl')
         );
3.2 map_from_arrays函数

函数解释:将两个数组映射为一个map集合

在这里插入图片描述

使用场景:需要将有对应关系的两个数据炸开成多行(默认的列名是 key value

select
            event
            ,gazj
            ,time_stamp
            ,eparam
            ,explode(map_from_arrays(split(get_json_object(eparam,"$.newsid"),','),split(get_json_object(eparam,"$.cp"),',')))
        from table_name
3.3 trim

函数解释:去除空格或者指定的字符

--去除两头的指定字符
SELECT TRIM(BOTH 'O' FROM 'OOHELLO')
--去除左边的指定字符
SELECT TRIM(LEADING 'O' FROM 'OOHELLO')
--去除右边的指定字符
SELECT TRIM(TRAILING 'O' FROM 'OOHELLO') 

四 spark-submit命令参数

4.1 spark.sql.hive.convertMetastoreParquet
spark.sql.hive.convertMetastoreParquet
--官方解释不是特别清晰,大致理解为hive spark的parquet算法不一样,性能也不一样,所以需要这个参数
这个参数默认开启
我遇到的情况是当参数关闭是数据落盘不会直接落到表的location路径下,而是先落到临时路劲下,然后再移动到表的location路径下,从而导致spark任务已经计算完毕,还需要大量的时间来移动数据,yarn计算资源被占有不被释放,
需要注意的是两种parquet是有区别的,比如精度计算是,会有精度损失

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
spark streaming 是基于 spark 引擎的实时数据处理框架,可以通过集成 kafka 来进行数据流的处理。然而,在使用 spark streaming 进行 kafka 数据流处理时,可能会遇到一些。 首先,要注意 spark streaming 和 kafka 版本的兼容性。不同版本的 spark streaming 和 kafka 可能存在一些不兼容的问题,所以在选择版本时要特别留意。建议使用相同版本的 spark streaming 和 kafka,以避免兼容性问题。 其次,要注意 spark streaming 的并行度设置。默认情况下,spark streaming 的并行度是根据 kafka 分区数来决定的,可以通过设置 spark streaming 的参数来调整并行度。如果并行度设置得过高,可能会导致任务处理过慢,甚至出现 OOM 的情况;而设置得过低,则可能无法充分利用集群资源。因此,需要根据实际情况进行合理的并行度设置。 另外,要注意 spark streaming 和 kafka 的性能调优。可以通过调整 spark streaming 缓冲区的大小、批处理时间间隔、kafka 的参数等来提高性能。同时,还可以使用 spark streaming 的 checkpoint 机制来保证数据的一致性和容错性。但是,使用 checkpoint 机制可能会对性能产生一定的影响,所以需要权衡利弊。 最后,要注意处理 kafka 的消息丢失和重复消费的问题。由于网络或其他原因,可能会导致 kafka 的消息丢失;而 spark streaming 在处理数据时可能会出现重试导致消息重复消费的情况。可以通过配置合适的参数来解决这些问题,例如设置 KafkaUtils.createDirectStream 方法的参数 enable.auto.commit,并设置适当的自动提交间隔。 总之,在使用 spark streaming 进行 kafka 数据流处理时,需要留意版本兼容性、并行度设置、性能调优和消息丢失重复消费等问题,以免

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值