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 脚本 便可以执行了,脚本最好按官方文档写