복붙노트

[HADOOP] 여러 서버에서 데이터를로드 할 때 데이터 중복 방지

HADOOP

여러 서버에서 데이터를로드 할 때 데이터 중복 방지

나는 다스 웹 서버 로그 파일에 각각의 데이터를 기록이있다. 각 시간의 시작 부분에서, 이전 시간의 데이터는 명령을 실행하는 크론 스크립트를 사용하여 하이브로드 :

hive -e "LOAD DATA LOCAL INPATH 'myfile.log' INTO TABLE my_table PARTITION(dt='2015-08-17-05')"

어떤 경우에는, 명령이 실패하고 스크립트가 기다리고 다시 시도하는 경우 0이 아닌 코드로 종료합니다. 문제는 실패의 경우에, 데이터 로딩이 실패 메시지가 표시하더라도 실패하지 않습니다이다. 어떻게 데이터가로드되었는지의 여부를 확실히 알 수 있습니까?

데이터가로드 이러한 "실패"의 예 :

편집하다: 또는,에로드 된 파일 이름을 하이브를 조회하는 방법은 무엇입니까? 나는 파일의 수를 볼 수 DESCRIBE 사용할 수 있습니다. 나는 그들의 이름을 알 수 있습니까?

해결법

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

    1.정보 "하는 파일은 파티션에로드 된"

    정보 "하는 파일은 파티션에로드 된"

    (a)는 단지 명령 줄에서 해당 디렉토리에 HDFS DFS -ls 실행 (또는 상응하는 자바 API 호출을 사용) (b)는 (...) 같은에서 선택 별개의 INPUT__FILE__NAME으로 하이브 쿼리를 실행

    "자동적으로 INSERT에 중복을 방지하는 방법"에 관하여 : 방법이있다, 그러나 재 설계의 꽤 필요하고, 처리 시간 / (추가지도 단계 플러스 MapJoin)의 관점에서 당신을 요할 것이다 / ...

  2. ==============================

    2.난 당신이 단순히이 하둡 / 하이브에 할 수 있다고 생각하지 않습니다. 그래서 여기 파이썬 구현의 기본 사항은 다음과 같습니다 :

    난 당신이 단순히이 하둡 / 하이브에 할 수 있다고 생각하지 않습니다. 그래서 여기 파이썬 구현의 기본 사항은 다음과 같습니다 :

    import subprocess
    x=subprocess.check_output([hive -e "select count(*) from my_table where dt='2015-08-17-05'"])
    print type(x)
    print x
    

    하지만 당신은 파이썬을 사용하여 작업 할 하이브 -e를 얻을 백 슬래시 작업 시간을 보내고있다. 그것은 매우 어려울 수 있습니다. 처음에 간단한 쿼리 파일을 작성한 다음 하이브 -f 파일 이름을 사용하는 것이 더 편리 할 수 ​​있습니다. 그런 다음, 출력이 저장되는 방법을 참조하기 위해 subprocess.check_output의 출력을 인쇄 할 수 있습니다. 당신은 몇 가지 정규식 또는 유형 변환을 수행해야 할 수 있습니다,하지만 난 그냥 문자열로 돌아올한다고 생각합니다. 그리고 단순히 if 문을 사용합니다 :

    if x > 0:
        pass
    else:
        hive -e "LOAD DATA LOCAL INPATH 'myfile.log' INTO TABLE my_table PARTITION(dt='2015-08-17-05')"
    
  3. from https://stackoverflow.com/questions/32073388/avoiding-data-duplication-when-loading-data-from-multiple-servers by cc-by-sa and MIT license