CDH5中spark写mysql报“Did not find registered driver with class com.mysql.jdbc.Driver”错误原因

本文记录了一次使用Spark向MySQL写入数据时遇到的问题及解决过程。主要问题是由于部分Worker节点缺少MySQL驱动导致无法正常运行。通过手动部署驱动到每个Worker节点的指定目录解决了这一问题。

前几天把CDH5.7顺利的装起来了,今天想试下用spark往mysql里面写计算结果,结果老是提示“java.lang.IllegalStateException: Did not find registered driver with class com.mysql.jdbc.Driver”,用了各种方法,包括在spark-submit命令中加入 --jars 、--driver-class-path 都无法解决,都快崩溃了。

去看了下应用日志,发现driver所在的机器没有这个错误,仅仅是剩下的worker才会出现这个错误,于是判断问题的原因应该在于worker中没有mysql的驱动包,打开driver的日志,发现classpath参数是这样的“CLASSPATH -> {{PWD}}<CPS>{{PWD}}/__spark__.jar<CPS>$HADOOP_CLIENT_CONF_DIR<CPS>$HADOOP_CONF_DIR<CPS>$HADOOP_COMMON_HOME/*<CPS>$HADOOP_COMMON_HOME/lib/*<CPS>$HADOOP_HDFS_HOME/*<CPS>$HADOOP_HDFS_HOME/lib/*<CPS>$HADOOP_YARN_HOME/*<CPS>$HADOOP_YARN_HOME/lib/*<CPS>$HADOOP_MAPRED_HOME/*<CPS>$HADOOP_MAPRED_HOME/lib/*<CPS>$MR2_CLASSPATH<CPS>{{HADOOP_COMMON_HOME}}/../../../CDH-5.7.0-1.cdh5.7.0.p0.45/jars/ST4-4.0.4.jar:{{HADOOP_COMMON_HOME}}/../../../CDH-5.7.0-1.cdh5.7.0.p0.45/jars/accumulo-core-1.6.0.jar:......" 太长了,不全部复制了,发现会加载$HADOOP_YARN_HOME/*这个路径下的所有jar包,于是尝试把mysql的驱动包手动拷入每个worker节点中的该目录下,我是CDH5.7,因此目录全路径是“/opt/cloudera/parcels/CDH-5.7.0-1.cdh5.7.0.p0.45/lib/hadoop-yarn”,(每个yarn节点都要拷贝)。

做完这些事后,再跑一遍job,发现成功了,没有报错了,而且结果都写入mysql数据库了。开森!不过有点不明白,为什么CDH不把这些常用的jdbc驱动包一起打进去呢?

### 问题分析 在 Sqoop 运行过程中,出现以下异常: ``` java.lang.RuntimeException: Could not load db driver class: com.mysql.jdbc.Driver ``` 该异常表明 Sqoop 无法加载 MySQL JDBC 驱动类 `com.mysql.jdbc.Driver`。这通常与驱动程序的安装路径、JDBC URL 格式或驱动类名称配置不当有关。 ### 解决方案 #### 1. 确保 MySQL JDBC 驱动已正确安装 Sqoop 依赖外部 JDBC 驱动来连接数据库。MySQLJDBC 驱动(Connector/J)必须被放置在 Sqoop 的 `lib` 目录中。例如: ```bash cp mysql-connector-java-5.1.xx-bin.jar $SQOOP_HOME/lib/ ``` 如果使用的是 CDH 环境,则应将驱动复制到如下路径: ```bash cp mysql-connector-java-5.1.xx-bin.jar /opt/cloudera/parcels/CDH/lib/sqoop/lib/ ``` 确保文件名中的版本号与实际下载的版本一致 [^5]。 #### 2. 检查 JDBC URL 格式是否正确 Sqoop 使用标准的 JDBC URL 来连接数据库。一个典型的 MySQL JDBC URL 应为: ``` jdbc:mysql://<host>:<port>/<database> ``` 例如: ```bash --connect jdbc:mysql://Hadoop48/toplists ``` 若 URL 格式不正确,可能导致连接失败或抛出解析异常 [^3]。 #### 3. 指定正确的 JDBC 驱动类名 在某些情况下,Sqoop 无法自动识别 JDBC 驱动类,需通过 `--driver` 参数显式指定驱动类: ```bash --driver com.mysql.jdbc.Driver ``` 如果使用的是较新的 MySQL Connector/J(如 8.x),则驱动类名可能为: ```bash --driver com.mysql.cj.jdbc.Driver ``` 请根据使用的 Connector/J 版本选择合适的驱动类 [^4]。 #### 4. 验证用户权限和数据库访问权限 如果 Sqoop 错类似: ``` Access denied for user ''@'Hadoop48' to database 'toplists' ``` 说明当前连接的数据库用户没有访问目标数据库的权限。应确保在 MySQL 中为该用户授予相应权限: ```sql GRANT ALL PRIVILEGES ON toplists.* TO '<username>'@'<host>'; FLUSH PRIVILEGES; ``` 此外,检查 Sqoop 命令中是否正确指定了用户名和密码参数: ```bash --username <username> --password <password> ``` #### 5. 确认 Java 环境兼容性 某些旧版本的 Sqoop 和 Hadoop 可能不支持最新版 MySQL JDBC 驱动。建议使用稳定版本的 Connector/J,如 5.1.355.1.49,并确保其与运行环境兼容 [^5]。 --- ### 示例命令 完整 Sqoop 导入命令示例: ```bash sqoop import \ --connect jdbc:mysql://Hadoop48/toplists \ --username root \ --password your_password \ --table test \ --driver com.mysql.jdbc.Driver \ -m 1 ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值