无法执行 Sqoop 导入
Posted
技术标签:
【中文标题】无法执行 Sqoop 导入【英文标题】:Unable to perform Sqoop import 【发布时间】:2014-09-09 12:29:01 【问题描述】:我无法将数据从 mysql 导入到 Hdfs。我的 bashrc 和 sqoop-env.sh 文件很好。我也能够成功运行 sqoop list-databases 命令。问题是导入命令引发了 outputconnectionfailed 异常,请参考以下错误并帮助我:
块引用 rahul@ubuntu:~$ sqoop import --connect jdbc:mysql://localhost/rahul --username root --password 123 --table emp -m1 --target-dir /sqoopimport/emp 警告:/usr/lib/hbase 不存在! HBase 导入 将失败。请将 $HBASE_HOME 设置为 HBase 的根目录 安装。 14/09/09 01:22:45 WARN tool.BaseSqoopTool:设置你的 命令行上的密码不安全。考虑改用 -P。 14/09/09 01:22:45 INFO manager.MySQLManager:准备使用 MySQL 流式传输结果集。 14/09/09 01:22:45 信息工具.CodeGenTool: 开始代码生成 14/09/09 01:22:45 INFO manager.SqlManager: 执行 SQL 语句:SELECT t.* FROM
emp
AS t LIMIT 1 14/09/09 01:22:45 INFO manager.SqlManager:执行 SQL 语句:SELECT t.* FROMemp
AS t LIMIT 1 14/09/09 01:22:45 信息 orm.CompilationManager: HADOOP_MAPRED_HOME 是 /usr/local/hadoop 注意: /tmp/sqoop-rahul/compile/a81597835880664d34a2ff0e4c7b9b33/emp.java 使用或覆盖已弃用的 API。注意:重新编译 -Xlint:deprecation 了解详情。 14/09/09 01:22:46 信息 orm.CompilationManager:编写 jar 文件: /tmp/sqoop-rahul/compile/a81597835880664d34a2ff0e4c7b9b33/emp.jar 14/09/09 01:22:46 WARN manager.MySQLManager:看起来你是 从 mysql 导入。 14/09/09 01:22:46 警告 manager.MySQLManager: 这种传输可以更快!使用 --direct 14/09/09 01:22:46 WARN manager.MySQLManager:用于执行 MySQL 特定快速路径的选项。 14/09/09 01:22:46 INFO manager.MySQLManager:将 DATETIME 设置为零 convertToNull (mysql) 14/09/09 01:22:46 INFO 的行为 mapreduce.ImportJobBase:开始导入 emp 14/09/09 01:22:47 信息 mapred.JobClient:正在运行的作业:job_201409090100_0003 14/09/09 01:22:48 INFO mapred.JobClient: map 0% reduce 0% 14/09/09 01:22:54 信息 mapred.JobClient:任务 ID:尝试_201409090100_0003_m_000000_0, 状态:失败 java.lang.RuntimeException: java.lang.RuntimeException: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: 通讯链路故障最后一个成功发送到服务器的数据包是 0 毫秒 前。驱动程序没有收到来自服务器的任何数据包。 在 org.apache.sqoop.mapreduce.db.DBInputFormat.setConf(DBInputFormat.java:167) 在 org.apache.hadoop.util.ReflectionUtils.setConf(ReflectionUtils.java:62) 在 org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:117) 在 org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:722) 在 org.apache.hadoop.mapred.MapTask.run(MapTask.java:364) 在 org.apache.hadoop.mapred.Child$4.run(Child.java:255) 在 java.security.AccessController.doPrivileged(本机方法) 在 javax.security.auth.Subject.doAs(Subject.java:415) 在 org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1190) 在 org.apache.hadoop.mapred.Child.main(Child.java:249) 引起:java.lang.RuntimeException: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: 通讯链路故障
最后一个成功发送到服务器的数据包是 0 毫秒 前。驱动程序没有收到来自服务器的任何数据包。 在 org.apache.sqoop.mapreduce.db.DBInputFormat.getConnection(DBInputFormat.java:193) 在 org.apache.sqoop.mapreduce.db.DBInputFormat.setConf(DBInputFormat.java:162) ... 9 更多原因:com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: 通讯链路故障
最后一个成功发送到服务器的数据包是 0 毫秒 前。驱动程序没有收到来自服务器的任何数据包。 在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 在 java.lang.reflect.Constructor.newInstance(Constructor.java:526) 在 com.mysql.jdbc.Util.handleNewInstance(Util.java:411) 在 com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1121) 在 com.mysql.jdbc.MysqlIO.(MysqlIO.java:355) 在 com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2479) 在 com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2516) 在 com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2301) 在 com.mysql.jdbc.ConnectionImpl.(ConnectionImpl.java:834) 在 com.mysql.jdbc.JDBC4Connection.(JDBC4Connection.java:47) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 在 java.lang.reflect.Constructor.newInstance(Constructor.java:526) 在 com.mysql.jdbc.Util.handleNewInstance(Util.java:411) 在 com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:416) 在 com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:317) 在 java.sql.DriverManager.getConnection(DriverManager.java:571) 在 java.sql.DriverManager.getConnection(DriverManager.java:215) 在 org.apache.sqoop.mapreduce.db.DBConfiguration.getConnection(DBConfiguration.java:278) 在 org.apache.sqoop.mapreduce.db.DBInputFormat.getConnection(DBInputFormat.java:187) ... 10 更多原因:java.net.ConnectException:连接被拒绝 在 java.net.PlainSocketImpl.socketConnect(本机方法) 在 java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339) 在 java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200) 在 java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182) 在 java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) 在 java.net.Socket.connect(Socket.java:579) 在 java.net.Socket.connect(Socket.java:528) 在 java.net.Socket.(Socket.java:425) 在 java.net.Socket.(Socket.java:241) 在 com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:259) 在 com.mysql.jdbc.MysqlIO.(MysqlIO.java:305) ... 26 更多
14/09/09 01:22:54 WARN mapred.JobClient: 读取任务时出错 outputConnection 被拒绝 14/09/09 01:22:54 WARN mapred.JobClient: 错误读取任务输出连接被拒绝 14/09/09 01:22:59 INFO mapred.JobClient:任务 ID:尝试_201409090100_0003_m_000000_1, 状态:失败 java.lang.RuntimeException: java.lang.RuntimeException: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: 通讯链路故障
最后一个成功发送到服务器的数据包是 0 毫秒 前。驱动程序没有收到来自服务器的任何数据包。 在 org.apache.sqoop.mapreduce.db.DBInputFormat.setConf(DBInputFormat.java:167) 在 org.apache.hadoop.util.ReflectionUtils.setConf(ReflectionUtils.java:62) 在 org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:117) 在 org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:722) 在 org.apache.hadoop.mapred.MapTask.run(MapTask.java:364) 在 org.apache.hadoop.mapred.Child$4.run(Child.java:255) 在 java.security.AccessController.doPrivileged(本机方法) 在 javax.security.auth.Subject.doAs(Subject.java:415) 在 org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1190) 在 org.apache.hadoop.mapred.Child.main(Child.java:249) 引起:java.lang.RuntimeException: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: 通讯链路故障
最后一个成功发送到服务器的数据包是 0 毫秒 前。驱动程序没有收到来自服务器的任何数据包。 在 org.apache.sqoop.mapreduce.db.DBInputFormat.getConnection(DBInputFormat.java:193) 在 org.apache.sqoop.mapreduce.db.DBInputFormat.setConf(DBInputFormat.java:162) ... 9 更多原因:com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: 通讯链路故障
最后一个成功发送到服务器的数据包是 0 毫秒 前。驱动程序没有收到来自服务器的任何数据包。 在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 在 java.lang.reflect.Constructor.newInstance(Constructor.java:526) 在 com.mysql.jdbc.Util.handleNewInstance(Util.java:411) 在 com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1121) 在 com.mysql.jdbc.MysqlIO.(MysqlIO.java:355) 在 com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2479) 在 com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2516) 在 com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2301) 在 com.mysql.jdbc.ConnectionImpl.(ConnectionImpl.java:834) 在 com.mysql.jdbc.JDBC4Connection.(JDBC4Connection.java:47) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 在 java.lang.reflect.Constructor.newInstance(Constructor.java:526) 在 com.mysql.jdbc.Util.handleNewInstance(Util.java:411) 在 com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:416) 在 com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:317) 在 java.sql.DriverManager.getConnection(DriverManager.java:571) 在 java.sql.DriverManager.getConnection(DriverManager.java:215) 在 org.apache.sqoop.mapreduce.db.DBConfiguration.getConnection(DBConfiguration.java:278) 在 org.apache.sqoop.mapreduce.db.DBInputFormat.getConnection(DBInputFormat.java:187) ... 10 更多原因:java.net.ConnectException:连接被拒绝 在 java.net.PlainSocketImpl.socketConnect(本机方法) 在 java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339) 在 java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200) 在 java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182) 在 java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) 在 java.net.Socket.connect(Socket.java:579) 在 java.net.Socket.connect(Socket.java:528) 在 java.net.Socket.(Socket.java:425) 在 java.net.Socket.(Socket.java:241) 在 com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:259) 在 com.mysql.jdbc.MysqlIO.(MysqlIO.java:305) ... 26 更多
14/09/09 01:22:59 WARN mapred.JobClient: 读取任务时出错 outputConnection 被拒绝 14/09/09 01:22:59 WARN mapred.JobClient: 错误读取任务输出连接被拒绝 14/09/09 01:23:03 INFO mapred.JobClient:任务 ID:尝试_201409090100_0003_m_000000_2, 状态:失败 java.lang.RuntimeException: java.lang.RuntimeException: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:
最后一个成功发送到服务器的数据包是 0 毫秒 前。驱动程序没有收到任何数据包 在 org.apache.sqoop.mapreduce.db.DBInputFormat.setConf(DBInputFormat.java:167) 在 org.apache.hadoop.util.ReflectionUtils.setConf(ReflectionUtils.java:62) 在 org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:117) 在 org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:722) 在 org.apache.hadoop.mapred.MapTask.run(MapTask.java:364) 在 org.apache.hadoop.mapred.Child$4.run(Child.java:255) 在 java.security.AccessController.doPrivileged(本机方法) 在 javax.security.auth.Subject.doAs(Subject.java:415) 在 org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1190) 在 org.apache.hadoop.mapred.Child.main(Child.java:249) 引起:java.lang.RuntimeException: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: 通讯 l
最后一个成功发送到服务器的数据包是 0 毫秒 前。驱动程序没有收到任何数据包 在 org.apache.sqoop.mapreduce.db.DBInputFormat.getConnection(DBInputFormat.java:193) 在 org.apache.sqoop.mapreduce.db.DBInputFormat.setConf(DBInputFormat.java:162) ... 9 更多原因:com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: 通讯链路故障
最后一个成功发送到服务器的数据包是 0 毫秒 前。驱动程序没有收到任何数据包 在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 在 java.lang.reflect.Constructor.newInstance(Constructor.java:526) 在 com.mysql.jdbc.Util.handleNewInstance(Util.java:411) 在 com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1121) 在 com.mysql.jdbc.MysqlIO.(MysqlIO.java:355) 在 com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2479) 在 com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2516) 在 com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2301) 在 com.mysql.jdbc.ConnectionImpl.(ConnectionImpl.java:834) 在 com.mysql.jdbc.JDBC4Connection.(JDBC4Connection.java:47) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 在 java.lang.reflect.Constructor.newInstance(Constructor.java:526) 在 com.mysql.jdbc.Util.handleNewInstance(Util.java:411) 在 com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:416) 在 com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:317) 在 java.sql.DriverManager.getConnection(DriverManager.java:571) 在 java.sql.DriverManager.getConnection(DriverManager.java:215) 在 org.apache.sqoop.mapreduce.db.DBConfiguration.getConnection(DBConfiguration.java:278) 在 org.apache.sqoop.mapreduce.db.DBInputFormat.getConnection(DBInputFormat.java:187) ... 10 更多原因:java.net.ConnectException:连接被拒绝 在 java.net.PlainSocketImpl.socketConnect(本机方法) 在 java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339) 在 java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200) 在 java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182) 在 java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) 在 java.net.Socket.connect(Socket.java:579) 在 java.net.Socket.connect(Socket.java:528) 在 java.net.Socket.(Socket.java:425) 在 java.net.Socket.(Socket.java:241) 在 com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:259) 在 com.mysql.jdbc.MysqlIO.(MysqlIO.java:305) ... 26 更多
14/09/09 01:23:03 WARN mapred.JobClient: 读取任务时出错 outputConnection 被拒绝 14/09/09 01:23:03 WARN mapred.JobClient: 错误读取任务输出连接被拒绝 14/09/09 01:23:09 INFO mapred.JobClient:作业完成:job_201409090100_0003 14/09/09 01:23:09 信息 mapred.JobClient:计数器:6 09 年 14 月 9 日 01:23:09 信息 mapred.JobClient:作业计数器 14/09/09 01:23:09 信息 mapred.JobClient: SLOTS_MILLIS_MAPS=20325 14/09/09 01:23:09 信息 mapred.JobClient:所有减少等待后花费的总时间 预留槽 (ms)= 14/09/09 01:23:09 INFO mapred.JobClient: 保留槽后所有地图等待的总时间(毫秒)=0 14/09/09 01:23:09 INFO mapred.JobClient:启动的地图任务 = 4 14/09/09 01:23:09 信息 mapred.JobClient: SLOTS_MILLIS_REDUCES=0 14/09/09 01:23:09 INFO mapred.JobClient:地图任务失败=1 14/09/09 01:23:09 INFO mapreduce.ImportJobBase:传输 0 个字节 23.174 秒(0 字节/秒)14/09/09 01:23:09 INFO mapreduce.ImportJobBase:检索到 0 条记录。 14/09/09 01:23:09 错误 tool.ImportTool:导入期间出错:导入作业失败! 块引用
【问题讨论】:
【参考方案1】:我修好了。问题是我在导入语句中使用了 localhost,因为 sql 在同一个系统中运行。当我使用实际 IP 而不是 localhost 时。然后它就像一个魅力。
我也使用 root 用户名和密码连接到 sql。由于某种原因它不起作用。所以我创建了另一个用户并将所有权限授予该用户。
GRANT ALL PRIVILEGES ON employee.* to 'sqoopuser'@'%' IDENTIFIED BY 'passphrase';
错误:sqoop import --connect jdbc:mysql://localhost/rahul --username root --password 123 --table emp -m1 --target-dir /sqoopimport/emp
更正:sqoop import --connect jdbc:mysql://192.168.202.139:3306/rahul --username sqoopuser --password 123 --table emp -m1 --target-dir /sqoopimport/emp
【讨论】:
【参考方案2】:一共有三个检查点:
-
确保 mysql 服务可访问 -> 手动连接到
localhost:3306
为 root
。
确保localhost:3306
没有防火墙限制
将最新的 mysql-connector 下载到 lib,然后再次导入。
【讨论】:
【参考方案3】:我的解决方案是在 sqoop 命令中使用正确的 IP 地址而不是“localhost”:
sqoop import --connect jdbc:mysql://192.168.69.69:3306/testdb --username root -P --table TESTABLE --target-dir /data/import
【讨论】:
以上是关于无法执行 Sqoop 导入的主要内容,如果未能解决你的问题,请参考以下文章