标签归档:spark

RSS feed of spark

[Spark] MySQL 踩坑记录

scala代码实现连接mysql

首先在 sbt 配置文件里添加:

"mysql" % "mysql-connector-java" % "8.0.12",

踩到的坑

1

使用 JDBC 访问特定数据库时,需要在 spark classpath 上添加对应的 JDBC 驱动配置。

--driver-class-path lib/mysql-connector-java-8.0.12.jar

不然代码在本地 sbt run 运行是没有问题, 但是放在服务器上用 spark-submit 提交的话,可能会报异常:

com.mysql.jdbc.Driver

2

运行项目中提示:

The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.

'com.mysql.jdbc.Driver' 驱动类被弃用了,新的驱动类是 'com.mysql.cj.jdbc.Driver'。 这个驱动会通过 SPI 的方式自动加载,通常不需要人工手动加载。

val pool = MysqlConnectionPool(dbHost, dbUser, dbPasswd,  "com.mysql.cj.jdbc.Driver") 

本文链接:/2018/08/14/spark-mysql/
请尊重作者的劳动成果,转载请注明出处!Sakishum 博客保留对文章的所有权利。

Spark 异常 requirement failed: numRecords must not be negative

问题描述

SparkStreaming 报错:

Exception in thread "main" java.lang.IllegalArgumentException: requirement failed: numRecords must not be negative

按字面意思理解,说是传入的偏移量是负数,但经过检查其实并没有赋任何负数给偏移量。昨天还跑的好好的程序今天怎么就不行了呢?然而重启并不能解决这个问题,只能研究一下了。根据提示猜想可能是 kafka topic 的 offset 越界导致的问题, 按照这个思路最后查到了原因:

log.retention.hours=24 (The minimum age of a log file to be eligible for deletion) 因此,应该是 kafka 中未被消费的数据被 broker 清除了,使得 zk 中的 offset 落在仍存在的最老 message offset 的左侧,本来合法的 offset变得不非法了。

在我的配置文件中 kafka/config/server.properties :

log.retention.hours=168

设置的时间是 168 小时( 7 天),项目里的这个 topic 从创建到今天已经超过 7 天,所以踩到了这个坑。

解决办法:

  • 及时消费掉目标 topic 中的数据,并且消费延时不能大于 log.retention.hours 的配置;
  • 为这个异常做容错处理,能让 job 继续执行。

Done.

本文链接:/2018/05/27/result-spark-requirement-failed-numrecords-must-not-be-negative/
请尊重作者的劳动成果,转载请注明出处!Sakishum 博客保留对文章的所有权利。