Resumen de uso de Sqoop
1. Comandos básicos de Sqoop
1. Ver todos los comandos
# sqoop help
2. Ver el uso específico de un comando
# sqoop help 命令名
Dos, Sqoop y MySQL
1. Consultar todas las bases de datos MySQL
Generalmente se usa para probar la conexión entre Sqoop y MySQL:
sqoop list-databases \
--connect jdbc:mysql://hadoop001:3306/ \
--username root \
--password root
2. Consultar todas las tablas de datos en la base de datos especificada
sqoop list-tables \
--connect jdbc:mysql://hadoop001:3306/mysql \
--username root \
--password root
3. Sqoop y HDFS
3.1 Importar datos de MySQL a HDFS
1. Importar comandos
Ejemplo: Exportar help_keyword
tablas de base de datos MySQL al /sqoop
directorio HDFS , el directorio existe si se introduce eliminar y luego se introduce, utilizando tres map tasks
importaciones paralelas.
Nota: help_keyword es una tabla de diccionario integrada en MySQL, y los siguientes ejemplos utilizan esta tabla.
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 数量
Como salida de registro, los datos de entrada que se pueden ver son el promedio split
de tres, cada uno de los cuales consta de tres map task
procesos. Los datos se dividen en función de la columna de clave principal de la tabla de forma predeterminada. Si su tabla no tiene una clave principal, hay dos opciones:
- Agregue un
-- autoreset-to-one-mapper
parámetro representativo de solo un iniciomap task
, que no se ejecuta en paralelo; - Cuando aún se desea la ejecución en paralelo, es posible utilizar
--split-by <column-name>
una columna de referencia que indique los datos divididos.
2. Verificación de importación
# 查看导入后的目录
hadoop fs -ls -R /sqoop
# 查看导入内容
hadoop fs -text /sqoop/part-m-00000
Verifique el directorio de importación de HDFS, puede ver que los datos en la tabla están divididos en 3 partes para el almacenamiento, que está determinado por el paralelismo especificado.
3.2 Exportar datos HDFS a MySQL
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
La tabla debe crearse con anticipación y la declaración para construir la tabla es la siguiente:
CREATE TABLE help_keyword_from_hdfs LIKE help_keyword ;
Cuatro, Sqoop y Hive
4.1 Importar datos de MySQL a Hive
Sqoop para importar datos a Hive se introduce a través de los primeros datos a un directorio temporal en HDFS, luego los datos de HDFS Load
a Hive y finalmente se elimina el directorio temporal. Puede usarse target-dir
para especificar un directorio temporal.
1. Importar comandos
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 # 并行度
Hive importado a la sqoop_test
base de datos debe crearse de antemano, no especifique el uso de Hive en la default
biblioteca predeterminada .
# 查看 hive 中的所有数据库
hive> SHOW DATABASES;
# 创建 sqoop_test 数据库
hive> CREATE DATABASE sqoop_test;
2. Verificación de importación
# 查看 sqoop_test 数据库的所有表
hive> SHOW TABLES IN sqoop_test;
# 查看表中数据
hive> SELECT * FROM sqoop_test.help_keyword;
3. Posibles problemas
Si se produce un error de ejecución java.io.IOException: java.lang.ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf
, debe instalar el directorio Hive lib
en hive-exec-**.jar
lugar de 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 Exportar datos de Hive a MySQL
Dado que los datos de Hive se almacenan en HDFS, Hive importa datos a MySQL, que en realidad es HDFS importa datos a MySQL.
1. Ver la ubicación de almacenamiento de la tabla de Hive en HDFS
# 进入对应的数据库
hive> use sqoop_test;
# 查看表信息
hive> desc formatted help_keyword;
Location
El atributo es su ubicación de almacenamiento:
Aquí puede consultar este directorio, la estructura del archivo es la siguiente:
3.2 Ejecutar comando de exportación
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
Las tablas en MySQL deben crearse de antemano:
CREATE TABLE help_keyword_from_hive LIKE help_keyword ;
Five, Sqoop y HBase
Esta sección solo explica la importación de datos de RDBMS a HBase, porque no hay un comando para exportar datos directamente de HBase a RDBMS.
5.1 Importar datos de MySQL a HBase
1. Importar datos
Los help_keyword
datos de importación en la tabla La tabla HBase help_keyword_hbase
, utilizando la clave maestra de la tabla original, help_keyword_id
ya que RowKey
toda la tabla original se enumera en keywordInfo
el grupo de columnas, solo admite la columna completa en el siguiente grupo, el grupo no admite columnas designadas.
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
La tabla de HBase importada debe crearse de antemano:
# 查看所有表
hbase> list
# 创建表
hbase> create 'help_keyword_hbase', 'keywordInfo'
# 查看表信息
hbase> desc 'help_keyword_hbase'
2. Verificación de importación
Usar scan
datos de la tabla de vista:
Seis, toda la exportación de la biblioteca
Sqoop es compatible con import-all-tables
las exportaciones de bibliotecas completas al comando HDFS / Hive, pero tenga en cuenta las dos limitaciones siguientes:
- Todas las tablas deben tener una clave primaria, o utilizarla
--autoreset-to-one-mapper
, lo que significa que solo se inicia unamap task
; - No puede usar columnas divididas no predeterminadas, ni puede agregar restricciones a través de la cláusula WHERE.
El segundo punto de explicación es más confuso, aquí está la explicación original oficial:
- No debe tener la intención de utilizar una columna de división no predeterminada ni imponer ninguna condición a través de una
WHERE
cláusula.
Exporta toda la biblioteca a HDFS:
sqoop import-all-tables \
--connect jdbc:mysql://hadoop001:3306/数据库名 \
--username root \
--password root \
--warehouse-dir /sqoop_all \ # 每个表会单独导出到一个目录,需要用此参数指明所有目录的父目录
--fields-terminated-by '\t' \
-m 3
Exporta toda la biblioteca a 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
Siete, filtrado de datos Sqoop
7.1 parámetros de consulta
Sqoop admite el uso de query
consultas SQL definidas por parámetros, que pueden exportar cualquier conjunto de resultados que desee. Los ejemplos de uso son los siguientes:
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
En uso query
cuando se filtran datos, tenga en cuenta los siguientes tres puntos:
- Debe
--hive-table
especificar la tabla de destino; - Si el grado de paralelismo
-m
no es designado o no--autoreset-to-one-mapper
, debe usar el--split-by
especificado en la columna de referencia; where
Deben incluirse las palabras de SQL$CONDITIONS
, que es una redacción fija, para reemplazar la dinámica.
7.2 Importación incremental
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
El parámetro tiene las siguientes dos opciones opcionales:
- el agregar : el valor requerido de la columna de referencia debe incrementarse, es mayor que todos
last-value
los valores que se importan; - LastModified : el valor requerido debe ser una referencia al
timestamp
tipo de columna , y el tiempo para insertar datos en la marca de tiempo actual en la columna de referencia, la columna debe actualizar la marca de tiempo al actualizar los datos de referencia, después de quelast-value
se importen todos los datos.
De la explicación anterior, podemos ver que, de hecho, la importación incremental de Sqoop no tiene demasiados artefactos, depende de la columna de referencia mantenida para determinar cuáles son los datos incrementales. Por supuesto, también podemos utilizar los query
parámetros descritos anteriormente para la exportación incremental manualmente, por lo que en lugar de ser más flexible.
8. Tipo de apoyo
Sqoop admite la mayoría de los tipos de campo de la base de datos de forma predeterminada, pero no se admiten algunos tipos especiales. Si se encontró un tipo no admitido, el programa generará Hive does not support the SQL type for column xxx
una excepción y ahora se puede transmitir mediante los siguientes dos parámetros:
- --Map-column-java <mapeo> : reescribe el mapeo de SQL a tipos de Java;
- --Map-column-hive <mapeo> : Vuelva a escribir el mapeo de Hive al tipo Java.
Los ejemplos son los siguientes, y el id
campo original forzado en el value
campo Tipo de cadena forzado en tipo Integer:
$ sqoop import ... --map-column-java id=String,value=Integer