Sqoop 사용 요약

Sqoop 사용 요약

1. Sqoop 기본 명령

1. 모든 명령보기

# sqoop help

여기에 사진 설명 삽입

2. 명령의 특정 사용법보기

# sqoop help 命令名

Two, Sqoop 및 MySQL

1. 모든 MySQL 데이터베이스 쿼리

일반적으로 Sqoop과 MySQL 간의 연결을 테스트하는 데 사용됩니다.

sqoop list-databases \
--connect jdbc:mysql://hadoop001:3306/ \
--username root \
--password root

여기에 사진 설명 삽입

2. 지정된 데이터베이스의 모든 데이터 테이블 쿼리

sqoop list-tables \
--connect jdbc:mysql://hadoop001:3306/mysql \
--username root \
--password root

3. Sqoop 및 HDFS

3.1 MySQL 데이터를 HDFS로 가져 오기

1. 가져 오기 명령

예 : MySQL 데이터베이스 help_keyword테이블을 HDFS /sqoop디렉터리 로 내 보냅니다. 디렉터리는 세 개의 map tasks병렬 가져 오기를 사용하여 제거 후 도입 된 경우 존재합니다 .

참고 : help_keyword는 MySQL에 내장 된 사전 테이블이며 다음 예제에서는이 테이블을 사용합니다.

sqoop import \
--connect jdbc:mysql://hadoop001:3306/mysql \     
--username root \
--password root \
--table help_keyword \           # 待导入的表
--delete-target-dir \            # 目标目录存在则先删除
--target-dir /sqoop \            # 导入的目标目录
--fields-terminated-by '\t'  \   # 指定导出数据的分隔符
-m 3                             # 指定并行执行的 map tasks 数量

로그 출력으로 입력 데이터는 split각각 3 개의 map task프로세스 로 구성된 3 개의 평균값 볼 수 있습니다 . 데이터는 기본적으로 테이블의 기본 키 열을 기준으로 분할됩니다. 테이블에 기본 키가없는 경우 다음 두 가지 옵션이 있습니다.

  • 병렬로 실행되지 않는 -- autoreset-to-one-mapper시작만을 나타내는 매개 변수를 추가하십시오 map task.
  • 여전히 병렬 실행이 필요한 --split-by <column-name>경우 분할 데이터를 나타내는 참조 열 을 사용할 수 있습니다 .

여기에 사진 설명 삽입

2. 수입 확인

# 查看导入后的目录
hadoop fs -ls  -R /sqoop
# 查看导入内容
hadoop fs -text  /sqoop/part-m-00000

HDFS 가져 오기 디렉토리를 확인하면 테이블의 데이터가 지정된 병렬 처리에 의해 결정되는 저장을 위해 세 부분으로 나뉘어져 있음을 알 수 있습니다.

여기에 사진 설명 삽입

3.2 MySQL로 HDFS 데이터 내보내기

sqoop export  \
    --connect jdbc:mysql://hadoop001:3306/mysql \
    --username root \
    --password root \
    --table help_keyword_from_hdfs \        # 导出数据存储在 MySQL 的 help_keyword_from_hdf 的表中
    --export-dir /sqoop  \
    --input-fields-terminated-by '\t'\
    --m 3 

테이블은 미리 생성해야하며, 테이블을 만드는 문장은 다음과 같다.

CREATE TABLE help_keyword_from_hdfs LIKE help_keyword ;

Four, Sqoop 및 Hive

4.1 Hive로 MySQL 데이터 가져 오기

Hive로 데이터를 가져 오는 Sqoop은 첫 번째 데이터를 통해 HDFS의 임시 디렉터리로 도입 된 다음 HDFS Load에서 Hive 로 데이터를 가져온 다음 마지막으로 임시 디렉터리를 삭제합니다. target-dir임시 디렉토리를 지정하는 데 사용할 수 있습니다 .

1. 가져 오기 명령

sqoop import \
  --connect jdbc:mysql://hadoop001:3306/mysql \
  --username root \
  --password root \
  --table help_keyword \        # 待导入的表     
  --delete-target-dir \         # 如果临时目录存在删除
  --target-dir /sqoop_hive  \   # 临时目录位置
  --hive-database sqoop_test \  # 导入到 Hive 的 sqoop_test 数据库,数据库需要预先创建。不指定则默认为 default 库
  --hive-import \               # 导入到 Hive
  --hive-overwrite \            # 如果 Hive 表中有数据则覆盖,这会清除表中原有的数据,然后再写入
  -m 3                          # 并行度

