2014-01-17 2 views
0

sqoop을 사용하여 MySQL 테이블을 HDFS로 가져 오려고합니다. JDK 1.7.0_45 및 CDH4.4를 사용하고 있습니다. Eclipse에서 pydev 플러그인을 사용하기 때문에 JDK를 1.7로 변경한다는 점을 제외하고는 실제로 cloudera의 사전 빌드 된 VM을 사용하고 있습니다. 내 sqoop 버전은 1.4.3-cdh4.4.0입니다.Sqoop 및 Java 7

나는이 예외 얻을 Sqoop을 내가 실행

오류 : 상품 : 지원되지 않는 MAJOR.MINOR 버전 내가했을 때 내가 과거에이 오류를 보았다 51.0

을이 : 1. 자바로 컴파일 7 2. Java 6로 응용 프로그램을 실행하십시오.

하지만이 시간은 제가 현재하고있는 것이 아닙니다. 나는 내 sqoop 버전이 java 6으로 컴파일되었다고 믿고, Java 7로 실행하고있다. 완벽하게 괜찮을 것이다. 아마 hadoop이 JDK 6으로 매퍼 프로세스를 시작한다고 생각합니다. 어떻게 변경해야할지 모르겠습니다. 맵핑 된 구성 문서를 살펴본 후지도 작업에 사용할 Java 버전을 설정하는 방법을 찾지 못했습니다.

다음은 관련 콘솔 출력 :

[[email protected] ~]$ echo $JAVA_HOME 
/usr/java/latest 
[[email protected] ~]$ 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) 
[[email protected] ~]$ 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 
[[email protected] ~]$ 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 
[[email protected] ~]$ cat mysqooper.sh 
#!/bin/bash 
sqoop import -m 1 --connect jdbc:mysql://localhost/$1 \ 
--username root --table $2 --target-dir $3 
[[email protected] ~]$ ./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! 

내가 JDK 1.6 실행 시도하고 작동하지만, 난 정말 다시 그에게 내가 Sqoop을을 사용해야 할 때마다 전환하고 싶지 않아요.

내가 무엇을 바꾸어야하는지 아는 사람이 있습니까?

답변

1

나는 당신의 문제의 근본 원인이 그렇게 믿는다면 Hadoop 배포판이 JDK6에서 실행 중이며 JDK7에서는 실행되고 있지 않다는 사실을 알았습니다.

Sqoop 프로세스는 현재 사용되는 JDK로 컴파일 된 Java 코드를 생성합니다. 따라서 JDK7에서 Sqoop을 실행하면이 JDK7로 코드를 생성하고 컴파일합니다. 생성 된 코드는 mapreduce job의 일환으로 hadoop 클러스터에 제출됩니다. 따라서 JDK7에서 Sqoop을 실행하는 동안 지원되지 않는 major.minr 예외가 발생하면 Hadoop 클러스터가 JDK6에서 실행될 가능성이 큽니다.

hadoop 데몬에서 jinfo를 호출하여 실행중인 JDK를 확인하는 것이 좋습니다.

+0

있는 jinfo는 VMVersionMismatchException을 던진다. ps aux를 실행하면 볼 수 있습니다. | 그것이 hadoop 항아리에 대한 자바 1.6을 사용하고있는 grep java. 문제는 방금 내 JAVA_HOME을 .bashrc 파일에 설정했지만, hadoop 항아리가 부팅시 시작된다는 것입니다. cloudera가 설정 한 방식이기 때문입니다. 따라서 JAVA_HOME은 루트로 설정되지 않으며, 부팅 시간으로 설정되지 않습니다. 내가 hadoop conf 파일을 감싸고 자바 1.6에 대한 언급이 없다는 것을 발견했다면 /etc/init.d 파일의 어딘가에 설정해야하지만, 여전히 어디 있는지 알아 내려고합니다. – msknapp

+0

나는 루트 사용자의 bashrc에서 JAVA_HOME을 설정하려고 시도했다. 그런 다음 루트에서 java -version을 실행하고 Java 7을 사용하고 있다고 확인한 다음 재부팅했다. 그럼에도 불구하고, hadoop 서비스는 여전히 Java 6 – msknapp

+0

으로 시작합니다. Java 7을 사용하기 위해/etc/profile을 수정했습니다. 기본적으로/etc와/usr 및/root를 모두 Java 1.6을 가리키는 모든 항목에 대해 grepped하고 아무 것도 발견하지 못했습니다./usr/java에있는 모든 심볼릭 링크는 java 7을 가리 킵니다. 그럼에도 불구하고이 모든 것이 여전히 Java 6에서 시작됩니다. 나는 정말로 아이디어가 부족합니다. – msknapp

0

이것은 오래된 게시물이지만 혼합 jdks를 실행할 때 동일한 문제가 발생하여 추가 정보가 추가되었습니다. 즉, CDH4.4 VM에서 java7 로컬 및 java6이 실행됩니다.

다음 게시물 cloudera가 답변을 제공합니다 :
http://www.cloudera.com/content/cloudera-content/cloudera-docs/CM4Ent/4.5.3/Cloudera-Manager-Enterprise-Edition-Installation-Guide/cmeeig_topic_16_2.html 실제 클러스터에서 변경하려는 경우 해당 지시를 따르십시오.

하지만 단지 VM 및 해당 문서에 사용하고 중요한 단서이다 :
/usr/lib64/cmf/service/common/cloudera-config.sh은/보여줍니다 함수 locate_java_home()를 가지고 usr/java/jdk1.6 *은 /usr/java/jdk1.7*보다 우선합니다.
나중에 빠른 시작 VM에서 수정 될 수 있지만 더 빠른 수정 프로그램을 찾고있었습니다. (dev에 대해 새 VM을 설정하는 데 약간의 노력이 필요합니다.) 의 검색 순서를 변경하고 재부팅하기 만하면 VM이 수정되었습니다.

HTH,
글렌