Sqoop工具

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. 语法格式
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 
  1. 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'
    
  2. 数据导出(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中文网址,可以查询参数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值