ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

ETL工具 -- Sqoop

2022-05-03 15:00:43  阅读:158  来源: 互联网

标签:sqoop -- TIMESTAMP Sqoop DEFAULT emp NULL ETL


1. 概述

  • Sqoop是apache旗下的一款 ”Hadoop和关系数据库之间传输数据”的工具
    导入数据:将MySQL,Oracle导入数据到Hadoop的HDFS、HIVE、HBASE等数据存储系统
    导出数据:从Hadoop的文件系统中导出数据到关系数据库

2. Sqoop的工作机制

  • 将导入和导出的命令翻译成mapreduce程序实现
  • 在翻译出的mapreduce中主要是对inputformat和outputformat进行定制

3. Sqoop1与Sqoop2架构对比

  • sqoop在发展中的过程中演进出来了两种不同的架构.架构演变史
  • Sqoop1架构

​ 版本号为1.4.x为sqoop1
​ 在架构上:sqoop1使用sqoop客户端直接提交的方式
​ 访问方式:CLI控制台方式进行访问
​ 安全性:命令或脚本中指定用户数据库名及密码

  • Sqoop2架构

​ 版本号为1.99x为sqoop2
​ 在架构上:sqoop2引入了sqoop server,对connector实现了集中的管理
​ 访问方式:REST API、 JAVA API、 WEB UI以及CLI控制台方式进行访问

  • sqoop1与sqoop2比较

Sqoop安装部署

 

第一步:下载安装包

https://mirrors.bfsu.edu.cn/apache/sqoop/1.4.7

第二步:上传并解压

  • 将我们下载好的安装包上传到hadoop03服务器的/bigdata/soft路径下,然后进行解压
cd /bigdata/soft/
tar -xzvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz -C /bigdata/install

第三步:修改配置文件

  • 更改sqoop的配置文件
cd /bigdata/install/sqoop-1.4.7.bin__hadoop-2.6.0/conf/
mv sqoop-env-template.sh sqoop-env.sh
vim sqoop-env.sh

#Set path to where bin/hadoop is available
export HADOOP_COMMON_HOME=/bigdata/install/hadoop-3.1.4

#Set path to where hadoop-*-core.jar is available
export HADOOP_MAPRED_HOME=/bigdata/install/hadoop-3.1.4

#set the path to where bin/hbase is available
export HBASE_HOME=/bigdata/install/hbase-2.2.6

#Set the path to where bin/hive is available
export HIVE_HOME=/bigdata/install/hive-3.1.2

#Set the path for where zookeper config dir is
export ZOOCFGDIR=/bigdata/install/zookeeper-3.6.2

第四步:添加两个必要的jar包

  • sqoop需要两个额外依赖的jar包,将课件资料当中两个jar包添加到sqoop的lib目录下
cd /bigdata/soft
cp java-json.jar mysql-connector-java-5.1.38.jar /bigdata/install/sqoop-1.4.7/lib/

第五步:配置sqoop的环境变量

sudo vim /etc/profile	

# 添加如下内容
export SQOOP_HOME=/bigdata/install/sqoop-1.4.7
export PATH=:$SQOOP_HOME/bin:$PATH
  • 让环境变量生效
source /etc/profile
1. sqoop help有warning日志
  • 执行命令sqoop help,有warning日志

  • 解决方案

[hadoop@hadoop03 bin]$ pwd
/bigdata/install/sqoop-1.4.7/bin
# 搜索HCAT_HOME,将下图红框内容注释掉
[hadoop@hadoop03 bin]$ vim configure-sqoop

2. sqoop help有错误
  • 运行sqoop help有错误:
    • 错误: 找不到或无法加载主类 org.apache.hadoop.hbase.util.GetJavaProperty
  • 此错误,不影响sqoop的;可以忽略不管
    • 如果有洁癖,可以看如下方式解决
1. 解决方案一:
  • 简单的做法,直接用修改过的hbase文件,替换集群3个节点目录/bigdata/install/hbase-2.2.6/bin中的hbase文件
  • 重启hbase集群即可
2. 解决方案二
  • hadoop01修改hbase命令文件