sqoop_test데이터베이스 로 가져온 Hive 는 미리 생성해야하며 기본 default라이브러리 에서 Hive 사용을 지정하지 마십시오 .

 # 查看 hive 中的所有数据库
 hive>  SHOW DATABASES;
 # 创建 sqoop_test 数据库
 hive>  CREATE DATABASE sqoop_test;

2. 수입 확인

# 查看 sqoop_test 数据库的所有表
 hive>  SHOW  TABLES  IN  sqoop_test;
# 查看表中数据
 hive> SELECT * FROM sqoop_test.help_keyword;

여기에 사진 설명 삽입

3. 가능한 문제

여기에 사진 설명 삽입

실행 오류가있는 경우 java.io.IOException: java.lang.ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf, 당신은 하이브 디렉토리를 설치할 필요 libhive-exec-**.jarSqoop을 대신 lib.

[root@hadoop001 lib]# ll hive-exec-*
-rw-r--r--. 1 1106 4001 19632031 11 月 13 21:45 hive-exec-1.1.0-cdh5.15.2.jar
[root@hadoop001 lib]# cp hive-exec-1.1.0-cdh5.15.2.jar  ${SQOOP_HOME}/lib

4.2 MySQL로 Hive 내보내기 데이터

Hive 데이터는 HDFS에 저장되므로 Hive는 데이터를 MySQL로 가져옵니다. 실제로 HDFS는 데이터를 MySQL로 가져옵니다.

1. HDFS에서 Hive 테이블의 저장 위치보기

# 进入对应的数据库
hive> use sqoop_test;
# 查看表信息
hive> desc formatted help_keyword;

Location 속성은 저장 위치입니다.

여기에 사진 설명 삽입

여기에서이 디렉토리를 확인할 수 있으며 파일 구조는 다음과 같습니다.

여기에 사진 설명 삽입

3.2 내보내기 명령 실행

sqoop export  \
    --connect jdbc:mysql://hadoop001:3306/mysql \
    --username root \
    --password root \
    --table help_keyword_from_hive \
    --export-dir /user/hive/warehouse/sqoop_test.db/help_keyword  \
    -input-fields-terminated-by '\001' \             # 需要注意的是 hive 中默认的分隔符为 \001
    --m 3 

MySQL의 테이블은 미리 생성해야합니다.

CREATE TABLE help_keyword_from_hive LIKE help_keyword ;

Five, Sqoop 및 HBase

이 섹션에서는 HBase에서 RDBMS로 데이터를 직접 내보내는 명령이 없기 때문에 RDBMS에서 HBase로 데이터 가져 오기에 대해서만 설명합니다.

5.1 MySQL 가져 오기 데이터를 HBase로

1. 데이터 가져 오기

help_keyword테이블 HBase와의로 데이터를 가져 help_keyword_hbase원래 테이블의 마스터 키를 사용하여 테이블 help_keyword_idRowKey원본 테이블의 모든에 나열된 keywordInfo에만 다음 그룹에 전체 열을 지원, 열 그룹, 그룹은 열이 지정되어 지원하지 않습니다.

sqoop import \
    --connect jdbc:mysql://hadoop001:3306/mysql \
    --username root \
    --password root \
    --table help_keyword \              # 待导入的表
    --hbase-table help_keyword_hbase \  # hbase 表名称,表需要预先创建
    --column-family keywordInfo \       # 所有列导入到 keywordInfo 列族下 
    --hbase-row-key help_keyword_id     # 使用原表的 help_keyword_id 作为 RowKey

가져온 HBase 테이블은 미리 생성해야합니다.

# 查看所有表
hbase> list
# 创建表
hbase> create 'help_keyword_hbase', 'keywordInfo'
# 查看表信息
hbase> desc 'help_keyword_hbase'

2. 수입 확인

scan테이블 데이터보기 사용 :

여기에 사진 설명 삽입

여섯, 전체 도서관 수출

import-all-tablesHDFS / Hive 명령 에 대한 전체 라이브러리 내보내기에서 지원되는 Sqoop 이지만 다음 두 가지 제한 사항에 유의하십시오.

  • 모든 테이블에는 기본 키가 있어야합니다. 또는 기본 키를 사용해야합니다 --autoreset-to-one-mapper. 즉, 하나만 시작됩니다 map task.
  • 기본이 아닌 분할 열을 사용할 수 없으며 WHERE 절을 통해 제한을 추가 할 수도 없습니다.

두 번째 설명은 더 혼란 스럽습니다. 다음은 공식적인 원래 설명입니다.

  • 기본이 아닌 분할 열을 사용하거나 WHERE절을 통해 조건을 부과하지 않아야합니다 .

