sqoop数据的导入和导出

本文介绍如何使用 Sqoop 在 MySQL 和 HDFS 或 Hive 间高效迁移数据,涵盖基本操作、高级选项如 Parquet 格式存储、列选择及数据压缩等。

一、sqoop使用导入
1、链接MySQL,查看有哪些表,换行语句必须有(空格+\)
bin/sqoop list-databases \
--connect jdbc:mysql://hadoop-senior.ibeifeng.com:3306 \
--username root \
--password 123456
2、导入数据到HDFS
在MySQL创建一张表,并准备一些数据
CREATE TABLE `my_user` (
   `id` tinyint(4) NOT NULL AUTO_INCREMENT,
   `account` varchar(255) DEFAULT NULL,
   `passwd` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
);

INSERT INTO `my_user` VALUES ('1', 'admin', 'admin');
INSERT INTO `my_user` VALUES ('2', 'pu', '12345');
INSERT INTO `my_user` VALUES ('3', 'system', 'system');
INSERT INTO `my_user` VALUES ('4', 'zxh', 'zxh');
INSERT INTO `my_user` VALUES ('5', 'test', 'test');
INSERT INTO `my_user` VALUES ('6', 'pudong', 'pudong');
INSERT INTO `my_user` VALUES ('7', 'qiqi', 'qiqi');

    2.1、普通导入

bin/sqoop import \                                                                                //导入数据到HDFS
--connect jdbc:mysql://hadoop-senior.ibeifeng.com:3306/test \               //链接MySQL的 test 库

--username root \                                                                                       

--password 123456 \

--table my_user \
--target-dir /user/beifeng/sqoop/imp_my_user \                                      //从MySQL中一张表输出到HDFS指定目录

--num-mappers 1                                                                                    //设定map个数

    2.2、>>>>>>>>>>>>>>import hdfs : parquet格式存储>>>>>>>>>>>>>>>>>>
        bin/sqoop import \
        --connect jdbc:mysql://hadoop-senior.ibeifeng.com:3306/test \
        --username root \
        --password 123456 \
        --table my_user \
        --target-dir /user/beifeng/sqoop/imp_my_user_parquet \
        --fields-terminated-by ',' \
        --num-mappers 1 \

        --as-parquetfile

2.3、>>>>>>>>>>>>>>>>>import hdfs : columns 只导入选中的列>>>>>>>>>>>>>>>>>>
        bin/sqoop import \
        --connect jdbc:mysql://hadoop-senior.ibeifeng.com:3306/test \
        --username root \
        --password 123456 \
        --table my_user \
        --target-dir /user/beifeng/sqoop/imp_my_user_column \
        --num-mappers 1 \

        --columns id,account                        //只将my_user表中的 id和account两个字段导入到HDFS

