#12、Sqoop使用过吗?说一下sqoop的工作原理,以及使用体验

版权声明:打个招呼,转载呗! https://blog.csdn.net/weixin_41919236/article/details/84310258

Sqoop是什么???

Sqoop:SQL-to-Hadoop 传统数据库与Hadoop间数据同步工具 利用Mapreduce分布式批处理,加快了数据传输速度,保证了容错性

Sqoop的工作原理

sqoop1 import原理: 从传统数据库获取元数据信息(schema、table、field、field type),把导入功能转换为只有Map的Mapreduce作业,在mapreduce中有很多map,每个map读一片数据,进而并行的完成数据的拷贝。

sqoop1 export原理: 获取导出表的schema、meta信息,和Hadoop中的字段match;多个map only作业同时运行,完成hdfs中数据导出到关系型数据库中

1、Sqoop介绍

Sqoop即 SQL to Hadoop ,是一款方便的在传统型数据库与Hadoop之间进行数据迁移的工具,充分利用MapReduce并行特点以批处理的方式加快数据传输,发展至今主要演化了二大版本,Sqoop1和Sqoop2,我们以Sqoop1为案例进行讲解,Sqoop2商用不太稳定。

Sqoop工具是hadoop下连接关系型数据库和Hadoop的桥梁,支持关系型数据库和hive、hdfs,hbase之间数据的相互导入,可以使用全表导入和增量导入。

hive的工作原理

在这里插入图片描述

2. sqoop安装

  • 2.1. 上传解压
    tar -zxvf sqoop-1.4.4.bin__hadoop-2.0.4-alpha.tar.gz -C /wishedu/
  • 2.2. 配置环境变量
    vi /etc/profile
    在最后面增加:

export SQOOP_HOME = /wishedu/sqoop-1.4.4 export PATH=$PATH:$JAVA_HOME/bin;$HADOOP_HOME/bin:$SQOOP_HOME/bin

`刷新profile:`

source /etc/profile

  • 2.3. 重命名配置文件

在$SQOOP_HOME/conf中执行命令
mv sqoop-env-template.sh sqoop-env.sh

  • 2.4. 修改配置文件sqoop-env.sh

1.#Set path to where bin/hadoop is available 2.export HADOOP_COMMON_HOME=/wishedu/hadoop-2.4.1/ 3. 4.#Set path to where hadoop-*-core.jar is available 5.export HADOOP_MAPRED_HOME=/wishedu/hadoop-2.4.1/ 6. 7.#set the path to where bin/hbase is available 8.#export HBASE_HOME= 9. 10.#Set the path to where bin/hive is available 11.export HIVE_HOME=/wishedu/hive-0.13.0-bin 12. 13.#Set the path for where zookeper config dir is 14.#export ZOOCFGDIR=

目前是伪分布式部署的hadoop,暂时不用配置zk,Hbase的导入导出详见hbase章节

  • 2.5. 添加数据库驱动

    把MySQL的JDBC驱动包复制到Sqoop的lib目录下

3. sqoop导入导出(hdfs)

  • 3.1. 导入
  • 3.1.1. 普通导入

sqoop import --connect jdbc:mysql://192.168.1.101:3306/mysql --username root --password root --table user --columns ‘name, age’ –m 1 <表没有主键时,需要指定map数量为1>

  • 3.1.2. 指定输出路径、指定数据分隔符

sqoop import --connect jdbc:mysql://192.168.1.101:3306/test --username root --password root --table user --target-dir ‘/sqoop/d1’ --fields-terminated-by '\t’

  • 3.1.3. 指定Map数量 -m

sqoop import --connect jdbc:mysql://192.168.1.101:3306/test --username root --password root --table user --target-dir ‘/sqoop/d1’ --fields-terminated-by ‘\t’ -m 2

  • 3.1.4. 增加where条件

