Hadoop/Sqoop通信链接错误-无法从mysql导入表



我正试图通过sqoop将一个表从mysql导入到hadoop文件系统。然而,sqoop import启动了一个作业,并在映射为0%时陷入困境。

一段时间后,作业失败,出现以下错误

2020-08-12 21:46:08,341 INFO mapreduce.Job: Running job: job_1597282205193_0005
2020-08-12 21:46:20,755 INFO mapreduce.Job: Job job_1597282205193_0005 running in uber mode : false
2020-08-12 21:46:20,758 INFO mapreduce.Job:  map 0% reduce 0%
2020-08-12 21:48:43,458 INFO mapreduce.Job: Task Id : attempt_1597282205193_0005_m_000001_0, Status : FAILED
Error: java.lang.RuntimeException: java.lang.RuntimeException: com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure

为了完整起见,整个命令如下:

sqoop import --connect jdbc:mysql://mysqlserver:3306/DSA_ED --table test --username hadoop -P

Sqoop甚至创建了目录,但没有导入任何内容:

[hadoop@hdpnms ~]$ hdfs dfs -ls
Found 1 items
drwxr-xr-x   - hadoop supergroup          0 2020-08-12 21:59 test
[hadoop@hdpnms ~]$ hdfs dfs -ls test/
[hadoop@hdpnms ~]$

我的设置是:

  • Hadoop的namenode运行在虚拟机(桥接网络(上,与Sqoop相同;纱线担任经理
  • Hadoop的数据节点在各自的两个虚拟机上运行(也桥接(
  • Mysql服务器运行在虚拟机的主机上

虽然表很小(7行(,但我已经尝试过增加虚拟机中的RAM(并相应地重新配置yarn-site.xmlmapred-site.xml(,如这里和这里建议的那样检查与mysql服务器的连接和用户权限

我确信mysql服务器的连接配置是可以的,因为我既可以通过sqoop list-tables看到数据库表(这也告诉我连接驱动程序是可以的(,也可以通过命令行客户端mysql -u hadoop -h mysqlserver -p连接和处理数据库。这让我觉得这一定是sqoop上的一些错误配置。然而,我真的被卡住了,无法理解问题可能是什么。

编辑1

因此,我尝试在主机上使用Postgres服务器,并在hadoop运行实例上试用Mysql服务器。两次都出现了相同的问题。我认为这明确排除了来自外部的连接问题,而且一定是关于Sqoop如何管理工作中的连接。

如果有人遇到同样的问题。。。事实证明,的问题是数据库配置和防火墙中的IP权限。

我假设所有流量都会通过namenode发生,所以只有namenode的IP才能通过防火墙进入数据库服务器,因此我可以通过那里与其他客户端访问它们。但事实证明,在映射作业期间,所有集群的主机都在发出请求。

在授予集群中所有IP的权限后,作业运行顺利。我想,如果必要的话,一定有一些配置可以通过一台机器路由流量,但这解决了问题。

最新更新