Hadoop Sqoop和java7

Hadoop Sqoop和java7,hadoop,java-7,sqoop,Hadoop,Java 7,Sqoop,我正在尝试使用sqoop将MySQL表导入HDFS。我正在使用JDK1.7.0_45和CDH4.4。我实际上在使用cloudera的预构建VM,除了我将JDK更改为1.7,因为我想使用eclipse的pydev插件。我的sqoop版本是1.4.3-cdh4.4.0 当我运行sqoop时,会出现以下异常: 错误:商品:不支持的主次版本51.0 我在过去做这件事时看到过这个错误: 1.编译为Java7 2.使用java 6运行应用程序 但这不是我这次要做的。我相信我的sqoop版本是编译成Java6

我正在尝试使用sqoop将MySQL表导入HDFS。我正在使用JDK1.7.0_45和CDH4.4。我实际上在使用cloudera的预构建VM,除了我将JDK更改为1.7,因为我想使用eclipse的pydev插件。我的sqoop版本是1.4.3-cdh4.4.0

当我运行sqoop时,会出现以下异常:

错误:商品:不支持的主次版本51.0

我在过去做这件事时看到过这个错误: 1.编译为Java7 2.使用java 6运行应用程序

但这不是我这次要做的。我相信我的sqoop版本是编译成Java6的,我正在用Java7运行它,这应该很好。我想也许hadoop正在用JDK 6启动mapper进程,我不知道如何改变这一点。我浏览了mapred配置文档,没有找到任何方法来设置用于map任务的java版本

以下是相关的控制台输出:

[cloudera@localhost ~]$ echo $JAVA_HOME
/usr/java/latest
[cloudera@localhost ~]$ java -version
java version "1.7.0_45"
Java(TM) SE Runtime Environment (build 1.7.0_45-b18)
Java HotSpot(TM) 64-Bit Server VM (build 24.45-b08, mixed mode)
[cloudera@localhost ~]$ sqoop version
Sqoop 1.4.3-cdh4.4.0
git commit id 2cefe4939fd464ba11ef63e81f46bbaabf1f5bc6
Compiled by jenkins on Tue Sep  3 20:41:55 PDT 2013
[cloudera@localhost ~]$ hadoop version
Hadoop 2.0.0-cdh4.4.0
Subversion file:///data/1/jenkins/workspace/generic-package-rhel64-6-0/topdir/BUILD/hadoop-2.0.0-cdh4.4.0/src/hadoop-common-project/hadoop-common -r c0eba6cd38c984557e96a16ccd7356b7de835e79
Compiled by jenkins on Tue Sep  3 19:33:17 PDT 2013
From source with checksum ac7e170aa709b3ace13dc5f775487180
This command was run using /usr/lib/hadoop/hadoop-common-2.0.0-cdh4.4.0.jar
[cloudera@localhost ~]$ cat mysqooper.sh
#!/bin/bash
sqoop import -m 1 --connect jdbc:mysql://localhost/$1 \
--username root --table $2 --target-dir $3
[cloudera@localhost ~]$ ./mysqooper.sh cloud commodity /user/cloudera/commodity/csv/sqooped
14/01/16 16:45:10 INFO manager.MySQLManager: Preparing to use a MySQL streaming resultset.
14/01/16 16:45:10 INFO tool.CodeGenTool: Beginning code generation
14/01/16 16:45:11 INFO manager.SqlManager: Executing SQL statement: SELECT t.* FROM `commodity` AS t LIMIT 1
14/01/16 16:45:11 INFO manager.SqlManager: Executing SQL statement: SELECT t.* FROM `commodity` AS t LIMIT 1
14/01/16 16:45:11 INFO orm.CompilationManager: HADOOP_MAPRED_HOME is /usr/lib/hadoop-0.20-mapreduce
14/01/16 16:45:11 INFO orm.CompilationManager: Found hadoop core jar at: /usr/lib/hadoop-0.20-mapreduce/hadoop-core.jar
Note: /tmp/sqoop-cloudera/compile/f75bf6f8829e8eff302db41b01f6796a/commodity.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
14/01/16 16:45:15 INFO orm.CompilationManager: Writing jar file: /tmp/sqoop-cloudera/compile/f75bf6f8829e8eff302db41b01f6796a/commodity.jar
14/01/16 16:45:15 WARN manager.MySQLManager: It looks like you are importing from mysql.
14/01/16 16:45:15 WARN manager.MySQLManager: This transfer can be faster! Use the --direct
14/01/16 16:45:15 WARN manager.MySQLManager: option to exercise a MySQL-specific fast path.
14/01/16 16:45:15 INFO manager.MySQLManager: Setting zero DATETIME behavior to convertToNull (mysql)
14/01/16 16:45:15 INFO mapreduce.ImportJobBase: Beginning import of commodity
14/01/16 16:45:17 WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments. Applications should implement Tool for the same.
14/01/16 16:45:20 INFO mapred.JobClient: Running job: job_201401161614_0001
14/01/16 16:45:21 INFO mapred.JobClient:  map 0% reduce 0%
14/01/16 16:45:38 INFO mapred.JobClient: Task Id : attempt_201401161614_0001_m_000000_0, Status : FAILED
Error: commodity : Unsupported major.minor version 51.0
14/01/16 16:45:46 INFO mapred.JobClient: Task Id : attempt_201401161614_0001_m_000000_1, Status : FAILED
Error: commodity : Unsupported major.minor version 51.0
14/01/16 16:45:54 INFO mapred.JobClient: Task Id : attempt_201401161614_0001_m_000000_2, Status : FAILED
Error: commodity : Unsupported major.minor version 51.0
14/01/16 16:46:07 INFO mapred.JobClient: Job complete: job_201401161614_0001
14/01/16 16:46:07 INFO mapred.JobClient: Counters: 6
14/01/16 16:46:07 INFO mapred.JobClient:   Job Counters 
14/01/16 16:46:07 INFO mapred.JobClient:     Failed map tasks=1
14/01/16 16:46:07 INFO mapred.JobClient:     Launched map tasks=4
14/01/16 16:46:07 INFO mapred.JobClient:     Total time spent by all maps in occupied slots (ms)=23048
14/01/16 16:46:07 INFO mapred.JobClient:     Total time spent by all reduces in occupied slots (ms)=0
14/01/16 16:46:07 INFO mapred.JobClient:     Total time spent by all maps waiting after reserving slots (ms)=0
14/01/16 16:46:07 INFO mapred.JobClient:     Total time spent by all reduces waiting after reserving slots (ms)=0
14/01/16 16:46:07 WARN mapreduce.Counters: Group FileSystemCounters is deprecated. Use org.apache.hadoop.mapreduce.FileSystemCounter instead
14/01/16 16:46:07 INFO mapreduce.ImportJobBase: Transferred 0 bytes in 51.0252 seconds (0 bytes/sec)
14/01/16 16:46:07 WARN mapreduce.Counters: Group org.apache.hadoop.mapred.Task$Counter is deprecated. Use org.apache.hadoop.mapreduce.TaskCounter instead
14/01/16 16:46:07 INFO mapreduce.ImportJobBase: Retrieved 0 records.
14/01/16 16:46:07 ERROR tool.ImportTool: Error during import: Import job failed!
我试着用JDK1.6运行它,但我真的不想在每次需要使用sqoop时都切换回JDK1.6


