[HADOOP] 하둡 DBWritable : 하둡 감속기에서 MySQL의 레코드를 삽입 할 수 없습니다
HADOOP하둡 DBWritable : 하둡 감속기에서 MySQL의 레코드를 삽입 할 수 없습니다
테이블에 삽입하는 동안 중복 된 항목 문제에 직면.
나는 하둡 감속기에 의해 MySQL의 데이터베이스에 기록을 쓰는 동안 완전히 에러가 발생한 다음, file.But에서 기록을 읽어 file.It 성공에서 기록을 읽기 위해 하둡 매퍼를 사용하고있다.
때 java.io.IOException : 키 'PRIMARY'에 대한 중복 항목을 '505975648'
그러나 MySQL의 테이블 인 하둡 DBWritable 감속기에서 MySQL의 테이블에 레코드를 작성하는 empty.Unable 남아있다.
다음은 오류 로그입니다 :
경고 : com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException : 이미의 Connection.close ()를 호출하고있다. 이 상태에서 잘못된 동작. sun.reflect.NativeConstructorAccessorImpl.newInstance0에서 (기본 방법) sun.reflect.NativeConstructorAccessorImpl.newInstance에서 (NativeConstructorAccessorImpl.java:57) sun.reflect.DelegatingConstructorAccessorImpl.newInstance에서 (DelegatingConstructorAccessorImpl.java:45) java.lang.reflect.Constructor.newInstance에서 (Constructor.java:526) com.mysql.jdbc.Util.handleNewInstance에서 (Util.java:406) com.mysql.jdbc.Util.getInstance에서 (Util.java:381) com.mysql.jdbc.SQLError.createSQLException에서 (SQLError.java:984) com.mysql.jdbc.SQLError.createSQLException에서 (SQLError.java:956) com.mysql.jdbc.SQLError.createSQLException에서 (SQLError.java:926) com.mysql.jdbc.ConnectionImpl.getMutex에서 (ConnectionImpl.java:3018) com.mysql.jdbc.ConnectionImpl.rollback에서 (ConnectionImpl.java:4564) org.apache.hadoop.mapred.lib.db.DBOutputFormat $ DBRecordWriter.close에서 (DBOutputFormat.java:72) org.apache.hadoop.mapred.ReduceTask $ OldTrackingRecordWriter.close (ReduceTask.java:467)에서 org.apache.hadoop.mapred.ReduceTask.runOldReducer에서 (ReduceTask.java:539) org.apache.hadoop.mapred.ReduceTask.run에서 (ReduceTask.java:421) org.apache.hadoop.mapred.LocalJobRunner $ Job.run (LocalJobRunner.java:262)에서
2014년 6월 4일 오후 1시 23분 36초 org.apache.hadoop.mapred.LocalJobRunner $ 작업이 실행 경고 : job_local_0001 때 java.io.IOException : 키 'PRIMARY'에 대한 중복 항목을 '505975648' org.apache.hadoop.mapred.lib.db.DBOutputFormat $ DBRecordWriter.close에서 (DBOutputFormat.java:77) org.apache.hadoop.mapred.ReduceTask $ OldTrackingRecordWriter.close (ReduceTask.java:467)에서 org.apache.hadoop.mapred.ReduceTask.runOldReducer에서 (ReduceTask.java:531) org.apache.hadoop.mapred.ReduceTask.run에서 (ReduceTask.java:421) org.apache.hadoop.mapred.LocalJobRunner $ Job.run (LocalJobRunner.java:262)에서
해결법
-
==============================
1.DBOutputFormat / DBRecordWriter은 데이터베이스 트랜잭션의 모든 작업을 수행합니다. 같은 기본 키와 동일한 트랜잭션에서 두 삽입을 수행하려고 할 경우, 지금 테이블에 아무것도 할 수 있지만, 당신은 무슨 일이 일어나고있는 것입니다이 오류를 얻을 것이다. 더 나은이를 추적하려면 로깅을 추가 할 수 있습니다. 당신은 DBOutputFormat에 대한 코드를 복용하고 새로운 비슷한 이름의 클래스를 만드는이 작업을 수행 할 수 있습니다. 난 내 LoggingDBOutputFormat을했다. 대신이 새로운 출력 형식을 사용하도록 작업 코드를 업데이트합니다. 새로운 출력 형식의 당신은 그들이 실행하기 전에 명령문을 기록 가까운 방법을 변경 :
DBOutputFormat / DBRecordWriter은 데이터베이스 트랜잭션의 모든 작업을 수행합니다. 같은 기본 키와 동일한 트랜잭션에서 두 삽입을 수행하려고 할 경우, 지금 테이블에 아무것도 할 수 있지만, 당신은 무슨 일이 일어나고있는 것입니다이 오류를 얻을 것이다. 더 나은이를 추적하려면 로깅을 추가 할 수 있습니다. 당신은 DBOutputFormat에 대한 코드를 복용하고 새로운 비슷한 이름의 클래스를 만드는이 작업을 수행 할 수 있습니다. 난 내 LoggingDBOutputFormat을했다. 대신이 새로운 출력 형식을 사용하도록 작업 코드를 업데이트합니다. 새로운 출력 형식의 당신은 그들이 실행하기 전에 명령문을 기록 가까운 방법을 변경 :
/** {@inheritDoc} */ public void close(TaskAttemptContext context) throws IOException { try { LOG.warn("Executing statement:" + statement); statement.executeBatch(); connection.commit(); } catch (SQLException e) { try { connection.rollback(); } catch (SQLException ex) { LOG.warn(StringUtils.stringifyException(ex)); } throw new IOException(e.getMessage()); } finally { try { statement.close(); connection.close(); } catch (SQLException ex) { throw new IOException(ex.getMessage()); } } }
당신은 아무것도가 실행 된 경우 확인하기 위해 MySQL의 측면에있는 일반 로그를 확인할 수 있습니다. 확율은 당신이 당신의 트랜잭션이 롤백 오류를 기반으로 한 것을 볼 수 있습니다. 이 문제를 해결하려면, 기본 키가 고유해야합니다. 업데이트 / upserting가 대신 원하는 것을 있었다면, 그 않는 출력 / 기록 라이터를 만들 수 있지만 다른 사업입니다.
from https://stackoverflow.com/questions/24032006/hadoop-dbwritable-unable-to-insert-record-to-mysql-from-hadoop-reducer by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] 드라이버 클래스 컴파일 오류 - 하둡 맵리 듀스 (0) | 2019.10.10 |
---|---|
[HADOOP] 다른 데이터 유형 그룹과 두 개의 열을 비교하는 방법 (0) | 2019.10.10 |
[HADOOP] 하이브 설정 hive.optimize.sort.dynamic.partition (0) | 2019.10.09 |
[HADOOP] 하이브는 자바 9 지원됩니까? [복제] (0) | 2019.10.09 |
[HADOOP] 하둡 클러스터에 대한 최적의 블록 크기 (0) | 2019.10.09 |