`sqoop import --connect jdbc:mysql://192.168.1.101:3306/test --username root --password root --table user --where ‘age>20’ --target-dir '/sqoop/d1’

  • 3.1.5. 使用query语句

sqoop import --connect jdbc:mysql://192.168.1.101:3306/test --username root --password root --query ‘SELECT * FROM user where age > 20 AND $CONDITIONS’ --split-by user.age --target-dir ‘/sqoop/d1’
使用query语句必须指定split-by和–target-dir

  • 3.1.6. 使用 \将语句换行
    >sqoop import
    –connect jdbc:mysql://192.168.1.101:3306/test
    –username root
    –password root
    –query ‘SELECT * FROM user where age > 20 AND $CONDITIONS’
    –split-by user.age
    –target-dir '/sqoop/d1’
  • 3.1.7. 增量导入
    1、根据id

sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password root --table user --target-dir ‘/sqoop/user’ --incremental append --check-column id --last-value 10 -m 1
–incremental append选项使用append模式,
–check-column id 使用id字段来做增量
–last-value为10,从MySQL表中主键id>10开始同步。

`2、根据时间戳`

–incremental lastmodified --check-column last_update --last-value '2017-03-20 11:00:00’

3.2. 导出

先建好相对应的表,才能导出
sqoop export --connect jdbc:mysql://192.168.1.101:3306/test --username root --password root --export-dir ‘/sqoop/testdata/user’ --table user -m 1 --fields-terminated-by '\t’

4. sqoop导入导出(hive)

  • 4.1. 导入
  • 4.1.1. 普通导入

sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password root --table user --hive-import –m 1
内部执行实际分三部,1.将数据导入hdfs(可在hdfs上找到相应目录),2.创建hive表名相同的表,3,将hdfs上数据导入hive表中

  • 4.1.2. 创建hive表

sqoop create-hive-table --connect jdbc:mysql://localhost:3306/test --username root --password root --table user --hive-table user123 --fields-terminated-by "\t"

  • 4.1.3. 指定hive表名、指定数据分隔符

sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password root --table user --hive-import --hive-table user123 --fields-terminated-by '\t’

  • 4.1.4. 通过create-hive-table创建表

sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password root --table user --hive-import --create-hive-table --hive-table user123 --fields-terminated-by ‘\t’
可以通过 --create-hive-table 创建表,如果表已经存在则会执行失败
如果提示目录已存在,可以在导入脚本后面追加:–delete-target-dir

  • 4.1.5. 覆盖hive表的内容

sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password root --table user --hive-import --hive-overwrite --hive-table user123 --fields-terminated-by '\t’

  • 4.1.6. 增加where条件

sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password root --table user --where ‘age>20’ --hive-import --hive-table user123 --fields-terminated-by '\t’

  • 4.1.7. 指定编码格式

sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password root --table user --where ‘age>20’ --hive-import --hive-table user123 --fields-terminated-by ‘\t’ --default-character-set=utf-8

  • 4.1.8. 使用query语句

sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password root --query ‘select * from user where age>30 and $CONDITIONS’ --hive-import --hive-table user123 --fields-terminated-by ‘\t’ --target-dir ‘/sqoop/user123’ --split-by user.age
使用query语句必须指定split-by和–target-dir

  • 4.1.9. 增量导入
    1、根据id

sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password root --table user --hive-import --hive-table user123 --incremental append --check-column id --last-value 11 --fields-terminated-by '\t’

2、根据时间戳

通过时间戳来增量导入的脚本:
–incremental lastmodified --check-column last_update --last-value ‘2017-03-20 11:00:00’
完整脚本:

sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password root --table user --hive-import --hive-table user123 --incremental lastmodified --check-column last_update --last-value ‘2017-03-20 11:00:00’ --fields-terminated-by '\t’

4.2. 导出

sqoop export --connect jdbc:mysql://localhost:3306/test-username root --password root --export-dir ‘/user/hive/warehouse/user123’ --table user -m 1 --fields-terminated-by '\t’

5. sqoop job指令

5.1. 相关命令:

bin/sqoop job
bin/sqoop-job

5.2. 基本用法:

bin/sqoop job --create 创建job
bin/sqoop job --delete 删除job
bin/sqoop job --exec 执行job
bin/sqoop job --show 显示job
bin/sqoop job --list 列出job

`5.3. 创建和执行job`

创建job(注意:-- import之间需要空格)
sqoop job --create synuser – import --connect jdbc:mysql://localhost:3306/test --username root -P --table user --target-dir ‘/sqoop/ d2’ -m 1
创建了job,id为“synuser”,它是将MySQL数据库test中的user表同步hdfs中。然后我们根据这个job的id去查询job详细配置情况:
bin/sqoop job --show synuser
我们可以通过job的id来执行job:
bin/sqoop job --exec synuser

5.4. 安全配置

默认情况下,创建的每个job在运行的时候都不会进行安全的认证。如果我们希望限制指定的sqoop job的执行,只有经过认证以后才能执行,这时候可以使用sqoop job的安全选项。Sqoop安装目录下,通过修改配置文件conf/sqoop-site.xml可以对job进行更高级的配置。实际上,我们使用了Sqoop的metastore工具,它能够对Sqoop进行细粒度的配置。
我们要将MySQL数据库中的数据同步到Hive表,每次执行sqoop job都需要输入访问MySQL数据库的连接账号信息,可以设置sqoop.metastore.client.record.password的值为true。如果在conf/sqoop-site.xml中增加如下配置,会将连接账号信息存储到Sqoop的metastore中:

1.<property> 2. <name>sqoop.metastore.client.record.password</name> 3. <value>true</value> 4. <description>If true, allow saved passwords in the metastore. </description> 5.</property>

5.5. 定时任务
在实际开发运维过程,我们常常要定时执行导入脚本,可以使用crontab来制作定时任务:
crontab -e
0 */1 * * * sqoop job --exec synuser > sqoop_synuser.log 2>&1 &

猜你喜欢

转载自blog.csdn.net/weixin_41919236/article/details/84310258
今日推荐