Sqoop核心原理及应用详解

Sqoop依赖与hadoop        数据的一方,存储在hdfs        底层的数据传输实现map/reduce yarn 只有map任务 因为官网sqoop没有hadoop2.5对应的版本,要根据hadoop的版本进行编译(好像不用对应版本也可以,不过建议最好对应版本)。所以这里使用CDH 5.3.6。比较稳定。 去Cloudera的官网下载相应的发布版本号 http;//archive.cloudera.com/cdh5/ 使用CDH 5.3.6版本快速搭建Hadoop 2.x的伪分布和Hive环境 Hadoop-2.5.0-cdh5.3.6.tar.gz         安装在/opt/cdh-5.3.6/hadoop-2.5.0-cdh5.3.6 Hive-0.13.1-cdh5.3.6.tar.gz              安装在/opt/cdh-5.3.6/hive-0.13.1-cdh5.3.6 Zookeeper-3.4.5-cdh.5.4.6.tar.gz    安装在/opt/cdh-5.3.6/zookeeper-3.4.5-cdh.5.4.6 Sqoop-1.4.5-cdh5.3.6.tar.gz             安装在/opt/cdh-5.3.6/sqoop-1.4.5-cdh5.3.6

Sqoop 安装及基本使用讲解

(1)解压安装包到/opt/cdh-5.3.6/sqoop-1.4.5-cdh5.3.6

tar –zxvf Sqoop-1.4.5-cdh5.3.6.tar.gz –C /opt/cdh-5.3.6/

(2) 把mysql的jdbc驱动mysql-connector-java-5.1.10.jar复制到sqoop项目的lib目录下

(3) 在${SQOOP_HOME}/conf中执行命令

mv sqoop-env-template.sh sqoop-env.sh

(4) 修改配置文件sqoop-env.sh

#Set path to where bin/hadoop is available
export HADOOP_COMMON_HOME=/opt/cdh-5.3.6/hadoop-2.5.0-cdh5.3.6

#Set path to where hadoop-*-core.jar is available
export HADOOP_MAPRED_HOME=/opt/cdh-5.3.6/hadoop-2.5.0-cdh5.3.6

#set the path to where bin/hbase is available
#export HBASE_HOME=/usr/local/hbase

#Set the path to where bin/hive is available
export HIVE_HOME=/opt/cdh-5.3.6/hive-0.13.1-cdh5.3.6

#Set the path for where zookeper config dir is
#export ZOOCFGDIR=/usr/local/zk

好了,搞定了,下面就可以运行了。

测试:

1、列出mysql数据库中的所有数据库

sqoop list-databases --connect jdbc:mysql://localhost:3306/ -username root -password root

2、连接mysql并列出数据库中的表

sqoop list-tables --connect jdbc:mysql://localhost:3306/test --username root --password root

使用Sqoop导入数据到HDFS及本质分析

(1)gather metadata   获取元数据

(2)submit map only job 提交MR任务 仅仅执行map任务

创建测试表:

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','test2','test2');
insert into my_user values ('3','test3','test3');
insert into my_user values ('4','test4','test4');
insert into my_user values ('5','test5','test5');
insert into my_user values ('6','test6','test6');
insert into my_user values ('7','test7','test7');

导入数据到hdfs

bin/sqoop import \
--connect jdbc:mysql://hadoop-senior.com:3306/test \
--username root \
--password 123456 \
--table my_user  \ 
--target_dir /user/beifeng/sqoop/imp_my_user \
--num-mappers 1 \ 或者-m

不写导出目录,默认导出到用户名下,如:/user/beifeng/my_user

默认4个map任务,默认逗号隔开

Sqoop导入数据设置数据存储格式parquet

hdfs中常见的数据存储格式     textfile     orcfile     parquet

bin/sqoop import \
--connect jdbc:mysql://hadoop-senior.com:3306/test \
--username root \
--password 123456 \
--table my_user  \ 
--target_dir /user/beifeng/sqoop/imp_my_user_parquet \
--num-mappers 1 \
--as-parquetfile

在hive中create table hive_user

create table default.hive_user_orc(
	id int,
	username string,
	passwd string
)
row format delimited fields terminated by ','
stored as parquet

加载数据

load data inpath '/user/beifeng/sqoop/imp_my_user_parquet' into table default.hive_user_orc

查询数据

select * from hive_user_orc;

发现数据全部是null 这是sqoop1.4.5的bug 到1.4.6后已经修复

Sqoop导入数据使用query讲解

查询指定列数据导入

bin/sqoop import \
--connect jdbc:mysql://hadoop-senior.com:3306/test \
--username root \
--password 123456 \
--table my_user  \ 
--target_dir /user/beifeng/sqoop/imp_my_user_columns \ 目标路径
--num-mappers 1 \ map数
--columns id,account \ 导出的指定列

在实际的项目中,要处理的数据,需要进行初步清洗和过滤

 某些字段过滤

 条件

 join