[hadoop@hadoop01 bin]$ cd /bigdata/install/hbase-2.2.6/bin/
[hadoop@hadoop01 bin]$ vim hbase
  • 如下图显示,找到指定的位置(根据行号或关键字内容进行定位)

    • 新增第一个红框的内容;注意缩进
        # Needed for GetJavaProperty check below
        add_to_cp_if_exists "${HBASE_HOME}/hbase-server/target/classes"
    
    • 将第二个红框的内容注释掉
  • 继续查找hbase文件,定位到如下黄框内容

  • 在上图322行(第一个黄色框)增加下图①的代码;注意缩进

  temporary_cp=
  for f in "${HBASE_HOME}"/lib/hbase-server*.jar; do
    if [[ ! "${f}" =~ ^.*\-tests\.jar$ ]]; then
      temporary_cp=":$f"
    fi
  done
  • 将上图的第二个黄色框的内容修改成下图②的代码;注意缩进
  HADOOP_JAVA_LIBRARY_PATH=$(HADOOP_CLASSPATH="$CLASSPATH${temporary_cp}" "${    HADOOP_IN_PATH}" \

  • 保存退出
  • 将hbase分发到另外两个节点
[hadoop@hadoop01 bin]$ pwd
/bigdata/install/hbase-2.2.6/bin
[hadoop@hadoop01  bin]$ scp hbase hadoop02:$PWD
[hadoop@hadoop01  bin]$ scp hbase hadoop03:$PWD
RUBY 复制 全屏
  • 重启hbase

Sqoop的数据导入

 

1. 列举出所有的数据库

  • 命令行查看帮助
sqoop help
  • 列出hadoop02主机所有的数据库
sqoop list-databases --connect jdbc:mysql://hadoop02:3306/ --username root --password 123456
  • 查看某一个数据库下面的所有数据表(将数据库名称hive替换成自己的某个数据库名)
sqoop list-tables --connect jdbc:mysql://hadoop02:3306/mysql --username root --password 123456

2. 准备表数据

  • 在mysql中有一个库userdb中三个表:emp, emp_add和emp_conn

  • 表emp:

    idnamedegsalarydept
    1201 gopal manager 50,000 TP
    1202 manisha Proof reader 50,000 TP
    1203 khalil php dev 30,000 AC
    1204 prasanth php dev 30,000 AC
    1205 kranthi admin 20,000 TP
  • 表emp_add:

    idhnostreetcity
    1201 288A vgiri jublee
    1202 108I aoc sec-bad
    1203 144Z pgutta hyd
    1204 78B old city sec-bad
    1205 720X hitec sec-bad
  • 表emp_conn:

    idphnoemail
    1201 2356742 gopal@tp.com
    1202 1661663 manisha@tp.com
    1203 8887776 khalil@ac.com
    1204 9988774 prasanth@ac.com
    1205 1231231 kranthi@tp.com
  • 建表语句如下:

CREATE DATABASE /*!32312 IF NOT EXISTS*/`userdb` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `userdb`;

DROP TABLE IF EXISTS `emp`;

CREATE TABLE `emp` (
  `id` INT(11) DEFAULT NULL,
  `name` VARCHAR(100) DEFAULT NULL,
  `deg` VARCHAR(100) DEFAULT NULL,
  `salary` INT(11) DEFAULT NULL,
  `dept` VARCHAR(10) DEFAULT NULL,
  `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `is_delete` BIGINT(20) DEFAULT '1'
) ENGINE=INNODB DEFAULT CHARSET=latin1;

INSERT  INTO `emp`(`id`,`name`,`deg`,`salary`,`dept`) VALUES (1201,'gopal','manager',50000,'TP'),(1202,'manisha','Proof reader',50000,'TP'),(1203,'khalil','php dev',30000,'AC'),(1204,'prasanth','php dev',30000,'AC'),(1205,'kranthi','admin',20000,'TP');

DROP TABLE IF EXISTS `emp_add`;

CREATE TABLE `emp_add` (
  `id` INT(11) DEFAULT NULL,
  `hno` VARCHAR(100) DEFAULT NULL,
  `street` VARCHAR(100) DEFAULT NULL,
  `city` VARCHAR(100) DEFAULT NULL,
  `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `is_delete` BIGINT(20) DEFAULT '1'
) ENGINE=INNODB DEFAULT CHARSET=latin1;

INSERT  INTO `emp_add`(`id`,`hno`,`street`,`city`) VALUES (1201,'288A','vgiri','jublee'),(1202,'108I','aoc','sec-bad'),(1203,'144Z','pgutta','hyd'),(1204,'78B','old city','sec-bad'),(1205,'720X','hitec','sec-bad');

DROP TABLE IF EXISTS `emp_conn`;
CREATE TABLE `emp_conn` (
  `id` INT(100) DEFAULT NULL,
  `phno` VARCHAR(100) DEFAULT NULL,
  `email` VARCHAR(100) DEFAULT NULL,
  `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `is_delete` BIGINT(20) DEFAULT '1'
) ENGINE=INNODB DEFAULT CHARSET=latin1;

INSERT  INTO `emp_conn`(`id`,`phno`,`email`) VALUES (1201,'2356742','gopal@tp.com'),(1202,'1661663','manisha@tp.com'),(1203,'8887776','khalil@ac.com'),(1204,'9988774','prasanth@ac.com'),(1205,'1231231','kranthi@tp.com');

3. 导入数据库表数据到HDFS

  • 使用sqoop命令导入、导出数据前,要先启动hadoop集群
  • 下面的命令用于从MySQL数据库服务器中的emp表导入HDFS。
sqoop import --connect jdbc:mysql://hadoop02:3306/userdb --password 123456 --username root --table emp -m 1
  • 如果成功执行,那么会得到下面的输出。

  • 为了验证在HDFS导入的数据,请使用以下命令查看导入的数据

hdfs dfs -ls /user/hadoop/emp

  • 以上有参数--m 1,表示只启动一个map task进行数据的导入
  • 如果要开启多个map task的话,需要在命令中添加--split-by column-name,如下,其中map个数为4
sqoop import --connect jdbc:mysql://hadoop02:3306/userdb --password 123456 --username root --table emp -m 4 --split-by id

4. 导入到HDFS指定目录

  • 在导入表数据到HDFS使用Sqoop导入工具,我们可以指定目标目录。
  • 使用参数 --target-dir来指定导出目的地,
  • 使用参数--delete-target-dir来判断导出目录是否存在,如果存在就删掉
sqoop import --connect jdbc:mysql://hadoop02:3306/userdb --username root --password 123456 --delete-target-dir --table emp --target-dir /sqoop/emp -m 1
  • 查看导出的数据
hdfs dfs -text /sqoop/emp/part-m-00000

  • 它会用逗号(,)分隔emp_add表的数据和字段。
1201,gopal,manager,50000,TP
1202,manisha,Proof reader,50000,TP
1203,khalil,php dev,30000,AC
1204,prasanth,php dev,30000,AC
1205,kranthi,admin,20000,TP

5. 导入到hdfs指定目录并指定字段之间的分隔符

sqoop import --connect jdbc:mysql://hadoop02:3306/userdb --username root --password 123456 --delete-target-dir --table emp --target-dir /sqoop/emp2 -m 1 --fields-terminated-by '\t'
  • 查看文件内容
hdfs dfs -text /sqoop/emp2/part-m-00000

 

Sqoop的数据导出

 

将数据从HDFS把文件导出到RDBMS数据库

  • 导出前,目标表必须存在于目标数据库中。
  • 默认操作是从将文件中的数据使用INSERT语句插入到表中
  • 更新模式下,是生成UPDATE语句更新表数据
  • 数据是在HDFS当中的如下目录/sqoop/emp,数据内容如下
1201,gopal,manager,50000,TP,2018-06-17 18:54:32.0,2018-06-17 18:54:32.0,1
1202,manisha,Proof reader,50000,TP,2018-06-15 18:54:32.0,2018-06-17 20:26:08.0,1
1203,khalil,php dev,30000,AC,2018-06-17 18:54:32.0,2018-06-17 18:54:32.0,1
1204,prasanth,php dev,30000,AC,2018-06-17 18:54:32.0,2018-06-17 21:05:52.0,0
1205,kranthi,admin,20000,TP,2018-06-17 18:54:32.0,2018-06-17 18:54:32.0,1
第一步:创建mysql表
use userdb;

CREATE TABLE `emp_out` (
 `id` INT(11) DEFAULT NULL,
 `name` VARCHAR(100) DEFAULT NULL,
 `deg` VARCHAR(100) DEFAULT NULL,
 `salary` INT(11) DEFAULT NULL,
 `dept` VARCHAR(10) DEFAULT NULL,
 `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
 `update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
 `is_delete` BIGINT(20) DEFAULT '1' 
) ENGINE=INNODB DEFAULT CHARSET=utf8;
第二步:执行导出命令

通过kkb来实现数据的导出,将hdfs的数据导出到mysql当中去

sqoop export \
--connect jdbc:mysql://hadoop02:3306/userdb \
--username root --password 123456 \
--table emp_out \
--export-dir /sqoop/emp \
--input-fields-terminated-by ","
第三步:验证mysql表数据

   

标签:sqoop,--,TIMESTAMP,Sqoop,DEFAULT,emp,NULL,ETL
来源: https://www.cnblogs.com/hanease/p/16218389.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有