복붙노트

[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. ==============================

    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가 대신 원하는 것을 있었다면, 그 않는 출력 / 기록 라이터를 만들 수 있지만 다른 사업입니다.

  2. from https://stackoverflow.com/questions/24032006/hadoop-dbwritable-unable-to-insert-record-to-mysql-from-hadoop-reducer by cc-by-sa and MIT license