SQOOP无法导入表格

时间:2014-02-06 10:12:25

标签: hadoop sqoop sqoop2

我在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

5 个答案:

答案 0 :(得分:6)

指定编译代码和--bindir文件所在的.jar

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

答案 1 :(得分:6)

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

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

答案 2 :(得分:0)

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

答案 3 :(得分: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/*应由同一用户拥有,否则会出现“权限被拒绝”等错误。

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

答案 4 :(得分:0)

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

#Options file for Sqoop import
import

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

当我尝试将数据作为avrodatafile导入数据时,此修正的ClassNotFoundException对我来说