2.4、* 在实际的项目中,要处理的数据,需要进行初步清洗和过滤(query的使用
* 某些字段过滤
* 条件

* join

        bin/sqoop import \
        --connect jdbc:mysql://hadoop-senior.ibeifeng.com:3306/test \
        --username root \
        --password 123456 \
        --
query 'select id, account from my_user where $CONDITIONS' \                    //与columns得出的结果相同
        --target-dir /user/beifeng/sqoop/imp_my_user_query \

        --num-mappers 1

3、导入时数据压缩 compress  配置

>>>>>>>>>>>>>>>>>import hdfs : compress >>>>>>>>>>>>>>>>>>
        bin/sqoop import \
        --connect jdbc:mysql://hadoop-senior.ibeifeng.com:3306/test \
        --username root \
        --password 123456 \
        --table my_user \
        --target-dir /user/beifeng/sqoop/imp_my_sannpy \
        --delete-target-dir \                                                                   
//若目标目录存在则删除
        --num-mappers 1 \
        --compress \                                                                                //启用压缩
        --compression-codec org.apache.hadoop.io.compress.SnappyCodec \                //设置所用压缩的压缩码

        --fields-terminated-by '\t'

在hive中创建一张表并将导入的数据加载进表:

        drop table if exists default.hive_user_snappy ;

        create table default.hive_user_snappy(
        id int,
        username string,
        password string
        )

        ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' ;

load data inpath '/user/beifeng/sqoop/imp_my_sannpy' into table default.hive_user_snappy ;

4、导入的一个优化:direct ,导入数据较快

>>>>>>>>>>>>>>>>>import hdfs direct >>>>>>>>>>>>>>>>>>
bin/sqoop import \
--connect jdbc:mysql://hadoop-senior.ibeifeng.com:3306/test \
--username root \
--password 123456 \
--table my_user \
--target-dir /user/beifeng/sqoop/imp_my_incr \
--num-mappers 1 \
--delete-target-dir \

--direct

二、数据导出

        1、>>>>>>>>>>>>>>>>>export mysql table >>>>>>>>>>>>>>>>>>
                touch /opt/datas/user.txt
                vi /opt/datas/user.txt
                12,beifeng,beifeng
                13xuanyun,xuanyu

                bin/hdfs dfs -mkdir -p /user/beifeng/sqoop/exp/user/ 
                bin/hdfs dfs -put /opt/datas/user.txt /user/beifeng/sqoop/exp/user/       
//随便创建一个文件上传到HDFS

                bin/sqoop export \                                                    //导出
                --connect jdbc:mysql://hadoop-senior.ibeifeng.com:3306/test \
                --username root \
                --password 123456 \
                --table my_user \                                                       //导出到MySQL的my_user表
                --export-dir /user/beifeng/sqoop/exp/user/ \            //需要导出的文件所在目录

                --num-mappers 1

三、===================导入导出Hive======================
Hive数据存储在hdfs上
schema
table location / file

>>>>>>>>>>>>>>>>>
import hive table(MySQL数据导入到hive表中) >>>>>>>>>>>>>>>>>>
use default ;
drop table if exists user_hive ;
create table user_hive(
id int,
account string, 
password string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' ;

bin/sqoop import \
--connect jdbc:mysql://hadoop-senior.ibeifeng.com:3306/test \
--username root \
--password 123456 \
--table my_user \                                           
//将MySQL的my_user中数据导入到hive
--fields-terminated-by '\t' \                            //导入的数据每列用制表符分隔
--delete-target-dir \
--num-mappers 1 \
--hive-import \                                                //导入到hive
--hive-database default \                                //使用hive的哪个数据库
--hive-table user_hive                                      //导入到该数据库的哪张表

>>>>>>>>>>>>>>>>>export mysql table (hive中数据导出到MySQL表)>>>>>>>>>>>>>>>>>>
CREATE TABLE `my_user2` (
  `id` tinyint(4) NOT NULL AUTO_INCREMENT,
  `account` varchar(255) DEFAULT NULL,
  `passwd` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
);

bin/sqoop export \
--connect jdbc:mysql://hadoop-senior.ibeifeng.com:3306/test \
--username root \
--password 123456 \
--table my_user2 \
--export-dir /user/hive/warehouse/user_hive \
--num-mappers 1 \
--input-fields-terminated-by '\t'

=======================================================
shell scripts
## step 1
load data ...
## step 2
bin/hive -f xxxx
## step 3
bin/sqoop --options-file /opt/datas/sqoop-import-hdfs.txt 


### Hadoop中Sqoop数据导入导出的相关报告与使用指南 #### 一、Sqoop简介及其作用 Sqoop是一种用于在关系型数据库(RDBMS)Hadoop生态系统之间高效传输大量数据的工具。其核心功能在于将数据从传统的关系型数据库迁移到Hadoop分布式文件系统(HDFS),或者反之亦然[^3]。 #### 二、Sqoop的工作机制 Sqoop通过将用户的导入导出命令转化为MapReduce程序来完成数据传输任务。在此过程中,主要涉及对`InputFormat``OutputFormat`类别的自定义实现。值得注意的是,在大多数情况下,Sqoop仅利用Map阶段而省略了Reduce阶段,以此提高效率并减少不必要的资源消耗[^5]。 #### 三、数据导入操作详解 ##### (1)基本概念 数据导入是指将外部关系型数据库中的表数据加载到HDFS上的过程。这一过程可以按需配置多种参数以满足不同的业务需求[^1]。 ##### (2)常用选项说明 - `--connect`: 指定JDBC连接字符串。 - `--username/--password`: 提供访问目标数据库所需的认证信息。 - `--table`: 明确要迁移的具体表格名称。 - `--target-dir`: 设置HDFS目录路径作为最终存储位置。 示例代码如下所示: ```bash sqoop import \ --connect jdbc:mysql://localhost/testdb \ --username root \ --password secret \ --table employees \ --target-dir /user/hdfs/sqoop_imported_data ``` ##### (3)高级特性支持 除了基础的功能外,还支持诸如增量导入等功能,允许只同步新增加的部分记录而非整个表的内容[^4]。 #### 四、数据导出操作解析 相对应地,数据导出则是指把已经存在于HDFS内的数据写回到指定的关系型数据库里去的操作模式[^2]。 同样存在一些重要的标志位可供调整优化性能表现: - `-m`, 或者完整的形式为`--num-mappers`:控制并发度大小,默认值通常设为四; - `--export-dir`: 声明待转移出去的数据所在的确切地址; 举例如下: ```bash sqoop export \ --connect jdbc:mysql://localhost/target_db \ --username admin \ --password passw0rd \ --table destination_table \ --export-dir /path/to/export/data \ --input-fields-terminated-by ',' \ --lines-terminated-by '\n' ``` #### 五、注意事项及最佳实践建议 为了确保顺利完成每一次的数据交换活动,请务必遵循以下几点提示事项: - 验证网络连通状况良好无误; - 测试所使用的驱动版本兼容性正常运作; - 考虑设置合理的分区策略降低单次作业规模提升整体吞吐量水平等等[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值