sqoop import 가 hive 로 가 져 온 후 데이터 양 이 많아 지 는 문 제 를 해결 합 니 다.

sqoop import 명령 을 사용 하여 postgresql 에서 데 이 터 를 hive 로 가 져 왔 습 니 다.데이터 줄 수가 많아 졌 지만 작업 이 잘못 되 지 않 았 습 니 다.이상 합 니 다.
가 져 오 는 문 구 는 다음 과 같 습 니 다:

sqoop import 
--connect jdbc:postgresql://*.*.*.*:5432/database_name 
--username name111 
--password password111 
--table table111 
--hive-import 
--hive-database database111 
--hive-table hive_table111 
--hive-overwrite 
--delete-target-dir 
--hive-drop-import-delims 
--null-string ''
 --null-non-string '' 
 -m5
가 져 오기 전 pgsql 데 이 터 는 3698 개 였 으 나 가 져 온 후 hiv 의 데 이 터 는 3938 개 로 데이터 가 많아 졌 습 니 다.마지막 으로 파라미터-m5 를-m1 로 바 꾸 면 문 제 를 해결 할 수 있 음 을 발견 하 였 다.
왜 일 까요?
인자-m 의 의미 와 sqoop 가 져 오 는 원 리 를 알 아 보 겠 습 니 다.
먼저 사용자 가 Sqoop import 명령 을 입력 하면 Sqoop 은 관계 형 데이터 베이스 에서 메타 데이터 정 보 를 얻 습 니 다.예 를 들 어 데이터 베 이 스 를 조작 하려 는 schema 가 어떤 모습 인지,이 표 에는 어떤 필드 가 있 는 지,이 필드 들 은 어떤 데이터 형식 인지 등 입 니 다.이 정 보 를 얻 은 후에 입력 명령 을 Map 기반 MapReduce 작업 으로 전환 합 니 다.그러면 MapReduce 작업 에는 많은 Map 작업 이 있 습 니 다.모든 Map 작업 은 데이터 베이스 에서 데 이 터 를 읽 습 니 다.이렇게 여러 Map 작업 은 동시 복 사 를 실현 하고 전체 데 이 터 를 HDFS 에 신속하게 복사 합 니 다.
몇 개의 맵 으로 나 눌 지 결정 하 는 것 은 매개 변수-m 의 역할 이 며,-m 5 대 표 는 5 개의 맵 으로 나 뉘 며,-m 1 대 표 는 1 개의 맵 으로 나 뉘 는데,즉 절 분 될 필요 가 없다.
어떤 필드 로 나 눌 지 결정 하 는 것 은--split-by 로 만 든 것 이다.sqoop import 가 정의 되 지 않 았 을 때,기본적으로 원본 데이터 테이블 의 키 를 절 분 필드 로 사용 합 니 다.
split-by 는 서로 다른 매개 변수 유형 에 따라 서로 다른 절 분 방법 이 있 습 니 다.예 를 들 어 int 형,Sqoop 은 최대 와 최소 split-by 필드 값 을 취하 고 들 어 오 는 num-mappers 에 따라 몇 개의 구역 을 구분 합 니 다.예 를 들 어 select max(splitby),min(split-by)from 에서 얻 은 max(split-by)와 min(split-by)은 각각 1000 과 1 이 고,num-mappers(-m)가 2 이면 두 구역(1,500)과(501-1000)으로 나 뉘 며,동시에 2 개의 sql 로 나 누 어 2 개의 map 에 가 져 오기 작업 을 한다.각각 select XXX from table where split-by>=1 and split-by<500 과 select XXX from table where split-by>=501 and split-by<=1000 입 니 다.마지막 으로 매 맵 마다 각자 SQL 의 데 이 터 를 가 져 와 가 져 옵 니 다.

그럼 처음 문제 로 돌아 가 왜 점수 가 다 르 고 결 과 는 다 를 까?이론 적 으로 아무리 구분 해도 가 져 온 데 이 터 는 똑 같 아야 하 는데 지금 은 더 많아 졌 다?이것 은 절 분 된 필드 가 우호 적 이지 않 기 때문에 int 형 이나 정렬 규칙 이 있 는 것 이 아니다.

