概述
本文主要列出在使用 X-Pack Spark 的 FAQ.
Spark 集群使用问题
x-pack spark 如何监控核心指标
- https://developer.aliyun.com/ask/138207?groupCode=bigdata
- Spark Connectors
主要列举 Spark 对接其它数据源遇到的问题
Spark on HBase
Spark on HBase Connector: 如何在 Spark 侧设置 HBase 参数.
Spark on Phoenix
Spark on Phoenix 4.x Connector: 如何在 Spark 侧设置 Phoenix 参数.
Spark SQL
主要列出 Spark SQL 相关的.
spark 2.4.3 以上版本 thriftserver 对于 data 类型的字段作为分区, 查询不到数据?
答: 在查询的时候需要对 "2019-06-23" 这样的字符串条件过滤使用 date 做转换
spark SQL 保存结果时如何设置并行度
答: 如果使用 Spark 默认的并行度可能会导致 Spark SQL 运行的结果文件产生大量的小文件. 一种简单的方法是在保存结果的过程中手动设置并行度. 在 Spark 2.4 之前是不支持在 SQL 中设置并行度的, 如果你使用 Spark 2.4, 可以在 SQL 中使用 Repartition Hint, 比如
- spark.sql("create table test as select /*+ REPARTITION(4) */ age,count(*) from person where age between 10 and 20 group by age")
- spark.sql("insert overwrite test as select /*+ REPARTITION(4) */ age,count(*) from person where age between 10 and 20 group by age")
注意: 这种方法设置并行度并不是对如何场景都合适的, 最好的办法是提前计算好结果文件的大小, 然后每个文件保存多大, 再算出一个并行度.
Spark 查询 MySQL,Phoenix 等数据库时过滤条件如何下推?
比如我们使用 Spark 的 JDBC 查询 MySQL 的数据有如下的过滤条件
- scala> MySQL.filter("times1>='2019-06-20 00:00:00'and times1 <'2019-06-20 01:00:10'").explain
- == Physical Plan ==
- *(1) Filter ((cast(TIMES1#129 as string)>= 2019-06-20 00:00:00) && (cast(TIMES1#129 as string) <2019-06-20 01:00:10))
- +- *(1) Scan JDBCRelation(test) [numPartitions=1][ID#126L,IP#127,count#128L,TIMES1#129,TOTAL#130L,TIMES2#131,TIMES3#132,TIME4#133] PushedFilters: [*IsNotNull(TIMES1)], ReadSchema: struct<ID:bigint,IP:string,count:bigint,TIMES1:timestamp,TOTAL:bigint,TIMES2:date,TIMES3:string,T...
从上面的例子可以看出, 过滤条件其实是没有下推的, 这样的话查询性能非常差, 我们可以如下修改:
- scala> MySQL.filter("times1>= to_timestamp('2019-06-20 00:00:00') and times1 < to_timestamp('2019-06-20 01:00:10')").explain
- == Physical Plan ==
- *(1) Scan JDBCRelation(test) [numPartitions=1][ID#126L,IP#127,count#128L,TIMES1#129,TOTAL#130L,TIMES2#131,TIMES3#132,TIME4#133] PushedFilters: [*IsNotNull(TIMES1), *GreaterThanOrEqual(TIMES,2019-06-20 00:00:00.0), *LessThan(TIMES,2019-06-20 ..., ReadSchema: struct<ID:bigint,IP:string,count:bigint,TIMES1:timestamp,TOTAL:bigint,TIMES2:date,TIMES3:string,T...
- SparkStreming
SparkStreming 使用 Checkpoint 创建 StreamingContext 修改 executor-cores,executor-memory 等资源信息不生效.
答: 使用 StreamingContext.getOrCreate(checkpointDirectory, functionToCreateContext _) 创建 StreamingContext 会从 Checkpoint 路径中读取 Spark 的配置信息, 不会从控制台读取. 所以如果要更改 Spark 配置信息需要清除 Checkpoint 路径中的内容或者更改 Checkpoint 路径. 详细原因请参考: 详细原因.
来源: https://yq.aliyun.com/articles/710782