3

我在 sqoop 上运行以下命令

sqoop import --connect jdbc:mysql://localhost/hadoopguide --table widgets

我的 sqoop 版本:Sqoop 1.4.4.2.0.6.1-101
Hadoop -- Hadoop 2.2.0.2.0.6.0-101

两者都取自 hortonworks 发行版。HADOOP_HOME、HCAT_HOME、SQOOP_HOME 等所有路径均已正确设置。我可以通过在 sqoop 中运行 list-database、list-tables 命令从 mysql 数据库中获取数据库列表、表列表。甚至可以从 --query 'select * from widgets' 中获取数据;但是当我使用 --table 选项时出现错误。

14/02/06 14:02:17 WARN mapred.LocalJobRunner: job_local177721176_0001
java.lang.Exception: java.lang.RuntimeException: java.lang.ClassNotFoundException: Class widgets not found
        at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:403)
Caused by: java.lang.RuntimeException: java.lang.ClassNotFoundException: Class widgets not found
        at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:1720)
        at org.apache.sqoop.mapreduce.db.DBConfiguration.getInputClass(DBConfiguration.java:394)
        at org.apache.sqoop.mapreduce.db.DataDrivenDBInputFormat.createDBRecordReader(DataDrivenDBInputFormat.java:233)
        at org.apache.sqoop.mapreduce.db.DBInputFormat.createRecordReader(DBInputFormat.java:236)
        at org.apache.hadoop.mapred.MapTask$NewTrackingRecordReader.<init>(MapTask.java:491)
        at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:734)
        at org.apache.hadoop.mapred.MapTask.run(MapTask.java:339)
        at org.apache.hadoop.mapred.LocalJobRunner$Job$MapTaskRunnable.run(LocalJobRunner.java:235)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:439)
        at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
        at java.util.concurrent.FutureTask.run(FutureTask.java:138)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
        at java.lang.Thread.run(Thread.java:662)
Caused by: java.lang.ClassNotFoundException: Class widgets not found
        at org.apache.hadoop.conf.Configuration.getClassByName(Configuration.java:1626)
        at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:1718)
        ... 13 more
4

5 回答 5

6

指定--bindir编译后的代码和.jar文件的位置。

如果没有这些参数,Sqoop 会将生成的 Java 源文件放在您当前的工作目录中,并将编译后的.class文件和.jar文件放在/tmp/sqoop-<username>/compile.

于 2014-05-08T04:56:01.827 回答
6

使用该--bindir选项并指向您当前的工作目录。

sqoop import --bindir ./ --connect jdbc:mysql://localhost/hadoopguide --table widgets
于 2015-05-20T17:04:57.027 回答
1

在我将 .class 文件从 /tmp/sqoop-hduser/compile/ 复制到 hdfs /home/hduser/ 以及我运行 sqoop 的当前工作目录后,问题得到解决。

于 2014-02-07T11:01:02.743 回答
0

要将特定表导入hdfs,请运行:

sqoop import --connect jdbc:mysql://localhost/databasename --username root --password *** --table tablename --bindir /usr/lib/sqoop/lib/ --driver com.mysql.jdbc.Driver --target-dir /directory-name

确保/usr/lib/sqoop/*并且/usr/local/hadoop/*应该由同一用户拥有,否则会出现“Permission denied”之类的错误。

PS:确保mysql-java在运行命令之前已经安装了连接器。我安装了 hadoop 版本 2.7.3 和连接器 5.0.8

于 2017-07-03T12:18:50.357 回答
0

ClassNotFoundException 的另一个修复是告诉 Hadoop 首先使用用户类路径 (-Dmapreduce.job.user.classpath.first=true)。这可以在命令行或选项文件中。导入选项文件的顶部是:

#Options file for Sqoop import
import

-Dmapreduce.job.user.classpath.first=true

尝试将数据导入为 avrodatafile 时,这为我修复了 ClassNotFoundException

于 2019-11-06T18:36:32.583 回答