我试图通过sqoop从mysql导入表到hadoop文件系统。但是,sqoop import
会启 Action 业,并被困在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 ~]$
我的设置是:尽管表很小(7行),但我尝试根据建议的here来增加虚拟机中的RAM(并相应地重新配置
yarn-site.xml
和mapred-site.xml
),并根据here和here来检查与mysql服务器的连接以及用户权限我肯定mysql服务器的连接配置是可以的,因为我既可以看到数据库表是
sqoop list-tables
的结果(这也告诉我连接驱动程序是可以的),并且可以通过命令行客户端mysql -u hadoop -h mysqlserver -p
来连接和处理数据库。这使我认为必须在sqoop上进行一些错误配置。但是我真的很困,无法理解问题所在。编辑1
因此,我尝试在主机上使用Postgres服务器,并在hadoop运行实例上尝试使用Mysql服务器。两次都发生相同的问题。我认为这绝对可以从外部排除连接问题,并且必须与Sqoop如何管理作业上的连接有关。
最佳答案
万一有人碰到了同样的问题...事实证明,在数据库的配置和防火墙中,是IP权限的问题。
我假设所有流量都将通过名称节点发生,因此只有名称节点的IP被允许通过防火墙并进入数据库服务器,因此我可以与其他客户端通过它们进行访问。但是事实证明,在映射作业期间,所有群集的主机都在发出请求。
授予群集中所有IP的许可后,作业运行顺利。我想如果必要的话,必须有一些配置可以通过一台计算机路由流量,但这解决了这个问题。
关于mysql - Hadoop/Sqoop通信链接错误-无法从MySQL导入表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63387461/