sqoop概念
Sqoop是一种旨在在Apache Hadoop和结构化数据存储(例如关系数据库)之间高效传输批量数据的工具。通过内嵌的MapReduce程序实现关系型数据库和HDFS、Hbase、Hive等数据的倒入导出。
此次用到的hadoop是CDH版的,不需要源码编译生成64位的文件,可以省略一些时间。
Hadoop(CDH)环境搭建
1. ip 主机名 映射 防火墙 selinux jdk ssh
2. hadoop解压缩
3. 修改hadoop相关配置文件
hadoop-env.sh
core-site.xml
hdfs-site.xml
mapred-site.xml
yarn-site.xml
slaves
4. 解压缩cdh5.3.6-snappy-lib-natirve.tar.gz 替换 hadoop中的native文件的内容
解决的是64操作系统兼容的问题
5. 格式化
bin/hdfs namenode -format
6. 启动进程 4个进程
namenode、datanode、resourceManager、nodeManager
Hive(CDH)环境搭建
1. 解压缩hive
2. 修改hive_home/conf/hive-env.sh
hadoop_home
hive_conf_dir
修改hive-site.xml 修改metastore 预先安装mysql
3. 上传mysql驱动jar
4. hdfs 创建2个目录 /tmp /user/hive/warehouse
5. 启动hive
Sqoop(CDH)环境搭建
1. 解压缩 sqoop
2. 配置 sqoop_home/conf
sqoop-env.sh
export HADOOP_COMMON_HOME=/opt/install/hadoop-2.5.0-cdh5.3.6
export HADOOP_MAPRED_HOME=/opt/install/hadoop-2.5.0-cdh5.3.6
export HIVE_HOME=/opt/install/hive-0.13.1-cdh5.3.6
#如果将来对接hbase,需要改HBASE_HOME; 有zookeeper,需要改ZOOCFGDIR
3. 上传mysql驱动jar
4. 测试是否安装成功
sqoop version #查看sqoop版本
#测试连接mysql
bin/sqoop list-databases -connect jdbc:mysql://主机名:3306 -username root -password 123456
Sqoop语法详解
- 语法格式
1. bin/sqoop list-databases -connect jdbc:mysql://主机名:3306 -username root -password 123456
2.(推荐这种,可读性强)
bin/sqoop list-databases \
--connect \
jdbc:mysql://主机名:3306 \
--username root \
--password 123456
-
Import导入 (MySQL ----> HDFS/Hive)
a.准备数据mysql的数据
create database sqoop
create table mysql_user(
id int primary key,
name varchar(12)
);
insert into mysql_user valuse(1,‘zhangsan’);
insert into mysql_user valuse(2,‘lisi’);
insert into mysql_user valuse(3,‘wangwu’);
insert into mysql_user valuse(4,‘zhaoliu’);b.数据导入
# mysql导入到hdfs bin/sqoop import \ --connect \ jdbc:mysql://主机名:3306/sqoop \ --username root \ --password 123456 \ --table mysql_user 这里未指定导入到hdfs的位置, 会默认导入到:/user/root/mysql_user /user/${username}/${table_name sqoop导数据时,所运行的mapreduce 没有reduce只有map 为什么sqoop导数据时,4行数据生成了4个map文件? hdfs存文件文件时:Text --- TextInputFormat ---- block --- split --- map 导入时:DB --- DBInputFormat --- 一行 --- 一个split -- 一个map 注意:输出的文件内容中,列之间的分隔符默认是,
# 自定义mysql导入hdfs目录 参数:--target-dir /目录 例如: bin/sqoop import \ --connect \ jdbc:mysql://主机名:3306/sqoop \ --username root \ --password 123456 \ --table mysql_user \ --target-dir /sqoop
# 在目标目录存在的情况下,sqoop自动删除 参数:--delete-target-dir 例如: bin/sqoop import \ --connect \ jdbc:mysql://主机名:3306/sqoop \ --username root \ --password 123456 \ --table mysql_user \ --target-dir /sqoop \ --delete-target-dir
# 指定map的个数 如果一行数据对应一个map文件,而hdfs默认块大小为128M,那么会造成资源浪费,为了避免这种情况,需要制定map个数 参数:--num-mappers 例如: bin/sqoop import \ --connect \ jdbc:mysql://hadoop22.baizhiedu.com:3306/sqoop \ --username root \ --password 123456 \ --table mysql_user \ --target-dir /sqoop \ --num-mappers 1 \ --delete-target-dir
# 指定列分割符 参数:--fields-terminated-by '分隔符' 例如: bin/sqoop import \ --connect \ jdbc:mysql://hadoop22.baizhiedu.com:3306/sqoop \ --username root \ --password 123456 \ --table mysql_user \ --target-dir /sqoop \ --num-mappers 1 \ --delete-target-dir \ --fields-terminated-by '\t'
# 增量导入数据 需要加3个参数 #选择哪个列作为增量数据的判断依据 --check-column <column> Source column to check for incremental #指定自从上次导入后列的最大值(大于该指定的值),也可以自己设定某一值 --last-value <value> Last imported value in the incremental #增量方式: append:追加,比如对大于last-value指定的值之后的记录进行追加导入。 lastmodified:最后的修改时间,追加last-value指定的日期之后的记录 如果是以日期作为追加导入的依据,则使用lastmodified,否则就使用append值 --incremental <import-type> Define an incremental import of type append 'append' or 'lastmodified' # 一定不要加入 --delete-target-dir bin/sqoop import \ --connect \ jdbc:mysql://主机名/sqoop \ --username root \ --password 123456 \ --table mysql_user \ --target-dir /sqoop \ --num-mappers 1 \ --fields-terminated-by '\t' \ --check-column id \ --last-value 5 \ --incremental append
# 快速导入模式 参数:--direct 例如: bin/sqoop import \ --connect \ jdbc:mysql://主机名:3306/sqoop \ --username root \ --password 123456 \ --table mysql_user \ --target-dir /sqoop \ --num-mappers 1 \ --delete-target-dir \ --direct --fields-terminated-by '\t' 原理:非快速模式 数据的导入 jdbc 快速 使用的是mysql提供的export、import工具 注意: sqoop如果和mysql 安装在不同的机器中 ,使用快速导入 默认报错。 sqoop快速导入时,调用的是本机的mysql的bin命令(export、import); 如果需要解决这个问题,只需将mysql的bin文件夹copy一份到sqoop主机上(mysql的安装目录位置),同时配置环境变量
# 向hive表中导数据 3个参数: --hive-import \ --hive-database db_name\ --hive-table table_name\ 例如: bin/sqoop import \ --connect \ jdbc:mysql://hadoop22.baizhiedu.com:3306/sqoop \ --username root \ --password 123456 \ --table mysql_user \ --delete-target-dir \ --hive-import \ --hive-database baizhi_150 \ --hive-table t_user \ --num-mappers 1 \ --fields-terminated-by '\t'
-
数据导出(hdfs/hive–>mysql)
#在mysql中准备一张表 create table to_mysql( id int, name varchar(50) ); 1. hdfs------>mysql bin/sqoop export \ --connect \ jdbc:mysql://主机名:3306/sqoop \ --username root \ --password 123456 \ --table to_mysql \ --export-dir /sqoop \ --num-mappers 1 \ --input-fields-terminated-by ',' 2. hive ------->mysql bin/sqoop export \ --connect \ jdbc:mysql://主机名:3306/sqoop \ --username root \ --password 123456 \ --table to_mysql \ --export-dir /user/hive/warehouse/db_name/table_name \ --num-mappers 1 \ --input-fields-terminated-by ','
sqoop中文网址,可以查询参数