【问题标题】:Import data from mysql into HDFS using Sqoop使用 Sqoop 将数据从 mysql 导入 HDFS
【发布时间】:2017-07-03 20:21:52
【问题描述】:

我正在使用 Hadoop-1.2.1 和 Sqoop-1.4.6。我正在使用 sqoop 使用以下命令将表 test 从数据库 meshtree 导入 HDFS:

`sqoop import --connect jdbc:mysql://localhost/meshtree --username user --password password --table test`

但是,它显示了这个错误:

17/06/17 18:15:21 WARN tool.BaseSqoopTool: Setting your password on the     command-line is insecure. Consider using -P instead.
17/06/17 18:15:21 INFO manager.MySQLManager: Preparing to use a MySQL     streaming resultset.
17/06/17 18:15:21 INFO tool.CodeGenTool: Beginning code generation
17/06/17 18:15:22 INFO manager.SqlManager: Executing SQL statement: SELECT     t.* FROM `test` AS t LIMIT 1
17/06/17 18:15:22 INFO orm.CompilationManager: HADOOP_HOME is /home/student    /Installations/hadoop-1.2.1/libexec/..
Note: /tmp/sqoop-student/compile/6bab6efaa3dc60e67a50885b26c1d14b/test.java     uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
17/06/17 18:15:24 ERROR orm.CompilationManager: Could not rename /tmp/sqoop-    student/compile/6bab6efaa3dc60e67a50885b26c1d14b/test.java to /home/student    /Installations/hadoop-1.2.1/./test.java
org.apache.commons.io.FileExistsException: Destination '/home/student    /Installations/hadoop-1.2.1/./test.java' already exists
at org.apache.commons.io.FileUtils.moveFile(FileUtils.java:2378)
at     org.apache.sqoop.orm.CompilationManager.compile(CompilationManager.java:227)
at org.apache.sqoop.tool.CodeGenTool.generateORM(CodeGenTool.java:83)
at org.apache.sqoop.tool.ImportTool.importTable(ImportTool.java:367)
at org.apache.sqoop.tool.ImportTool.run(ImportTool.java:453)
at org.apache.sqoop.Sqoop.run(Sqoop.java:145)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:65)
at org.apache.sqoop.Sqoop.runSqoop(Sqoop.java:181)
at org.apache.sqoop.Sqoop.runTool(Sqoop.java:220)
at org.apache.sqoop.Sqoop.runTool(Sqoop.java:229)
at org.apache.sqoop.Sqoop.main(Sqoop.java:238)
at com.cloudera.sqoop.Sqoop.main(Sqoop.java:57)
17/06/17 18:15:24 INFO orm.CompilationManager: Writing jar file: /tmp/sqoop-    student/compile/6bab6efaa3dc60e67a50885b26c1d14b/test.jar
17/06/17 18:15:24 WARN manager.MySQLManager: It looks like you are importing     from mysql.
17/06/17 18:15:24 WARN manager.MySQLManager: This transfer can be faster! Use     the --direct
17/06/17 18:15:24 WARN manager.MySQLManager: option to exercise a MySQL-    specific fast path.
17/06/17 18:15:24 INFO manager.MySQLManager: Setting zero DATETIME behavior     to convertToNull (mysql)
17/06/17 18:15:24 INFO mapreduce.ImportJobBase: Beginning import of test
17/06/17 18:15:27 INFO mapred.JobClient: Cleaning up the staging area     hdfs://localhost:9000/home/student/Installations/hadoop-1.2.1/data/mapred    /staging/student/.staging/job_201706171814_0001
17/06/17 18:15:27 ERROR security.UserGroupInformation:     PriviledgedActionException as:student     cause:org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory     test already exists
17/06/17 18:15:27 ERROR tool.ImportTool: Encountered IOException running     import job: org.apache.hadoop.mapred.FileAlreadyExistsException: Output     directory test already exists
at     org.apache.hadoop.mapreduce.lib.output.FileOutputFormat.checkOutputSpecs(FileO    utputFormat.java:137)
at org.apache.hadoop.mapred.JobClient$2.run(JobClient.java:973)
at org.apache.hadoop.mapred.JobClient$2.run(JobClient.java:936)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:415)
at     org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1190)
at     org.apache.hadoop.mapred.JobClient.submitJobInternal(JobClient.java:936)
at org.apache.hadoop.mapreduce.Job.submit(Job.java:550)
at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:580)
at org.apache.sqoop.mapreduce.ImportJobBase.runJob(ImportJobBase.java:141)
at     org.apache.sqoop.mapreduce.ImportJobBase.runImport(ImportJobBase.java:201)
at org.apache.sqoop.manager.SqlManager.importTable(SqlManager.java:413)
at org.apache.sqoop.manager.MySQLManager.importTable(MySQLManager.java:97)
at org.apache.sqoop.tool.ImportTool.importTable(ImportTool.java:380)
at org.apache.sqoop.tool.ImportTool.run(ImportTool.java:453)
at org.apache.sqoop.Sqoop.run(Sqoop.java:145)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:65)
at org.apache.sqoop.Sqoop.runSqoop(Sqoop.java:181)
at org.apache.sqoop.Sqoop.runTool(Sqoop.java:220)
at org.apache.sqoop.Sqoop.runTool(Sqoop.java:229)
at org.apache.sqoop.Sqoop.main(Sqoop.java:238)
at com.cloudera.sqoop.Sqoop.main(Sqoop.java:57)

