[HADOOP] sqoop merge-key : merge-key를 사용하지 않고 여러 개의 part 파일을 만드는 것.
HADOOPsqoop merge-key : merge-key를 사용하지 않고 여러 개의 part 파일을 만드는 것.
이상적으로 병합 키없이 incremental을 실행하면 첨부 된 데이터 세트로 새 파일을 만들지 만 merge-key를 사용하면 이전 데이터 세트를 포함한 새로운 전체 데이터 세트가 하나의 파일에만 생성됩니다. 하지만 내 sqoop 작업에서 증분 추가를 사용할 때 하나의 파일이 생성되지 않습니다. 아래 단계는 다음과 같습니다.
1) 초기 데이터 :
mysql> select * from departments_per;
+---------------+-----------------+
| department_id | department_name |
+---------------+-----------------+
| 2 | Fitness |
| 3 | Footwear |
| 4 | Apparel |
| 5 | Golf |
| 6 | Outdoors |
| 7 | Fan Shop |
+---------------+-----------------+
2) 처음에 데이터를 hdfs로 가져 오기위한 sqoop 명령 :
sqoop import \
--connect jdbc:mysql://localhost/practice \
--username root \
--password cloudera \
--table departments_per \
--target-dir /departments \
-m 1
이제 hdfs 아래의 디렉토리 부서를 볼 때 하나의 파트 파일을 볼 수 있습니다.
3) 이제 mysql에서 초기 데이터를 업데이트한다.
mysql> select * from departments_demo;
+---------------+-----------------+
| department_id | department_name |
+---------------+-----------------+
| 2 | Fitness |
| 3 | Footwear |
| 4 | Apparel |
| 5 | Golf |
| 6 | Outdoors |
| 7 | Fan |
| 8 | Tushar MC |
+---------------+-----------------+
4) 이제 증분 추가 작업을 만들고 실행합니다.
sqoop job --create appendJobs12 \
-- import \
--connect jdbc:mysql://localhost/practice \
--username root \
--password cloudera \
--table departments_demo \
-m 1 \
--target-dir /departments \
--incremental append \
--merge-key department_id \
--check-column department_id \
--last-value 0
sqoop job --exec appendJobs12
5) 병합 키 개념을 사용했지만 hdfs 디렉토리에 두 개의 부분 파일을 볼 수 있습니다.
[cloudera@quickstart ~]$ hadoop fs -ls /departments
Found 3 items
-rw-r--r-- 1 cloudera supergroup 0 2018-10-04 00:31 /departments/_SUCCESS
-rw-r--r-- 1 cloudera supergroup 60 2018-10-04 00:31 /departments/part-m-00000
-rw-r--r-- 1 cloudera cloudera 67 2018-10-04 00:37 /departments/part-m-00001
데이터를 표시 할 때 아래와 같이 표시됩니다.
[cloudera@quickstart ~]$ hadoop fs -cat /departments/part-m-00000
2,Fitness
3,Footwear
4,Apparel
5,Golf
6,Outdoors
7,Fan Shop
[cloudera@quickstart ~]$ hadoop fs -cat /departments/part-m-00001
2,Fitness
3,Footwear
4,Apparel
5,Golf
6,Outdoors
7,Fan
8, Tushar MC
여기서 한 부분 파일은 초기 데이터를 보유하고 두 번째 부분 파일은 갱신 된 데이터를 보유합니다. 아무도 내가 어디서 잘못 되었기 때문에 내가 업데이트 된 데이터 세트로 하나의 파트 파일을 얻을 수 없기 때문에 어디에서 말해 줄 수 있습니까? 미리 감사드립니다.
해결법
-
==============================
1.나는 이것을 연구했고 당신의 접근법에 같은 오류가있다. 그래서, 그것은 정확하지 않습니다 - 제가 말하고 싶은 다양한 재료를 읽는 것은 그것이 분명하지 않다고 생각합니다. 어쨌든.
나는 이것을 연구했고 당신의 접근법에 같은 오류가있다. 그래서, 그것은 정확하지 않습니다 - 제가 말하고 싶은 다양한 재료를 읽는 것은 그것이 분명하지 않다고 생각합니다. 어쨌든.
중간 표적 디렉토리에서 외부 테이블과 일부 LINUX 스크립팅이 필요하다는 인상을받습니다.
그래서 1) mysql에 데이터를 추가하고 2) sqoop 가져 오기를 수행 한 다음 3) mysql에서의 업데이트 4) 다른 증분 가져 오기가 실제로 올바르지 않다고 생각하지만 실제로 업데이트를 원한다. 5) codegen과 마지막으로 6) sqoop MERGE가 뒤 따른다.
다음은 주요 단계입니다.
초기 가져 오기
sqoop import -m 1 --connect jdbc:mysql://quickstart:3306/retail_db --username=retail_dba --password=cloudera --table ged --warehouse-dir=/user/hive/warehouse --create-hive-table --hive-import --fields-terminated-by ',' --hive-drop-import-delims
당신이했던 것처럼 증가 하중
sqoop import -m 1 --connect jdbc:mysql://quickstart:3306/retail_db --username=retail_dba --password=cloudera --table ged --warehouse-dir=/user/hive/warehouse --fields-terminated-by ',' --hive-drop-import-delims --last-value 0 --merge-key id --incremental append --check-column id
CODEGEN
sqoop codegen --connect jdbc:mysql://quickstart:3306/retail_db --username=retail_dba --password=cloudera --table ged
가기
sqoop merge --new-data /user/hive/warehouse/ged --onto /user/hive/warehouse/new_ged --merge-key id --target-dir /user/hive/merged/ged2 --jar-file /tmp/sqoop-cloudera/compile/c8d374075351d228c50d89354959762e/ged.jar -class-name ged
결과 : [cloudera @ quickstart ~] $ hadoop fs -cat / user / hive / merged / ged2 / * 1, YYY 2, 피터 3, 바비 4, 마리아 5, 농담 6, Joker
나는 원래 1, XXX가 아니라 6, 조커
이것은 다소 다르므로 무엇을 언급해야할지 확신하지 못합니다. 어떤 경우에도 1 파일은 많은 양의 데이터가있는 유효한 가정이 아닙니다. 귀하의 진술은 추가 매개 변수와 함께 작동하지만 이것은 잘 작동합니다.
여기서 단서는 병합을 통해 변경 가능한 시스템을 업데이트하는 것으로, 위치에 따라 외부 테이블 명령을 통해 전환 할 수있는 다른 대상을 필요로합니다.
from https://stackoverflow.com/questions/52641463/sqoop-merge-key-creating-multiple-part-files-instead-of-one-which-doesnt-serve by cc-by-sa and MIT license