복붙노트

[HADOOP] Oozie와 함께 sqoop을 사용하여 중복 관찰하기

HADOOP

Oozie와 함께 sqoop을 사용하여 중복 관찰하기

미리 빌드 된 sqoop 작업을 사용하여 MySQL에서 HDFS로 데이터를 가져 오기 위해 sqoop pogram을 만들었습니다.

                sqoop job -fs $driver_path -D mapreduce.map.java.opts=" -Duser.timezone=Europe/Paris"\
            --create job_parquet_table -- import -m $nodes_number\
            --connect jdbc:mysql://$server:$port/$database --username $username --password-file $pass_file\
            --target-dir $destination_dir --table $table --as-parquetfile --append\
            --incremental append --check-column $id_column_names --last-value 1\
            --fields-terminated-by , --escaped-by \\ --enclosed-by '\"'

나는 또한 sqoop 수입을 monnitore 할 수있는 spark progam을 만들었습니다. 이것에서 나는 가져올 테이블의 max_id (최대 ID), sqoop incremental.last.value, 레코드 수 (SELECT count ()), 개별 레코드 수 (SELECT count () 고유 ID) 및 중복 백분율 (SELECT count () - count (고유 ID) / count (*) * 100)로 정의됩니다.

sqoop 작업을 실행하여 데이터를 수동으로 가져올 때 :

sqoop-job --exec job_parquet_$table -- --username edastatnew --password edastatnew

모든 것이 옳다. 중복이 없으며 데이터를 완벽하게 가져온다.

그러나 Oozie를 사용하여 sqoop 작업을 예약 할 때 sqoopincremental.last.value가 잘못 업데이트되어 데이터가 중복되는 것을 확인했습니다. 여기 내 모니터링입니다 :

보시다시피 max_ID는 실험의 다른 시간에 sqoop_last_value와 일치하지 않습니다. 나는 Oozie를 사용할 때 sqoop 작업을 실행 한 후에 sqoop incremenatal.last.value가 잘못 업데이트된다는 결론을 내 렸습니다. 다른 사람이이 똑같은 문제에 직면 했습니까? 그렇다면 어떤 해결책을 찾았습니까?

감사,

해결법

  1. ==============================

    1.Sqoop은 "마지막 값"정보를 어디에 저장합니까?

    Sqoop은 "마지막 값"정보를 어디에 저장합니까?

    대답은 : 기본적으로 Sqoop1의 경우 로컬 파일 시스템의 파일에 있습니다. 그러나 Oozie는 무작위 머신에서 Sqoop 작업을 실행하므로 실행이 조정되지 않습니다. 그리고 Sqoop2 (적당한 Metastore 데이터베이스를 가지고 있음)는 어느 정도 limbo에 있습니다; 최소한 Oozie는 지원하지 않습니다.

    솔루션은 공유 HSQLDB 데이터베이스 서비스를 시작하여 실행중인 모든 머신에서 모든 Sqoop1 작업에 대한 "마지막 값"정보를 저장하는 것입니다.

    그 불충분 한 Metastore에 대한 Sqoop1 문서와 그 사용법에 대해 읽어보십시오. 그리고 더 이상 사용되지 않는 HSQLDB 데이터베이스를보다 전문적으로 처리하려면 해당 저의 게시물을보십시오.

  2. from https://stackoverflow.com/questions/37480188/observing-duplicates-using-sqoop-with-oozie by cc-by-sa and MIT license