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
, 당신은 하이브 디렉토리를 설치할 필요 lib
에 hive-exec-**.jar
Sqoop을 대신 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_id
로 RowKey
원본 테이블의 모든에 나열된 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-tables
HDFS / 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