bin/sqoop import \
--connect jdbc:mysql://hadoop-senior.com:3306/test \
--username root \
--password 123456 \
--query 'select id,account from my_user where $CONDITIONS '  \ 
--target_dir /user/beifeng/sqoop/imp_my_user_query \
--num-mappers 1 \

Sqoop导入数据设置数据压缩为sanppy

bin/sqoop import \
--connect jdbc:mysql://hadoop-senior.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' \ 设置字符之间的格式

报错:cdh不支持压缩格式

检查:

cd {hadoop}/bin/native
ls

什么都没有

bin/hadoop checknative 检查本地库支持哪些压缩操作

发现都是false

解决方法:

编译

cdh中的hadoop源码,将native的包拷贝到{hadoop}/bin/hadoop/native下

对snappy压缩数据结合Hive进行数据的导入与分析

drop table if exists default.hive_user_snappy;
create table default.hive_user_snappy(
	id int,
	username string,
	passwd string
)
row format delimited fields terminated by ',';

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

mysql table

 mysql导入数据到hdfs

     hdfs sanpy

 创建hive表

     hive create table

 导入hdfs数据到hive

     load data into table

 hive中数据分析

     query

Sqoop导入数据时两种增量方式导入

增量数据的导入     有一个唯一的标识符,通常这个表都有一个字段,比如插入时间createtime     query         where createtime > 20161105 and createtime < 20161106     sqoop自带增量导入         --check-column  /检查哪一个值         --incremental   /append or lastmodified         --last-value    /检查的值的最后一个值数多少

bin/sqoop import \
--connect jdbc:mysql://hadoop-senior.com:3306/test \
--username root \
--password 123456 \
--table my_user  \ 
--target_dir /user/beifeng/sqoop/imp_my_increament \
--num-mappers 1 \
--incremental append \ 不能和--delete-target-dir一起使用
--check-column id \
--last-value 4

Sqoop导入数据direct使用

bin/sqoop import \
--connect jdbc:mysql://hadoop-senior.com:3306/test \
--username root \
--password 123456 \
--table my_user  \ 
--target_dir /user/beifeng/sqoop/imp_my_direct \
--delete-target_dir \
--num-mappers 1 \
--direct
速度变快

Sqoop导出数据Export使用

hive table     table             hiveserver2进行jdbc方式查询数据     hdfs file         export -> mysql/oracle

touch /opt/datas/user.txt
vi /opt/datas/user.txt
	8,test8,test8
	9,test9,test9
bin/hdfs dfs -mkdir -p /user/beifeng/sqoop/exp/user/
bin/hdfs dfs -put /opt/datas/user /user/beifeng/sqoop/exp/user/

		
bin/sqoop export \
--connect jdbc:mysql://hadoop-senior.com:3306/test \
--username root \
--password 123456 \
--table my_user  \ 
--export-dir /user/beifeng/sqoop/exp/user \
--num-mappers 1 \

Sqoop如何将RDBMS表中的数据导入到Hive表中

use default;
create table user_hive(
	id int,
	account string,
	passwd string
)
row format delimited fields terminated by '\t'
bin/sqoop import \
--connect jdbc:mysql://hadoop-senior.com:3306/test \
--username root \
--password 123456 \
--table my_user  \ 
--delete-target-dir \
--fields-terminated-by '\t' \
--num-mappers 1 \
--hive-import \
--hive-database default \
--hive-table user_hive

Sqoop如何导出Hive表中数据到RDBMS中

这就是将hdfs中数据导出到rdbms中,同:Sqoop导出数据Export使用

Sqoop使用--options-file进行运行任务讲解

Hive中有     bin/hive –f 脚本 便可以执行 sqoop中使用     bin/sqoop –option-file 脚本 便可以执行了,脚本最好按官方文档写

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Sqoop是一个用于在关系型数据库和Hadoop之间进行数据传输的工具。它的工作原理可以简单概括为以下几个步骤: 1. 连接数据库:首先,Sqoop会使用提供的连接信息(包括数据库URL、用户名和密码)连接到关系型数据库。 2. 选择数据:然后,Sqoop会根据指定的表名或查询语句选择要导入或导出的数据。 3. 数据传输:Sqoop会将选定的数据从关系型数据库中提取出来,并将其转换为适合Hadoop处理的格式(如文本文件或Avro文件)。 4. 数据存储:接下来,Sqoop会将转换后的数据存储到Hadoop分布式文件系统(HDFS)或其他支持的存储系统(如HBase或Hive)中。 5. 完成任务:最后,Sqoop会返回任务的执行结果,包括导入或导出的数据量、执行时间等信息。 总的来说,Sqoop通过连接数据库、选择数据、数据传输和数据存储等步骤,实现了关系型数据库与Hadoop之间的数据交互。这使得用户可以方便地将关系型数据库中的数据导入到Hadoop中进行分析和处理,或将Hadoop中的数据导出到关系型数据库中进行存储和查询。\[1\]\[3\] #### 引用[.reference_title] - *1* *2* *3* [Sqoop基本原理及常用方法](https://blog.csdn.net/weixin_48482704/article/details/109821541)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值