SQOOP

本文介绍了使用 SQOOP 进行数据迁移的方法,包括 MySQL 和 HDFS 之间的数据导入导出过程。涵盖 SQOOP 的安装配置、常用命令及参数详解,如 --hive-import、--append 等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SQOOP是用于对数据进行导入导出的。
    (1)把MySQL、Oracle等数据库中的数据导入到HDFS、Hive、HBase中

    (2)把HDFS、Hive、HBase中的数据导出到MySQL、Oracle等数据库中


SQOOP安装
1.加压:tar -zxvf sqoop-1.4.3.bin__hadoop-1.0.0.tar.gz 重命名
2.设置环境变量:
export SQOOP_HOME=/usr/local/sqoop
export PATH=.:$HADOOP_HOME/bin:$JAVA_HOME/bin:$PIG_HOME/bin:$HIVE_HOME/bin:$SQOOP_HOME/bin:$PATH
3.执行sqoop命令进入sqoop
   将mysql驱动复制到sqoop/lib/目录下
   cp mysql-connector-java-5.1.10.jar /usr/local/sqoop/lib/



1.把数据从mysql导入到hdfs(默认是/user/<username>)中

sqoop import --connect jdbc:mysql://hadoop0:3306/hive  --username root --password admin --table TBLS --fields-terminated-by '\t' 

默认情况下,如果字段内容为null,就显示null值







sqoop import --connect jdbc:mysql://xxc:3306/hive  --username root --password xxc --table TBLS --fields-terminated-by '\t'  --null-string '**'

--null-string '**',就表示把null值用**替代,注意不能用--,因为是关键字  


   

-m 1是指定只有一个map执行任务,这样输出结果就不会有多个part-m-*****了    sqoop在导入的时候默认会启动4个map任务并行执行导入,这样可以加快执行速度



--append表示追加,继续在目录(这里是默认的/user/<username>)下

否则会出异常,文件夹已存在ERROR tool.ImportTool: ERROR tool.ImportTool: Encountered IOException running import job: org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory TBLS already exists 

sqoop import --connect jdbc:mysql://xxc:3306/hive  --username root --password xxc --table TBLS --fields-terminated-by '\t'  --null-string '**'  -m 1--append 


--hive-import表示导入到hive目录下
sqoop import --connect jdbc:mysql://hadoop0:3306/hive  --username root --password admin--table TBLS --fields-terminated-by '\t'  --null-string '**'  -m 1 --append  --hive-import


hive在hdfs中的默认位置是/user/hive/warehouse,是由配置文件hive-conf.xml中属性hive.metastore.warehouse.dir决定的。


例如导入表A数据到HDFS中,而且表A数据是在增加的,并且已经将表A数据导入过HDFS中,现在不想将表A数据再次全部导入HDFS中,而是将增加的部分导入HDFS中。

--check-column 'TBL_ID'  表示按照这个列来进行检查,如果这个列的数据增加了,就把增加部分的数据导入到HDFS中   
--last-value 6   如何晓得哪些数据是新增部分呢?这个是设置TBL_ID  上一次最后一行的值为6

--incremental  append  表示只将新增的数据追加进去
sqoop import --connect jdbc:mysql://xxc:3306/hive  --username root --password xxc --table TBLS --fields-terminated-by '\t'  --null-string '**'  -m 1 --append  --hive-import  --check-column 'TBL_ID' --incremental append --last-value 6


2.把数据从hdfs导出到mysql中  

--table ids  表示导出的表名   --export-dir '/ids'表示导出哪个目录   注意:这个导出是可以重复执行的。
sqoop export --connect jdbc:mysql://xxc:3306/hive  --username root --password xxc --table ids --fields-terminated-by '\t' --export-dir '/ids'


3.设置为作业,运行作业
sqoop job --create myjob -- import --connect jdbc:mysql://xxc:3306/hive  --username root --password xxc --table TBLS --fields-terminated-by '\t'  --null-string '**'  -m 1 --append  --hive-import  
  用sqoop job list查看创建了哪些作业
  运行作业  sqoop job -exec myjob  但是发现运行后需要手动输入数据库密码
  将sqoop下conf下的sqoop-site.xml文件中下面这段代码的注释去掉,表示保存密码
   <!--
  <property>
    <name>sqoop.metastore.client.record.password</name>
    <value>true</value>
    <description>If true, allow saved passwords in the metastore.
    </description>
  </property>
  -->
  sqoop job --delete myjob  删除作业