有没有办法解决这个问题?

【问题讨论】:

    标签: mysql hadoop sqoop


    【解决方案1】:

    如果您打算将 Sqoop 与分布式 Hadoop 集群一起使用,请务必不要使用 URL localhost。您提供的连接字符串将用于整个 MapReduce 集群的 TaskTracker 节点;如果您指定文字名称 localhost,则每个节点将连接到不同的数据库(或者更可能根本没有数据库)。 您应该使用所有远程节点都可以看到的数据库主机的完整主机名或 IP 地址

    请访问 Sqoop 文档Connecting to a Database Server 部分了解更多信息。

    【讨论】:

    • 感谢您的解释。我阅读了 Sqoop 文档,非常有帮助,之前的错误已经解决。但是出现了另一个错误。你能帮我解决吗?错误:'线程“主”java.lang.IncompatibleClassChangeError 中的异常:找到类 org.apache.hadoop.mapreduce.JobContext,但在 org.apache.sqoop.config.ConfigurationHelper.getJobNumMaps(ConfigurationHelper.java:65 )'
    • 您使用的是 Hadoop 1.x,但看起来您的 Sqoop 是使用 Hadoop 2.x 编译的。请使用 Hadoop 1.x 编译您的 Sqoop 或下载与 Hadoop 1.x 兼容的 Sqoop 较低版本
    • 感谢您的回复,我尝试下载低版本的sqoop(sqoop-1.4.1)。但是,它仍然对我不起作用。它显示此错误:'ERROR security.UserGroupInformation: PriviledgedActionException: Connection denied ERROR tool.ImportTool: Encountered IOException running import job: Connection denied'
    • 我编辑了我发布的第一个问题并重新发布了完整的错误。你能帮我解决吗?
    【解决方案2】:

    您没有权限。因此请联系 myql dba 授予您相同的权限。 或者,如果您有 mysql 的管理员权限,您也可以自己动手。

    grant all privileges on databasename.* to 'username'@'%' identified by 'password';
    

    *-适用于所有表 %- 允许来自任何主机

    上面的语法是在mysql服务器中授予用户权限。在你的情况下,它将是:-

    grant all privileges on meshtree.test to 'root'@'localhost' identified by 'yourpassword';
    

    【讨论】:

    • 感谢您的解释。当我尝试使用 sqoop 导入命令再次导入数据时,它向我显示另一个错误:'线程“主”java.lang.IncompatibleClassChangeError 中的异常:找到类 org.apache.hadoop.mapreduce.JobContext,但预期接口位于org.apache.sqoop.config.ConfigurationHelper.getJobNumMaps(ConfigurationHelper.java:65)' 你能帮我解决这个错误吗?
    • @Christine Incompitable 类更改错误描述了您的 Sqoop 版本与 Hadoop 版本不匹配。使用与您正在使用的 hadoop 版本相匹配的 SQOOP VERSION..
    • @Christine 如果您提出的问题已解决,则接受答案并再次提出问题。那会很棒!
    • 感谢您的回复。我使用了您发送的命令,但它显示“找不到命令”。因此,我创建了一个具有 GRANT Privileges 的用户。然后,我使用了与 Hadoop 版本兼容的 sqoop 版本(sqoop-1.4.1)。但是,它仍然不起作用。它显示此错误:'ERROR security.UserGroupInformation: PriviledgedActionException: Connection denied' 'ERROR tool.ImportTool: Encountered IOException running import job: Connection denied'
    【解决方案3】:
    • 您在导入时未提供 hdfs 的目标目录。当我们不提供任何目标目录时,sqoop 只运行一次导入并使用您的 mysql 表名在 hdfs 中创建目录。

    所以您的查询

    sqoop import --connect jdbc:mysql://localhost/meshtree --username user --password password --table test

    这会在 hdfs 中创建一个名为 test1 的目录

    • 只需添加以下脚本

    sqoop import --connect jdbc:mysql://localhost/meshtree --username user --password password --table test --target-dir test1

    希望它的工作正常,只需参考sqoop import and all related sqoop

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-05
      • 2021-11-08
      • 2019-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多