我正试图通过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.xml
和mapred-site.xml
(,如这里和这里建议的那样检查与mysql服务器的连接和用户权限
我确信mysql服务器的连接配置是可以的,因为我既可以通过sqoop list-tables
看到数据库表(这也告诉我连接驱动程序是可以的(,也可以通过命令行客户端mysql -u hadoop -h mysqlserver -p
连接和处理数据库。这让我觉得这一定是sqoop上的一些错误配置。然而,我真的被卡住了,无法理解问题可能是什么。
编辑1
因此,我尝试在主机上使用Postgres服务器,并在hadoop运行实例上试用Mysql服务器。两次都出现了相同的问题。我认为这明确排除了来自外部的连接问题,而且一定是关于Sqoop如何管理工作中的连接。
如果有人遇到同样的问题。。。事实证明,的问题是数据库配置和防火墙中的IP权限。
我假设所有流量都会通过namenode发生,所以只有namenode的IP才能通过防火墙进入数据库服务器,因此我可以通过那里与其他客户端访问它们。但事实证明,在映射作业期间,所有集群的主机都在发出请求。
在授予集群中所有IP的权限后,作业运行顺利。我想,如果必要的话,一定有一些配置可以通过一台机器路由流量,但这解决了问题。