4. 导入导出的事务是以Mapper任务为单位。


### Sqoop 使用指南与介绍 #### 什么是SqoopSqoop(SQL-to-Hadoop)是一个开源工具,主要用于在Hadoop和结构化数据源(如关系型数据库、企业数据仓库等)之间进行高效的数据传输。它支持将关系型数据库中的数据导入到Hadoop的HDFS、Hive或HBase中,同时也支持将Hadoop中的数据导出到关系型数据库[^1]。 #### Sqoop的版本 Sqoop目前存在两个主要版本:1.4.x(通常称为Sqoop1)和1.9.x(通常称为Sqoop2)。尽管Sqoop2在架构和实现上对Sqoop1进行了较大改进,但两者之间并不兼容。本文内容基于Sqoop1进行讲解。 #### Sqoop的基本架构 Sqoop的核心架构设计使得它可以轻松地与Hadoop生态系统集成。其主要组件包括: - **Connectors**:用于连接不同类型的关系型数据库。 - **Drivers**:负责执行具体的数据库操作。 - **MapReduce任务**:通过Hadoop的MapReduce框架实现并行数据导入/导出[^1]。 #### Sqoop的环境配置 在使用Sqoop之前,需要正确配置环境变量。这通常涉及修改`sqoop-env.sh`文件以指定Hadoop、Hive、HBase等相关路径。例如: ```bash # Set Hadoop-specific environment variables here. export HADOOP_COMMON_HOME=/usr/local/hadoop/ export HADOOP_MAPRED_HOME=/usr/local/hadoop export HBASE_HOME=/usr/local/hbase export HIVE_HOME=/usr/local/hive ``` 上述配置确保Sqoop能够找到Hadoop、HBase和Hive的安装路径,并正确运行相关任务[^3]。 #### Sqoop的基本用法 以下是一些常见的Sqoop命令及其用途: 1. **从MySQL导入数据到HDFS**: ```bash sqoop import \ --connect jdbc:mysql://<host>:<port>/<database> \ --username <username> \ --password <password> \ --table <table_name> \ --target-dir /path/to/hdfs/directory \ --split-by <column_name> ``` 其中,`--split-by`参数用于指定拆分列,通常选择主键或唯一索引列以避免重复数据[^4]。 2. **创建、列出和执行Job任务**: - 创建Job任务: ```bash sqoop job --create <job_name> -- import ... ``` - 列出所有Job任务: ```bash sqoop job --list ``` - 删除Job任务: ```bash sqoop job --delete <job_name> ``` - 执行Job任务: ```bash sqoop job --exec <job_name> ``` 3. **增量导入**: 增量导入允许用户仅导入自上次导入以来新增或更新的数据。示例命令如下: ```bash sqoop import \ --connect jdbc:mysql://<host>:<port>/<database> \ --username <username> \ --password <password> \ --table <table_name> \ --incremental append \ --check-column <timestamp_column> \ --last-value <last_value> ``` 这里,`--incremental`参数指定了增量模式(如`append`),`--check-column`指定了时间戳列,而`--last-value`指定了上次导入的最大值[^2]。 4. **数据格式转换**: Sqoop支持多种数据格式的转换,例如CSV、Avro、Parquet等。可以通过`--as-textfile`、`--as-avrodatafile`或`--as-parquetfile`等参数指定输出格式[^2]。 #### Sqoop的最佳实践 - 在表没有主键的情况下,可以使用`--split-by`参数指定一个分布均匀的列(如PI字段在Teradata中[^5])。 - 配置合适的分片数以优化性能,避免过多或过少的Map任务[^1]。 ### 示例代码 以下是一个完整的Sqoop导入命令示例,展示如何从MySQL数据库导入数据到HDFS: ```bash sqoop import \ --connect jdbc:mysql://localhost:3306/mydb \ --username root \ --password secret \ --table employees \ --target-dir /user/hadoop/employees \ --split-by id \ --num-mappers 4 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值