Hadoop系列 (九):Sqoop详细介绍 |
您所在的位置:网站首页 › hbase介绍 › Hadoop系列 (九):Sqoop详细介绍 |
文章目录
Hadoop系列文章Sqoop简介Sqoop架构Sqoop数据导入Sqoop数据导出
Sqoop安装部署版本介绍前提环境下载安装配置
Sqoop的使用构建测试数据将MySql数据导入HDFS全表导入部分数据导入where过滤query查询
从HDFS导出到MySql创建目标表执行导入脚本执行脚本查看执行结果
将数据导入Hive创建Hive表执行导入脚本查看结果
Hadoop系列文章
Hadoop系列 (一):在CentOS中搭建hadoop环境(伪分布式) Hadoop系列 (二):完全分布式搭建(腾讯云服务器+阿里云服务器) Hadoop系列 (三):HDFS详细介绍 Hadoop系列 (四):Yarn详细介绍 Hadoop系列 (五):MapReduce详细介绍 Hadoop系列 (六):Spark搭建 Hadoop系列 (七):ZooKeeper详细介绍 Hadoop系列 (八):Hbase搭建 Hadoop系列 (九):Sqoop详细介绍 Hadoop系列 (十):Flume详细介绍 Sqoop简介Sqoop全称是 Apache Sqoop,是一个开源工具,能够将数据从数据存储空间(数据仓库,系统文档存储空间,关系型数据库)导入 Hadoop 的 HDFS或列式数据库HBase,供 MapReduce 分析数据使用。 数据传输的过程大部分是通过 MapReduce 过程来实现,只需要依赖数据库的Schema信息。Sqoop所执行的操作是并行的,数据传输性能高,具备较好的容错性,并且能够自动转换数据类型。 Sqoop是一个为高效传输海量数据而设计的工具,一般用在从关系型数据库同步数据到非关系型数据库中。 Sqoop专门是为大数据集设计的。Sqoop支持增量更新,将新记录添加到最近一次的导出的数据源上,或者指定上次修改的时间戳。 Sqoop架构Sqoop架构主要有三部分组成:Sqoop客户端,数据存储与挖掘、数据存储空间。 其中数据存储与挖掘主要为HDFS、Hbase、Hive等工具。 从图中可以看出: Sqoop通过Hadoop中的Map任务将数据从数据存储空间中导入HDFS供数据分析使用Sqoopzhi负责数据传输,不负责数据分析,只涉及Map任务,不涉及Reduce任务。Sqoop本质是运行一个mapreduce程序,所以要运行sqoop,先启动Hadoop。 Sqoop数据导入sqoop数据导入大致流程如下: Sqoop数据导出过程:将通过MapReduce或Hive分析后得出的数据结果导出到关系型数据库,供其他业务查看或生成报表使用。 Sqoop export 是将一组文件从HDFS导出回RDBMS的工具。 前提条件是,在数据库中,目标表必须已经存在。 根据用户指定的分隔符将输入文件读取并解析为一组记录。 此过程与Sqoop数据导入类似,只是在导出数据之前,需要在RDBMS中建立目标表,Sqoop读取该表的元数据信息,为Map作业读取HDFS数据提供序列化及反序列化的功能,最后通过一批INSERT语句写入目标数据库中。 Sqoop安装部署 版本介绍官网地址:https://sqoop.apache.org/ sqoop和sqoop2,但是后sqoop2还不稳定,不稳定,所以不要用于生产,二者之间主要有以下异同: 两个不同的版本,完全不兼容版本号划分区别,Apache版本:1.4.x(Sqoop1); 1.99.x(Sqoop2) CDH版本 : Sqoop-1.4.3-cdh4(Sqoop1) ; Sqoop2-1.99.2-cdh4.5.0 (Sqoop2)。相对于Sqoop1来说,Sqoop2引入了Sqoop server,集中化管理connector等。Sqoop2提供了多种访问方式:CLI,Web UI,REST API。Sqoop引入了基于角色的安全机制。由于我之前的Hadoop一系列组件都是采用的Apache版本,下面会使用Apache Sqoop进行安装部署。 前提环境Hadoop 关系型数据库(MySQL/Oracle) HBase Hive ZooKeeper 下载使用Sqoop1最新版本: [hadoop@master software]$ wget https://archive.apache.org/dist/sqoop/1.4.7/sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz 安装配置将Sqoop解压到指定目录/opt/sqoop # 创建sqoop文件夹并修改权限 [hadoop@master software]$ cd /opt [hadoop@master opt]$ mkdir sqoop [hadoop@master opt]$ sudo mkdir sqoop [hadoop@master opt]$ sudo chown -R hadoop:hadoop sqoop #解压 [hadoop@master software]$ tar -zxvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz -C /opt/sqoop/ --strip-components 1安装在/opt文件夹是个人习惯,大家可以发现,我几乎所有程序都放在这个文件夹里,可以根据个人习惯进行调整。 linux各个文件夹大概可以理解为: /usr:系统级的目录,可以理解为C:/Windows/,/usr/lib理解为C:/Windows/System32。 /usr/local:用户级的程序目录,可以理解为C:/Progrem Files/。用户自己编译的软件默认会安装到这个目录下。 /opt:用户级的程序目录,可以理解为D:/Software,opt有可选的意思,这里可以用于放置第三方大型软件(或游戏),当你不需要时,直接rm -rf掉即可。在硬盘容量不够时,也可将/opt单独挂载到其他磁盘上使用。 /usr/src:系统级的源码目录。 /usr/local/src:用户级的源码目录。 安装到/opt目录下的程序,它所有的数据、库文件等等都是放在同个目录下面,很方便进行管理。 修改Sqoop环境变量 编辑文件.bash_profile,在文件末尾添加下面内容: #set Sqoop env export SQOOP_HOME=/opt/sqoop export PATH=$PATH:$SQOOP_HOME/bin使.bash_profile文件生效: [hadoop@master ~]$ source .bash_profile [hadoop@master ~]$ echo $SQOOP_HOME /opt/sqoop [hadoop@master ~]$ sqoop version Warning: /opt/sqoop/../hcatalog does not exist! HCatalog jobs will fail. Please set $HCAT_HOME to the root of your HCatalog installation. Warning: /opt/sqoop/../accumulo does not exist! Accumulo imports will fail. Please set $ACCUMULO_HOME to the root of your Accumulo installation. 2021-10-26 10:54:37,890 INFO sqoop.Sqoop: Running Sqoop version: 1.4.7 Sqoop 1.4.7 git commit id 2328971411f57f0cb683dfb79d19d4d19d185dd8 Compiled by maugli on Thu Dec 21 15:59:58 STD 2017 [hadoop@master ~]$修改Sqoop配置文 在/opt/sqoop/conf目录下 [hadoop@master ~]$ cd /opt/sqoop/conf [hadoop@master conf]$ cp sqoop-env-template.sh sqoop-env.sh [hadoop@master conf]$ vim sqoop-env.sh在sqoop-env.sh中添加以下内容: 修改/sqoop/bin/configure-sqoop文件 由于集群中没有配置hcatalog、accumlo因此应该在sqoop的配置文件中注释掉判断hcatalog、accumlo路径是否正确的代码: 关联Hive [hadoop@master conf]$ cp /opt/hive/conf/hive-site.xml ./ [hadoop@master conf]$ ll total 36 -rw-r--r-- 1 hadoop hadoop 3569 Oct 26 10:41 hive-site.xml -rw-rw-r-- 1 hadoop hadoop 3895 Dec 19 2017 oraoop-site-template.xml -rwxr-xr-x 1 hadoop hadoop 1395 Oct 26 10:39 sqoop-env.sh -rw-rw-r-- 1 hadoop hadoop 1404 Dec 19 2017 sqoop-env-template.cmd -rwxr-xr-x 1 hadoop hadoop 1345 Dec 19 2017 sqoop-env-template.sh -rw-rw-r-- 1 hadoop hadoop 6044 Dec 19 2017 sqoop-site-template.xml -rw-rw-r-- 1 hadoop hadoop 6044 Dec 19 2017 sqoop-site.xml添加Mysql驱动 [hadoop@master ~]$ cp /opt/hive/lib/mysql-connector-java-5.1.49.jar /opt/sqoop/lib/ [hadoop@master ~]$注意,不要使用最新版本的mysql-connector-java-8.xxx.jar,不然会有以下信息返回 Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.添加MysqlDump应用程序 数据传输需要用的mysqldump程序,这样可以加快数据传输。可以从mysql安装包中导入。 [hadoop@master bin]$ pwd /home/hadoop/software/mysql-8.0.26-linux-glibc2.12-x86_64/bin或者从安装mysql服务器的节点中导入。由于我用的是阿里云数据库服务器,而且之前单独部署过mysql服务器,所以直接从安装包中复制到/usr/bin目录中: [hadoop@master bin]$ sudo cp mysqldump /usr/bin同样复制到slave1等其他节点: [hadoop@master bin]$ scp mysqldump hadoop@slave1:/usr/bin/添加commons-lang-2.6.jar包 在/opt/sqoop/lib下有commons-lang3-3.4.jar的包,但是直接使用,在连接mysql时会报错: 测试 执行测试代码 [hadoop@master]$ sqoop list-databases --connect jdbc:mysql://rm-2zeva40k7q38a8iorao.mysql.rds.aliyuncs.com:3306/ --username hive --P在mysql中创建一张表,并插入数据 CREATE TABLE bg_data.students ( id tinyint(4) NOT NULL AUTO_INCREMENT, account varchar(255) DEFAULT NULL, passwd varchar(255) DEFAULT NULL, PRIMARY KEY (id) ); INSERT INTO students VALUES ('1', 'admin', 'admin') ,('2', 'ericray', '12345') ,('3', 'system', 'system'); 将MySql数据导入HDFS 全表导入创建hdfs存放文件目录 导入脚本: [hadoop@master]$ sqoop import \ --connect jdbc:mysql://rm-2zeva40k7q38a8iorao.mysql.rds.aliyuncs.com:3306/bg_data \ --username hive \ --password xxxx \ --table students \ --num-mappers 1 \ --target-dir /user/hadoop/sqoop/import/imp_students \ --delete-target-dir \ --direct \ --fields-terminated-by "\t"参数解释: --delete-target-dir :目标目录存在就删除 --target-dir:指定输出目录,不指定就直接在主目录下生产。 --num-mappers 1:设置map的个数 --direct:manager.DirectMySQLManager: Beginning mysqldump fast path import.使用这个命令会很快,本机装有mysql时,才可以使用。 --fields-terminated-by "\t":设置输出文件分分割方式 --as-parquetfile :设置文件格式为parquetfile --split-by id :通常配合-m 参数使用。用于指定根据哪个字段进行划分并启动多少个maptask。 --columns :指定表中部分字段进行导入 --query:直接查询 --where :条件查询关于split-by split-by 根据不同的参数类型有不同的切分方法: split-by 根据不同的参数类型有不同的切分方法,如 int 型,Sqoop会取最大和最小split-by字段值,然后根据传入的num-mappers来 确定划分几个区域。比如 select max(split_by),min(split-by) from 得到的 max(split-by)和min(split-by) 分别为1000和1,而num-mappers(-m)为2的话,则会分成两个区域 (1,500)和(501-1000),同时也会分成2个sql给2个map去进行导入操作,最后每个map各自获取各自SQL中的数据进行导入工作.split-by即便是int型,若不是连续有规律递增的话,各个map分配的数据是不均衡的,可能会有些map很忙,有些map几乎没有数据处理的情况,就容易出现数据倾斜,所以一般split by的值为自增主键id。执行过程: 查看导入的数据 [hadoop@master ~]$ hdfs dfs -ls /user/hadoop/sqoop/import/imp_students看这个数据,是不是很奇怪,改成指定字段试试: sqoop import \ --connect jdbc:mysql://rm-2zeva40k7q38a8iorao.mysql.rds.aliyuncs.com:3306/bg_data \ --username hive \ --password xxxx \ --table students \ --columns 'id,account,passwd' \ --num-mappers 1 \ --target-dir /user/hadoop/sqoop/import/imp_students \ --delete-target-dir \ --direct \ --fields-terminated-by "\t"查看结果,由于不停测试,个人服务器性能太差,所以减少了数据量。 数据看起来是对的。 至于为什么会这样,目前没有找到答案,如果你知道原因,请在下方评论区留言。谢谢! 部分数据导入很多时候,我们需要对数据进行过滤处理,导入的是原始数据的一个子数据集,这里提供2种方式。 where过滤脚本如下: [hadoop@master ~]$ sqoop import \ --connect jdbc:mysql://rm-2zeva40k7q38a8iorao.mysql.rds.aliyuncs.com:3306/bg_data \ --username hive \ --password xxxx \ --table students \ --columns 'id,account,passwd' \ --where "account = 'ericray'" \ --num-mappers 1 \ --target-dir /user/hadoop/sqoop/import/imp_students_1 \ --delete-target-dir \ --direct \ --fields-terminated-by "\t"查看结果 需要注意:使用query sql语句来进行查找不能加参数--table ;并且必须要添加where条件;where条件后面必须带一个$CONDITIONS这个字符串;且这个sql语句必须用单引号,不能用双引号。 查询脚本如下: [hadoop@master ~]$ sqoop import \ --connect jdbc:mysql://rm-2zeva40k7q38a8iorao.mysql.rds.aliyuncs.com:3306/bg_data \ --username hive \ --password xxxx \ --query 'select id,account,passwd from students where id < 3 and $CONDITIONS' \ --num-mappers 1 \ --target-dir /user/hadoop/sqoop/import/imp_students_2 \ --delete-target-dir \ --direct \ --fields-terminated-by "\t"查看结果 在mysql中创建目标表: create table bg_data.my_stu like bg_data.students 执行导入脚本脚本如下: sqoop export \ --connect jdbc:mysql://rm-2zeva40k7q38a8iorao.mysql.rds.aliyuncs.com:3306/bg_data \ --username hive \ --password Ppnn2021 \ --table my_stu \ --columns 'id,account,passwd' \ --export-dir /user/hadoop/sqoop/import/imp_students_3 \ --fields-terminated-by "\t" \ --num-mappers 1 执行脚本导入数据到hive中的工作机制,是通过mapreduce把关系型数据库的数据导入到hdfs中去,然后创建hive表,然后通过load data加载数据到hive表中。 创建Hive表启动hive 在hive中创建表h_students,脚本如下: drop table if exists myhive.h_students ; create table myhive.h_students( id int, account string, password string ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' ;也可以通过--create-hive-table参数自动创建表 执行上面脚本 脚本如下: [hadoop@master ~]$ sqoop import \ --connect jdbc:mysql://rm-2zeva40k7q38a8iorao.mysql.rds.aliyuncs.com:3306/bg_data \ --username hive \ --password xxxx \ --table students \ --columns 'id,account,passwd' \ --num-mappers 1 \ --target-dir /user/hadoop/sqoop/import/imp_students_4 \ --delete-target-dir \ --direct \ --fields-terminated-by "\t" \ --hive-database myhive \ --hive-import \ --hive-table h_students执行上面脚本 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |