在 Linux Ubuntu 中使用 Apache NiFi 时无法连接到 MySQL 数据库

Not able to connect to MySQL database when using Apache NiFi in Linux Ubuntu

我正在尝试在 上使用 Apache NiFi 连接到 AWS 中的 MySQL RDS 实例LinuxUbuntu.

MySQL 数据库位于 SSH 隧道后面,该隧道在专用终端中运行。 MySQL 数据库可以通过另一个 Linux 终端访问。

$ ssh -i /home/bernardo/.ssh/sshbernardo3.pem -N \
-L 33061:<db_name>.<id>.eu-west-1.rds.amazonaws.com:3306 \
<user>@<ip_address> -p <port>

我已经从 https://downloads.mysql.com/archives/c-j/

上传并解压了 JDBC driver

文件java.sql.Driver位于Linux

目录/usr/share/java/META-INF/services

我已经在 Linux 中安装了 jdbc 连接器并设置用户使用 JDBC

$ sudo apt-get install libmysql-java
$ cd /home/bernardo
$ gedit .bashrc

在文件末尾添加了以下行:

# Setting up the user to use JDBC
CLASSPATH=$CLASSPATH:/usr/share/java/mysql-connector-java-8.0.26.jar
export CLASSPATH

然后来源:

$ source .bashrc

在 NiFi 中,我使用了 DBCPConnectionPool1.15.2 控制器服务,其配置如下:

• 数据库连接 URL:jbdc:mysql://127.0.0.1:33061/<db_name>

• 数据库 Driver Class 名称:java.sql.Driver

• 数据库 Driver 位置:/usr/share/java/META-INF/services

• 数据库用户:<db_user>

• 密码:<db_password>

启用控制器服务时,出现以下错误:

StandardControllerServiceNode[service=DBCPConnectionPool[id=2440f624-017e-1000-9467-8bb12dda6ca6], name=<controller_service_name>, active=true] Failed to invoke @OnEnabled method due to java.lang.NoSuchMethodException: java.sql.Driver.() causes: java.lang.InstantiationException: java.sql.Driver causes: org.apache.nifi.processor.exception.ProcessException: Creating driver instance is failed: Creating driver instance is failed

有什么提示吗?

这是我安装的软件:

谢谢,

贝尔纳多


编辑于 2022 年 1 月 6 日 08:50 UTC

我对 DBCPConnectionPool1.15.2 控制器服务配置进行了以下更改:

• 数据库 Driver Class 名称:com.mysql.cj.jdbc.Driver

• 数据库 Driver 位置:/usr/share/java/mysql-connector-java-8.0.26.jar

其他参数不变:

• 数据库连接 URL:jbdc:mysql://127.0.0.1:33061/<db_name>

• 数据库用户:<db_user>

• 密码:<db_password>

文件 mysql-connector-java-8.0.26.jar/usr/share/java

还有:

$ cat /usr/share/java/META-INF/services/java.sql.Driver
com.mysql.cj.jdbc.Driver

并且:

$ netstat -nplt

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name

tcp 0 0 127.0.0.1:33061 0.0.0.0:* LISTEN 4873/ssh
tcp6 0 0 ::1:33061 :::* LISTEN 4873/ssh

仍然出现错误(这次是 新错误):

causes: org.apache.nifi.processor.exception.ProcessException: No suitable driver for the given Database Connection URL

访问 driver jar 文件的权限:

bernardo@BDi-laptop:/usr/share/java$ ls -l

-rwxrwxr-- 1 bernardo bernardo 2462344 gen  4 19:01 mysql-connector-java-8.0.26.jar

编辑于 2022 年 1 月 6 日 10:21 UTC

也在 /etc/environment

中添加了 CLASSPATH 变量
bernardo@BDi-laptop:/usr/share/java$ echo $CLASSPATH
.:/usr/share/java/mysql-connector-java-8.0.26.jar:/usr/share/java/mysql-connector-java-8.0.26.jar

编辑于 2022 年 1 月 7 日 09:08 UTC

我认为这可能是与 driver 版本 有关的问题,所以我 re-installed jdbc driver。我已经从旧的 sql 相关文件中清除了 /home/bernardo/Download/usr/share/java。然后我又安装了一遍

安装 jdbc 连接器

$ sudo apt-get install libmysql-java

.jar 文件在 /usr/share/java/mysql-connector-java-5.1.45.jar 解压 .jar 文件

$ sudo jar xvf /usr/share/java/mysql-connector-java-5.1.45.jar

要查找 driver class 名称,请打开 /usr/share/java/META-INF/services/java.sql.Driver

$ cat /usr/share/java/META-INF/services/java.sql.Driver

com.mysql.jdbc.Driver

com.mysql.fabric.jdbc.FabricMySQLDriver

driverclass名字是:com.mysql.jdbc.Driver

这是 Apache 中 DBCPConnectionPool1.15.2 控制器服务的更新配置 Ni-Fi:

• 数据库 Driver Class 名称:com.mysql.jdbc.Driver

• 数据库 Driver 位置:/usr/share/java/mysql-connector-java-5.1.45.jar

• 数据库连接 URL:jbdc:mysql://127.0.0.1:33061/<db_name>

• 数据库用户:<db_user>

• 密码:<db_password>

我得到了同样的结果:

causes: org.apache.nifi.processor.exception.ProcessException: No suitable driver for the given Database Connection URL