有人知道我需要更改什么吗?

我相信您的问题的根本原因是您的Hadoop发行版仍然在JDK6上运行,而不是您认为的JDK7

Sqoop进程将生成使用当前使用的JDK编译的Java代码。因此,如果在JDK7上执行Sqoop,它将使用此JDK7生成和编译代码。生成的代码然后作为mapreduce作业的一部分提交到hadoop集群。因此,如果您在JDK7上运行Sqoop时遇到此不受支持的major.minr异常,则很可能您的Hadoop集群正在JDK6上运行


我强烈建议在hadoop deamons上调用jinfo,以验证它们运行的是哪个JDK。

这是一篇老文章,但添加了一些进一步的信息,因为我在运行混合JDK时遇到了相同的问题:在本地运行java7,在CDH4.4虚拟机上运行java6

cloudera的以下帖子提供了答案:
如果我在一个真正的集群中进行改变,我会遵循这些方向

但我只使用虚拟机,在该文档中有一条重要线索:
/usr/lib64/cmf/service/common/cloudera-config.sh有一个函数 找到_java_home(),它显示/usr/java/jdk1.6*优先于/usr/java/jdk1.7*。
这可能会在以后的Quickstart VM中修复,但我正在寻找一个更快的修复方法。(为开发人员设置新的虚拟机需要一些努力。)

我修复了我的虚拟机,只需更改该文件中的搜索顺序 然后重新启动

HTH,

Glenn

jinfo抛出VMVersionMismatchException。我可以从运行ps aux | grep java中看出,它正在为hadoop jar使用java1.6。我认为问题在于我只是在.bashrc文件中设置了JAVA_主页,但是hadoop JAR都是在启动时启动的,因为cloudera就是这样配置的。所以JAVA_HOME不是为root设置的,也不是由引导时间设置的。我浏览了hadoop conf文件,没有发现java 1.6,它必须设置在/etc/init.d文件中的某个地方,但我仍在试图找出位置。我尝试在根用户的bashrc中设置java_HOME,然后从根用户处执行java-version,确认它使用的是java 7,然后重新启动。尽管如此,hadoop服务仍然以Java6i-modified/etc/profile开始使用Java7。我基本上在所有/etc和/usr和/root中搜索了指向Java1.6的任何内容,但没有找到任何内容。/usr/java中的所有符号链接都指向Java7。尽管如此,这一切仍然是从Java6开始的。我真的没有主意了。