전체 라이브러리를 HDFS로 내 보냅니다.

sqoop import-all-tables \
    --connect jdbc:mysql://hadoop001:3306/数据库名 \
    --username root \
    --password root \
    --warehouse-dir  /sqoop_all \     # 每个表会单独导出到一个目录,需要用此参数指明所有目录的父目录
    --fields-terminated-by '\t'  \
    -m 3

전체 라이브러리를 Hive로 내 보냅니다.

sqoop import-all-tables -Dorg.apache.sqoop.splitter.allow_text_splitter=true \
  --connect jdbc:mysql://hadoop001:3306/数据库名 \
  --username root \
  --password root \
  --hive-database sqoop_test \         # 导出到 Hive 对应的库   
  --hive-import \
  --hive-overwrite \
  -m 3

일곱, Sqoop 데이터 필터링

7.1 쿼리 매개 변수

Sqoop은 query원하는 결과 집합을 내보낼 수있는 매개 변수 정의 쿼리 SQL 사용을 지원합니다 . 사용 예는 다음과 같습니다.

sqoop import \
  --connect jdbc:mysql://hadoop001:3306/mysql \
  --username root \
  --password root \
  --query 'select * from help_keyword where  $CONDITIONS and  help_keyword_id < 50' \  
  --delete-target-dir \            
  --target-dir /sqoop_hive  \ 
  --hive-database sqoop_test \           # 指定导入目标数据库 不指定则默认使用 Hive 中的 default 库
  --hive-table filter_help_keyword \     # 指定导入目标表
  --split-by help_keyword_id \           # 指定用于 split 的列      
  --hive-import \                        # 导入到 Hive
  --hive-overwrite \                     、
  -m 3                                  

사용에서 query데이터를 필터링 할 때, 다음과 같은 세 가지 사항을주의

  • --hive-table목표 테이블을 지정 해야 합니다.
  • 병렬 처리 정도가 -m지정되지 않았거나 지정되지 않은 경우 참조 열에 지정된 --autoreset-to-one-mapper을 사용해야 --split-by합니다.
  • SQL의 where단어가 포함되어야합니다. $CONDITIONS고정 된 단어는 동적을 대체하는 것입니다.

7.2 증분 가져 오기

sqoop import \
    --connect jdbc:mysql://hadoop001:3306/mysql \
    --username root \
    --password root \
    --table help_keyword \
    --target-dir /sqoop_hive  \
    --hive-database sqoop_test \         
    --incremental  append  \             # 指明模式
    --check-column  help_keyword_id \    # 指明用于增量导入的参考列
    --last-value 300  \                  # 指定参考列上次导入的最大值
    --hive-import \   
    -m 3  

incremental 매개 변수에는 다음과 같은 두 가지 선택적 옵션이 있습니다.

  • 추가 : 참조 열의 필수 값은 증가해야하며 last-value가져온 모든 보다 큽니다 .
  • LastModified : 필수 값은 열 timestamp유형에 대한 참조 여야하며 참조 열의 현재 타임 스탬프에 데이터를 삽입하는 데 필요한 시간이어야합니다 last-value. 모든 데이터를 가져 오는 것보다 나중에 참조 데이터를 업데이트 할 때 열이 타임 스탬프를 업데이트해야합니다 .

위의 설명에서 실제로 Sqoop의 증분 가져 오기에는 아티팩트가 너무 많지 않고 유지 관리되는 참조 열에 따라 증분 데이터가 결정된다는 것을 알 수 있습니다. 물론 위에서 설명한 query매개 변수를 사용하여 수동으로 증분 내보내기를 수행 할 수도 있으므로 더 유연합니다.

8. 유형 지원

Sqoop은 기본적으로 데이터베이스의 대부분의 필드 유형을 지원하지만 일부 특수 유형은 지원되지 않습니다. 지원되지 않는 유형이 발생하면 프로그램 Hive does not support the SQL type for column xxx에서 예외 가 발생 하고 이제 다음 두 매개 변수에 의해 캐스트 될 수 있습니다.

  • --Map-column-java <mapping> : SQL 매핑 을 Java 유형으로 다시 작성합니다.
  • --Map-column-hive <mapping> : Hive에서 Java 유형으로 매핑을 다시 작성합니다.

예는 다음과 같으며 원래 id필드는 문자열 유형 value필드에 강제로 Integer 유형으로 강제 적용됩니다.

$ sqoop import ... --map-column-java id=String,value=Integer

참고

Sqoop 사용자 가이드 (v1.4.7)

추천

출처blog.csdn.net/godlovedaniel/article/details/108884300