One, sqoop
sqoop é uma ferramenta de migração de dados de código aberto que pode importar e exportar dados entre Hive e RDMS. Ele também pode realizar a função de migração de dados entre HDFS e RDMS.
1.1 O mecanismo de funcionamento do Sqoop
1.1.1 Mecanismo de importação
A operação de importação do Sqoop é importar dados RDBMS para HDFS.
Ao executar uma operação de importação, o Sqoop lerá as colunas e os tipos de dados da coluna na tabela por meio de JDBC e, em seguida, mapeará os tipos de dados lidos para os tipos de dados Java, e o MapReduce subjacente lerá do banco de dados por meio dos dados do objeto InputFormat e o O objeto DataDrivenDBInputFormat pode ser dividido em diferentes tarefas de mapa de acordo com os resultados da consulta e, finalmente, essas tarefas são enviadas ao cluster MapReduce para execução, e os resultados das tarefas de Mapa serão preenchidos nas instâncias correspondentes.
1.1.2 Mecanismo de exportação
A operação de exportação do Sqoop é exportar dados em HDFS para RDBMS. Antes de exportar, o Sqoop escolherá o método de exportação, geralmente JDBC, e então o Sqoop gerará uma classe Java que pode analisar os dados de texto no HDFS e inserir o valor correspondente na tabela. O método de exportação baseado em JDBC irá gerar várias instruções de inserção e cada instrução de inserção irá inserir várias partes de dados na tabela. Ao mesmo tempo, para garantir que diferentes I / Os possam ser executados em paralelo, ao ler dados do HDFS e se comunicar com o banco de dados, vários threads são iniciados para executar simultaneamente.
1.2 Instalação Sqoop
Endereço de download: http://archive.apache.org/dist/sqoop/, descompacte após o download.
1.2.1 Configuração Sqoop
cd /export/servers/sqoop-1.4.7/conf
cp sqoop‐env‐template.sh sqoop‐env.sh
vi sqoop-env.sh
Adicione o seguinte conteúdo ao arquivo sqoop-env.sh:
export HADOOP_COMMON_HOME/export/servers/hadoop‐3.1.1
export HADOOP_MAPRED_HOME=/export/servers/hadoop‐3.1.1
export HIVE_HOME=/export/servers/apache‐hive‐3.1.1‐bin
1.2.2 Adicionar pacote jar dependente
O Sqoop precisa adicionar o pacote de driver do banco de dados e o pacote de dependência de java-json. Depois de preparar os pacotes jar, adicione-os ao diretório lib do sqoop.
Depois que a adição for concluída, execute o seguinte comando para verificar se foi bem-sucedido:
cd /export/servers/sqoop-1.4.7/
bin/sqoop-version
1.3 Importação de dados
1.3.1 comando sqoop
- Liste todos os bancos de dados no mysql:
bin/sqoop list‐databases ‐‐connect jdbc:mysql://192.168.31.7:3306/ ‐‐username root ‐‐password root
- Verifique quais tabelas estão no banco de dados mysql:
bin/sqoop list‐tables ‐‐connect jdbc:mysql://192.168.31.7:3306/azkaban ‐‐username root ‐‐password root
- Veja o documento de ajuda:
bin/sqoop list‐databases ‐‐help
1.3.2 Exemplo de importação
- Dados da tabela:
create table emp(
id int primary key auto_increment,
name varchar(255) not null default '',
dep varchar(20) default '',
salary int default 0,
dept char(2) default ''
);
create table emp_add(
id int primary key auto_increment,
hon varchar(20) not null default '',
street varchar(20) default '',
city varchar(20) default ''
);
create table emp_conn(
id int primary key auto_increment,
phone varchar(11) not null default '',
email varchar(50) default ''
);
insert into emp values(1201, 'gopal', 'manager', 50000, 'TP');
insert into emp values(1202, 'manisha', 'proof reader', 50000, 'TP');
insert into emp values(1203, 'khalil', 'php dev', 30000, 'AC');
insert into emp values(1204, 'prasanth', 'php dev', 30000, 'AC');
insert into emp values(1205, 'kranthi', 'admin', 20000, 'TP');
insert into emp_add values(1201, '288A', 'vgiri', 'jublee');
insert into emp_add values(1202, '108I', 'aoc', 'sec-bad');
insert into emp_add values(1203, '144Z', 'pgutta', 'hyd');
insert into emp_add values(1204, '78B', 'old city', 'sec-bad');
insert into emp_add values(1205, '720X', 'hitec', 'sec-bad');
insert into emp_conn values(1201, '2356742', '[email protected]');
insert into emp_conn values(1202, '1661663', '[email protected]');
insert into emp_conn values(1203, '8887776', '[email protected]');
insert into emp_conn values(1204, '9988774', '[email protected]');
insert into emp_conn values(1205, '1231231', '[email protected]');
Comando de importação:
# 将emp表数据导入到HDFS中
bin/sqoop import ‐‐connect jdbc:mysql://192.168.31.7:3306/azkaban ‐‐password root ‐‐username root ‐‐table emp ‐‐m 1
Depois que a importação for bem-sucedida, execute o comando HDFS para visualizar o resultado da importação:
hdfs dfs -cat /user/root/emp/part*
Você também pode especificar o parâmetro -target-dir para especificar o diretório HDFS exportado. tal como:
bin/sqoop import --connect jdbc:mysql://192.168.31.7:3306/azkaban --username root --password root --delete-target-dir --table emp --target-dir /sqoop/emp -m 1
Por padrão, o sqoop usa uma vírgula "," para separar os dados em cada coluna. Se você deseja especificar o separador, pode especificar o parâmetro -fields-terminated-by. tal como:
bin/sqoop import --connect jdbc:mysql://192.168.31.7:3306/azkaban --username root --password root --delete-target-dir --table emp --target-dir /sqoop/emp2 -m 1 --fields-terminated-by '\t'
Você também pode exportar dados para o Hive, as etapas de exportação:
- Primeiro
hive‐exec‐3.1.1.jar
copie o pacote para o diretório lib do sqoop;
cp /export/servers/apache‐hive‐3.1.1‐bin/lib/hive‐exec‐3.1.1.jar /export/servers/sqoop‐1.4.7/lib
- Antes de exportar, você precisa criar as tabelas necessárias no hive;
create database sqooptohive;
use sqooptohive;
create external table emp_hive(id int,name string,dep string,salary int ,dept string) row format delimited fields terminated by '\001';
- Executar operações de exportação;
bin/sqoop import ‐‐connect jdbc:mysql://192.168.31.7:3306/azkaban ‐‐username root ‐‐password root ‐‐table emp ‐‐fields‐terminated‐by '\001' ‐‐hive‐import ‐‐hive‐table sqooptohive.emp_hive ‐‐hive‐overwrite ‐‐delete‐target‐dir ‐‐m 1
Descrição do parâmetro ::
‐‐hive‐import
Especifique que o comando deve realizar a operação de importação
--hive-table
;: O nome da tabela Hive a ser exportada ;:
--hive-overwrite
Especifique os dados de origem a serem substituídos ;: Especifique
-m
quantas tarefas de mapa são executadas simultaneamente;
Você pode --hive-database
importar diretamente os dados do mysql e a estrutura da tabela para o hive especificando parâmetros;
bin/sqoop import ‐‐connect jdbc:mysql://192.168.31.7:3306/azkaban ‐‐username root ‐‐password root ‐‐table emp_conn ‐‐hive‐import ‐m 1 ‐‐hive‐database sqooptohive
Se você só precisa exportar dados que atendam às condições, você pode especificar --where
parâmetros.
bin/sqoop import --connect jdbc:mysql://192.168.31.7:3306/azkaban --username root --password root --table emp_add --target‐dir /sqoop/emp_add -m 1 --delete‐target‐dir --where "city = 'sec‐bad'"
Você também pode especificar --query
o comando SQL a ser executado especificando parâmetros.
bin/sqoop import --connect jdbc:mysql://192.168.31.7:3306/azkaban --username root --password root -m 1 --query 'select * from emp_add where city="sec-bad" and $CONDITIONS' --target-dir /sqoop/emp_add --delete-target-dir
Se você repetir o comando de importação acima, verá que a operação de importação subsequente substituirá os dados importados anteriormente. O Sqoop também oferece suporte para 增量导入
que os dados importados posteriormente não substituam os dados importados anteriormente. Se você estiver usando uma importação incremental, você precisa especificar três --incremental
parâmetros: --check-column
, --last-value
,.
// 导入emp表中id大于1202的记录。
bin/sqoop import --connect jdbc:mysql://192.168.31.7:3306/azkaban --username root --password root --table emp --incremental append --check-column id --last-value 1202 -m 1 --target-dir /sqoop/increment
--where
Um controle mais preciso também pode ser obtido por meio de parâmetros.
bin/sqoop import --connect jdbc:mysql://192.168.31.7:3306/azkaban --username root --password root --table emp --incremental append --check-column id --where "id > 1202" -m 1 --target-dir /sqoop/increment
Nota: A importação incremental não pode especificar o parâmetro -delete-target-dir.
1.4 Exportação de dados
A exportação de dados é exportar dados de HDFS para RDMBS. O conteúdo dos dados exportados é o seguinte:
Etapas de exportação de dados:
- Passo 1: Crie uma tabela no banco de dados mysql Os campos da tabela devem ser iguais ao tipo e número de dados a serem exportados no HDFS;
Nota: Antes de realizar a exportação de dados, a tabela de destino já deve existir.
create table emp_out(id int, name varchar(100), dep varchar(50), sal int, dept varchar(10), create_time timestamp);
- Etapa 2: Executar a exportação;
bin/sqoop export --connect jdbc:mysql://192.168.31.7:3306/azkaban --username root --password root --table emp_out --export-dir /sqoop/emp --input-fields-terminated-by ","