sqoop import说可以找到Class <tablename> </tablename>

时间:2015-03-09 04:15:12

标签: hadoop sqoop

我在macbook上安装了sqoop 1,并做了ant包。然后,我将HADOOP_HOMEHADOOP_MAPRED_HOME设置为/usr/local/hadoop处的现有hadoop主页。

当我运行导入命令

bin/sqoop import --options-file /path/sqoop_params.txt --table recipe

其中sqoop_params.txt包含用户名密码和postgres url。

它说

java.lang.Exception: java.lang.RuntimeException: java.lang.ClassNotFoundException: Class recipe not found
    at org.apache.hadoop.mapred.LocalJobRunner$Job.runTasks(LocalJobRunner.java:462)

为什么sqoop会将表名误认为是java类?

2 个答案:

答案 0 :(得分:3)

  1. Sqoop生成可由MapReduce使用的代码。要查看生成的代码,可以使用code-gen tool查看生成的Java文件。它应该与您正常导入的表具有相同的名称。您可以使用--class-name更改名称。

  2. 使用LocalJobRunner时,生成的类有时不会成为类路径的一部分。您可以使用-libjars将jar传递给MapReduce作业。

    示例:

    1. 生成jar:sqoop codegen --connect "jdbc:mysql://example.com/sqoop" --username sqoop --password sqoop --table tbl

    2. 在输出中查找行:Writing jar file: /tmp/sqoop-abe/compile/4182409b0f559d7259a32a950627e1aa/tbl.jar

    3. 在导入命令中使用上述jar:sqoop import -fs local -jt local -libjars /tmp/sqoop-abe/compile/4182409b0f559d7259a32a950627e1aa/tbl.jar --connect "jdbc:mysql://example.com/sqoop" --username sqoop --password sqoop --table tbl

    4. 有关使用本地跑步者的更多信息,请查看此blog post

    5. 除非必须,否则我不会使用本地mapreduce。检查mapreduce配置并确保mapreduce.framework.name未设置为本地。有关详细信息,请查看hadoop docs

答案 1 :(得分:3)

解决此问题的另一种更简单的方法是在scoop上指定bindir选项,该选项告知保存生成的类的位置。

--bindir ./