이러한 id 내용 은 정렬 규칙 이 없습니다.예 를 들 어 원래 10 개의 id 를 2 부 로 자 르 면(5,5)얻 을 수 있 습 니 다.지금 자 를 때(5,6)하나의 id 가 중복 되면 수량 이 많아 집 니 다.
그래서 해결 방법 은 두 가지 가 있다.
첫째,-m5 를-m1 로 바 꾸 고 직접 구분 하지 않 는 다.
둘째,split-by 는 다른 필드 를 만 들 고 int 형 이나 명확 한 정렬 순서 가 있 는 필드 를 바 꿉 니 다.
상기 원인 을 제외 하고 데이터 가 많아 지고 문구 가 부족 합 니 다.-hive-drop-import-delims 도 문제 의 발생 을 초래 할 수 있 습 니 다.다음 과 같이 해결 합 니 다.
sqoop 에서 데 이 터 를 가 져 올 때 데이터 양 이 많아 지 는 솔 루 션 입 니 다.
오늘 sqoop 을 사용 하여 표 한 장 을 가 져 왔 습 니 다.저 는 데이터베이스 에 있 는 데 이 터 를 650 개의 데 이 터 를 찾 아 보 았 습 니 다.그런데 제 가 데 이 터 를 hive 표 에 가 져 왔 을 때 563 개의 데이터 가 나 왔 습 니 다.이것 은 이상 합 니 다.데이터 가 틀 렸 다 고 생각 했 습 니 다.그리고 데 이 터 를 몇 번 더 가 져 왔 는데 똑 같은 문제 가 있 었 습 니 다.
그리고 데이터 필드 ID 의 값 을 찾 아 보 니 메 인 키 를 만 든 데이터 가 어떻게 비어 있 는 지 알 게 되 었 습 니 다.그리고 데이터베이스 에 있 는 데 이 터 를 보 니 데이터 가 저 장 될 때 어떤 귀신 이 들 어 갔 는 지 데이터 가 어느 줄 에서 끊 어 져 서 세 개의 데이터 가 더 나 왔 다.다음은 문제 가 있 는 필드 입 니 다.

여기 서 데이터 가 왜 그런 지 모 르 겠 습 니 다.데 이 터 를 가 져 올 때 hive 기본 줄 의 분할 기 호 는 형식 에 따라 가 져 온 것 이 라 고 추측 합 니 다.여기 서 이런 문 자 를 만 나 다음 줄 에 따라 데 이 터 를 잘 랐 습 니 다.
그리고 나 서 나 는 hiv 의 줄 을 지정 하 는 분할 기 호 를 사용자 정의 로 테스트 했다.-lines-terminated-by 로 hiv 의 줄 을 지정 하 는 분할 기 호 를 사 용 했 지만 불행 하 게 도 이것 은 고 칠 수 없 는 것 같 았 다.그 는 아래 의 잘못 을 보고 할 것 이다.
FAILED:SemanticException 1:424 LINES TERMINATED BY only supports newline'right now.Error encountered near token''\\164''그래서 인터넷 에서 자 료 를 찾 은 다음 에 하나의 설정 으로 hive 의 기본 분할 기 호 를 제거 한 다음 에 데 이 터 를 가 져 올 수 있 습 니 다.설정 은 다음 과 같 습 니 다.--hive-drop-import-delims 이 매개 변 수 는 hive 의 기본 분할 기 호 를 제거 하 는 것 입 니 다.이 인 자 를 더 한 다음 에--fields-terminated-by 에서 지정 한 hive 줄 의 분할 기 호 를 사용 하여 최종 데 이 터 를 가 져 왔 습 니 다.데 이 터 는 원래 라 이브 러 리 의 데이터 와 일치 합 니 다.


위 는 sqoop 스 크 립 트 의 일부 내용 입 니 다.아래 는 hive 를 실행 한 후에 hive 가 만 든 표,필드 간 의 기본 분할 기호 입 니 다.
이로써 문 제 는 해결 되 었 다.
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.만약 잘못 이 있 거나 완전히 고려 하지 않 은 부분 이 있다 면 아낌없이 가르침 을 주시 기 바 랍 니 다.

좋은 웹페이지 즐겨찾기