环境
1 | <properties> |
测试代码
1 | import org.apache.spark.sql.SparkSession |
现象:通过spark sql 操作报如下错误:
1 | Exception in thread "main" java.lang.ClassNotFoundException: Failed to find data source: kudu. Please find packages at http://spark.apache.org/third-party-projects.html |
而通过KuduContext是可以操作的没有报错,代码为上面注解部分
解决思路
查询kudu官网:https://kudu.apache.org/docs/developing.html
官网中说出了版本的问题:
1 | 如果将Spark 2与Scala 2.11一起使用,请使用kudu-spark2_2.11工件。 |
官网下面说到了下面几个集成问题:
- Spark 2.2+在运行时需要Java 8,即使Kudu Spark 2.x集成与Java 7兼容。Spark 2.2是Kudu 1.5.0的默认依赖版本。
- 当注册为临时表时,必须为名称包含大写或非ascii字符的Kudu表分配备用名称。
- 包含大写或非ascii字符的列名的Kudu表不能与SparkSQL一起使用。可以在Kudu中重命名列以解决此问题。
- <>并且OR谓词不会被推送到Kudu,而是由Spark任务进行评估。只有LIKE带有后缀通配符的谓词才会被推送到Kudu,这意味着它LIKE “FOO%”被推下但LIKE “FOO%BAR”不是。
- Kudu不支持Spark SQL支持的每种类型。例如, Date不支持复杂类型。
- Kudu表只能在SparkSQL中注册为临时表。使用HiveContext可能无法查询Kudu表。
那就很奇怪了我用的1.5.0版本报错为:找不到类,数据源有问题
但是把kudu改成1.9.0 问题解决
运行结果:
1 | root |
Spark集成最佳实践
每个群集避免多个Kudu客户端。
一个常见的Kudu-Spark编码错误是实例化额外的KuduClient对象。在kudu-spark中,a KuduClient属于KuduContext。Spark应用程序代码不应创建另一个KuduClient连接到同一群集。相反,应用程序代码应使用KuduContext访问KuduClient使用
1 | KuduContext#syncClient。 |
要诊断KuduClientSpark作业中的多个实例,请查看主服务器的日志中的符号,这些符号会被来自不同客户端的许多GetTableLocations或 GetTabletLocations请求过载,通常大约在同一时间。这种症状特别适用于Spark Streaming代码,其中创建KuduClient每个任务将导致来自新客户端的主请求的周期性波。
Spark操作kudu(Scala demo)
1 | package cn.zhangyu |