然后我检查了问题是否在 SSH 隧道

$ netstat -nplt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address          State       PID/Program name    
tcp        0      0 127.0.0.1:33061         0.0.0.0:*               LISTEN      4497/ssh
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      -                              
tcp6       0      0 ::1:33061               :::*                    LISTEN      4497/ssh     

$ cat /proc/4497/status

Name:   ssh
State:  S (sleeping)

SSH 进程处于休眠状态。

在一个单独的终端中,我访问了远程 MySQL 数据库:

$ mysql -u <db_user> -p -h 127.0.0.1 -P 33061

最后,我尝试使用以下 Ni-Fi 设置连接到本地 Linux 实例中的本地 mysql 数据库:

• 数据库 Driver Class 名称:com.mysql.jdbc.Driver

• 数据库 Driver 位置:/usr/share/java/mysql-connector-java-5.1.45.jar

• 数据库连接 URL:jbdc:mysql://127.0.0.1:3306/<local_db_name>

• 数据库用户:<local_db_user>

• 密码:<local_db_password>

我得到了同样的结果:

causes: org.apache.nifi.processor.exception.ProcessException: No suitable driver for the given Database Connection URL

不过,在单独的 Linux 终端中,我可以访问本地 mysql 数据库:

$ mysql -u <local_db_user> -p -h 127.0.0.1 -P 3306

编辑于 2022 年 1 月 10 日 11:58 UTC

更正了 Ni-Fi 控制器服务配置中的拼写错误:

• 数据库连接 URL:jdbc:mysql://127.0.0.1:33061/

控制器服务问题已解决!

谢谢!


编辑于 2022 年 1 月 12 日 08:26 UTC

我仍然遇到连接问题。我设法启用了控制器服务,但是,当我 运行 处理器 QueryDatabaseTable 时,我收到以下错误:Cannot create PoolableConnectionFactory - Communications link failure

QueryDatabaseTable[id=017e1003-c2d8-14cf-4e34-feee76411595] Unable to execute SQL select query SELECT * FROM periodic_measurements_test due to java.sql.SQLException: Cannot create PoolableConnectionFactory (Communications link failure

The last packet successfully received from the server was 0 milliseconds ago. The last packet sent successfully to the server was 0 milliseconds ago.): javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate) ↳ causes: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet successfully received from the server was 0 milliseconds ago. The last packet sent successfully to the server was 0 milliseconds ago. ↳ causes: java.sql.SQLException: Cannot create PoolableConnectionFactory (Communications link failure

The last packet successfully received from the server was 0 milliseconds ago. The last packet sent successfully to the server was 0 milliseconds ago.) ↳ causes: org.apache.nifi.processor.exception.ProcessException: java.sql.SQLException: Cannot create PoolableConnectionFactory (Communications link failure

The last packet successfully received from the server was 0 milliseconds ago. The last packet sent successfully to the server was 0 milliseconds ago.)

处理器配置为默认配置,除了:

• 数据库连接池服务:

• 数据库类型:MySQL

• Table 姓名:periodic_measurements_test

控制器服务配置仍然是:

• 数据库连接 URL:[=57=

• 数据库 Driver Class 名称:com.mysql.jdbc.Driver

• 数据库 Driver 位置:/usr/share/java/mysql-connector-java-5.1.45.jar

• 数据库用户:<db_user>

• 密码:<db_password>

SSH 隧道似乎没问题:

netstat -nplt

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 127.0.0.1:33061         0.0.0.0:*               LISTEN      29483/ssh           
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      -                                      
tcp        0      0 127.0.0.1:8443          0.0.0.0:*               LISTEN      -     

并且在 Linux 终端中,我仍然可以通过 CLI 访问 MySQL 数据库:

$ mysql -u <db_user> -p -h 127.0.0.1 -P 33061

当我尝试从本地 Linux 实例中的 MySQL 数据库获取数据时,我得到了相同的结果。

最后,我设法解决了这个问题。跟jdbcdriver.

的版本有关

我做了以下事情:

在 Linux 浏览器中转到 https://dev.mysql.com/downloads/connector/j/

Select

• Ubuntu Linux

• 18.04

下载

在 CLI 终端中转到下载目录

$ cd /home/bernardo/Downloads

解压 deb 文件

$ sudo dpkg -i mysql-connector-java_8.0.26-1ubuntu18.04_all.deb

检查连接器在文件系统中的位置

$ dpkg -L mysql-connector-java | fgrep jar

/usr/share/java/mysql-connector-java-8.0.26.jar

从之前的 jdbc driver

中清除 /usr/share/java
$ sudo rm mysql-connector-java-5.1.45.jar
$ sudo rm -r com
$ sudo rm -r META-INF/

安装连接器:解压 .jar 文件

$ sudo jar xvf /usr/share/java/mysql-connector-java-8.0.26.jar

要查找 driver class 名称,请打开 /usr/share/java/META-INF/services/java.sql.Driver

$ cat /usr/share/java/META-INF/services/java.sql.Driver
com.mysql.cj.jdbc.Driver

driver class 名称是:com.mysql.jdbc.Driver

重新启动 Apache Ni-Fi

修改控制器服务的配置:

• 数据库 Driver Class 名称:com.mysql.cj.jdbc.Driver

• 数据库 Driver 位置:/usr/share/java/mysql-connector-java-8.0.26.jar