首页 > 其他分享 >ETL数据采集之Sqoop的安装部署及操作

ETL数据采集之Sqoop的安装部署及操作

时间:2024-11-26 20:56:46浏览次数:7  
标签:sqoop java -- Sqoop hive 采集 apache org ETL

ETL数据采集

数据采集也叫数据集成 ,我们常说的爬虫也是数据采集的一种方式 。

常用的数据采集工具分为两大类:离线数据采集(批量数据采集),实时数据采集(增量数据采集),这次我们分别来学习一下这俩种采集方式的常用工具

离线数据采集

常用工具有Sqoop、DataX、Kettle

一、Sqoop介绍与特点以及使用场景

Apache开源软件,主要用于在HADOOP(Hive)与传统的数据库(mysql、postgresql...)间进行数据的传递。

  • 数据吞吐量大:依赖hadoop集群可进行大批量数据集成。

  • 操作有技术要求:sqoop操作没有可视化设计器,对使用人员有较专业的技术要求。

  • 多种交互方式:命令行,web UI,rest API。

  • 部署不方便:sqoop依赖大数据集群,使用sqoop要求数据传输的的源要与大数据集群的所有节点能进行通信。

适用场景:适用于能与大数据集群直接通信的关系数据库间的大批量数据传输。

二、Sqoop的安装部署

1、下载压缩包,这个大家可以去官网下载Sqoop -

我这里下载的是 sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz

image-20241126194546018

2、上传文件并解压

tar -zxvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz -C <你的目标目录>

3、修改配置文件

# 切换到sqoop配置文件目录
cd /usr/local/soft/sqoop-1.4.7/conf
# 复制配置文件并重命名
cp sqoop-env-template.sh sqoop-env.sh
# vim sqoop-env.sh 编辑配置文件,并加入以下内容
export HADOOP_COMMON_HOME=/usr/local/soft/hadoop-3.1.2
export HADOOP_MAPRED_HOME=/usr/local/soft/hadoop3.1.2/share/hadoop/mapreduce
export HIVE_HOME=/usr/local/soft/hive-3.1.2
export HBASE_HOME=/usr/local/soft/hbase-2.2.7
export ZOOCFGDIR=/usr/local/soft/zookeeper-3.5.7/conf

# 切换到bin目录
cd /usr/local/soft/sqoop-1.4.7/bin
# vim configure-sqoop 修改配置文件,注释掉没用的内容(就是为了去掉警告信息)

image-20241126201620397

4、修改环境变量

vim /etc/profile

export SQOOP_HOME=/usr/local/soft/sqoop-1.4.7
export PATH=$SQOOP_HOME/bin:$PATH

5、添加MySQL连接驱动

cp /usr/local/soft/hive-3.1.2/lib/mysql-connector-java-8.0.29.jar /usr/local/soft/sqoop-1.4.7/lib/

6、测试

# 打印sqoop版本
sqoop version

image-20241126203148181

# 测试MySQL连通性
sqoop list-databases --connect jdbc:mysql://master:3306 --username root --password 123456

image-20241126203557314

到这里就安装完成了,接下来是一些操作

三、准备MySQL数据

1、登录MySQL数据库

mysql -u root -p123456;

2、创建student数据库

create database student;

3、切换数据库并导入数据

# mysql shell中执行
use student;
source /usr/local/soft/shell/student.sql;

另外一种导入数据的方式

# linux shell中执行
mysql -u root -p123456 student</usr/local/soft/shell/student.sql
mysql -u root -p123456 student</root/score.sql

使用Navicat运行SQL文件

也可以通过Navicat导入

导出MySQL数据库

mysqldump -u root -p123456 数据库名>任意一个文件名.sql

import

从传统的关系型数据库导入HDFS、HIVE、HBASE......

MySQLToHDFS

编写脚本,保存为MySQLToHDFS.conf
import
--connect 
jdbc:mysql://master:3306/student?useSSL=false
--username
root
--password
123456
--table
student
--m
2
--split-by
age
--target-dir
/sqoop/data/student1
--fields-terminated-by
','
执行脚本
sqoop --options-file MySQLToHDFS.conf
注意事项:

1、--m 表示指定生成多少个Map任务,不是越多越好,因为MySQL Server的承载能力有限

2、当指定的Map任务数>1,那么需要结合--split-by参数,指定分割键,以确定每个map任务到底读取哪一部分数据,最好指定数值型的列,最好指定主键(或者分布均匀的列=>避免每个map任务处理的数据量差别过大)

3、如果指定的分割键数据分布不均,可能导致数据倾斜问题

4、分割的键最好指定数值型的,而且字段的类型为int、bigint这样的数值型

5、编写脚本的时候,注意:例如:--username参数,参数值不能和参数名同一行

--username root  // 错误的

// 应该分成两行
--username
root

6、运行的时候会报错InterruptedException,hadoop2.7.6自带的问题,忽略即可

21/01/25 14:32:32 WARN hdfs.DFSClient: Caught exception 
java.lang.InterruptedException
	at java.lang.Object.wait(Native Method)
	at java.lang.Thread.join(Thread.java:1252)
	at java.lang.Thread.join(Thread.java:1326)
	at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.closeResponder(DFSOutputStream.java:716)
	at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.endBlock(DFSOutputStream.java:476)
	at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.run(DFSOutputStream.java:652)

7、实际上sqoop在读取mysql数据的时候,用的是JDBC的方式,所以当数据量大的时候,效率不是很高

8、sqoop底层通过MapReduce完成数据导入导出,只需要Map任务,不需要Reduce任务

9、每个Map任务会生成一个文件

MySQLToHive

先会将MySQL的数据导出来并在HDFS上找个目录临时存放,默认为:/user/用户名/表名

然后再将数据加载到Hive中,加载完成后,会将临时存放的目录删除

编写脚本,并保存为MySQLToHIVE.conf文件
import 
--connect
jdbc:mysql://master:3306/student?useSSL=false
--username
root
--password
123456
--table
score
--fields-terminated-by
"\t"
--lines-terminated-by 
"\n"
--m
3
--split-by
student_id
--hive-import
--hive-overwrite
--create-hive-table
--hive-database
bigdata
--hive-table
score_sqoop
--delete-target-dir 
在Hive中创建testsqoop库
hive> create database testsqoop;

如果重新导入表存在,那么就需要将--create-hive-table 选项去除

如果遇到如下错误

22/04/18 09:08:42 ERROR tool.ImportTool: Import failed: java.io.IOException: java.la                                       ng.ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf
        at org.apache.sqoop.hive.HiveConfig.getHiveConf(HiveConfig.java:50)
        at org.apache.sqoop.hive.HiveImport.getHiveArgs(HiveImport.java:392)
        at org.apache.sqoop.hive.HiveImport.executeExternalHiveScript(HiveImport.jav                                       a:379)
        at org.apache.sqoop.hive.HiveImport.executeScript(HiveImport.java:337)
        at org.apache.sqoop.hive.HiveImport.importTable(HiveImport.java:241)
        at org.apache.sqoop.tool.ImportTool.importTable(ImportTool.java:537)
        at org.apache.sqoop.tool.ImportTool.run(ImportTool.java:628)
        at org.apache.sqoop.Sqoop.run(Sqoop.java:147)
        at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
        at org.apache.sqoop.Sqoop.runSqoop(Sqoop.java:183)
        at org.apache.sqoop.Sqoop.runTool(Sqoop.java:234)
        at org.apache.sqoop.Sqoop.runTool(Sqoop.java:243)
        at org.apache.sqoop.Sqoop.main(Sqoop.java:252)
Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf
        at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:264)
        at org.apache.sqoop.hive.HiveConfig.getHiveConf(HiveConfig.java:44)
        ... 12 more

解决办法:

cp /usr/local/soft/hive-1.2.1/lib/hive-common-1.2.1.jar  /usr/local/soft/sqoop-1.4.7/lib/
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/hive/shims/ShimLoader
        at org.apache.hadoop.hive.conf.HiveConf$ConfVars.<clinit>(HiveConf.java:368)
        at org.apache.hadoop.hive.conf.HiveConf.<clinit>(HiveConf.java:105)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:264)
        at org.apache.sqoop.hive.HiveConfig.getHiveConf(HiveConfig.java:44)
        at org.apache.sqoop.hive.HiveImport.getHiveArgs(HiveImport.java:392)
        at org.apache.sqoop.hive.HiveImport.executeExternalHiveScript(HiveImport.java:379)
        at org.apache.sqoop.hive.HiveImport.executeScript(HiveImport.java:337)
        at org.apache.sqoop.hive.HiveImport.importTable(HiveImport.java:241)
        at org.apache.sqoop.tool.ImportTool.importTable(ImportTool.java:537)
        at org.apache.sqoop.tool.ImportTool.run(ImportTool.java:628)
        at org.apache.sqoop.Sqoop.run(Sqoop.java:147)
        at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
        at org.apache.sqoop.Sqoop.runSqoop(Sqoop.java:183)
        at org.apache.sqoop.Sqoop.runTool(Sqoop.java:234)
        at org.apache.sqoop.Sqoop.runTool(Sqoop.java:243)
        at org.apache.sqoop.Sqoop.main(Sqoop.java:252)
Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.hive.shims.ShimLoader
        at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        ... 17 more

cp /usr/local/soft/hive-1.2.1/lib/hive-shims* /usr/local/soft/sqoop-1.4.7/lib/
执行脚本
sqoop --options-file MySQLToHIVE.conf
--direct

加上这个参数,可以在导出MySQL数据的时候,使用MySQL提供的导出工具mysqldump,加快导出速度,提高效率

错误信息

22/04/18 09:42:33 INFO mapreduce.Job: Task Id : attempt_1650084984186_0048_m_000002_2, Status : FAILED
Error: java.io.IOException: Cannot run program "mysqldump": error=2, 没有那个文件或目录
        at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
        at java.lang.Runtime.exec(Runtime.java:620)
        at java.lang.Runtime.exec(Runtime.java:485)
        at org.apache.sqoop.mapreduce.MySQLDumpMapper.map(MySQLDumpMapper.java:405)
        at org.apache.sqoop.mapreduce.MySQLDumpMapper.map(MySQLDumpMapper.java:49)
        at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:146)
        at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:787)
        at org.apache.hadoop.mapred.MapTask.run(MapTask.java:341)
        at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:164)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Subject.java:422)
        at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1758)
        at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158)
Caused by: java.io.IOException: error=2, 没有那个文件或目录
        at java.lang.UNIXProcess.forkAndExec(Native Method)
        at java.lang.UNIXProcess.<init>(UNIXProcess.java:247)
        at java.lang.ProcessImpl.start(ProcessImpl.java:134)
        at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
        ... 12 more

解决办法:

需要将master上的/usr/bin/mysqldump分发至 node1、node2的/usr/bin目录下

scp /usr/bin/mysqldump node1:/usr/bin/
scp /usr/bin/mysqldump node2:/usr/bin/
-e参数的使用
import 
--connect 
jdbc:mysql://master:3306/student?useSSL=false
--username 
root 
--password 
123456 
--m 
2 
--split-by 
student_id 
--e 
"select * from score where student_id=1500100011 and $CONDITIONS" 
--fields-terminated-by 
"\t" 
--lines-terminated-by 
"\n" 
--target-dir 
/testQ 
--hive-import 
--hive-overwrite 
--create-hive-table 
--hive-database 
testsqoop 
--hive-table 
score2

分析导入日志:

22/04/18 10:24:34 INFO manager.MySQLManager: Preparing to use a MySQL streaming resultset.
22/04/18 10:24:34 INFO tool.CodeGenTool: Beginning code generation
Mon Apr 18 10:24:34 CST 2022 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
22/04/18 10:24:34 INFO manager.SqlManager: Executing SQL statement: select * from score where student_id=1500100011 and  (1 = 0)
22/04/18 10:24:34 INFO manager.SqlManager: Executing SQL statement: select * from score where student_id=1500100011 and  (1 = 0)
22/04/18 10:24:34 INFO manager.SqlManager: Executing SQL statement: select * from score where student_id=1500100011 and  (1 = 0)
22/04/18 10:24:34 INFO orm.CompilationManager: HADOOP_MAPRED_HOME is /usr/local/soft/hadoop-2.7.6

解释:

​ 其中的三条SQL语句是为了检查SQL语句是否正确

BoundingValsQuery: SELECT MIN(student_id), MAX(student_id) FROM (select * from score where student_id=1500100011 and  (1 = 1) ) AS t1

MySQLToHBase

编写脚本,并保存为MySQLToHBase.conf
import 
--connect 
jdbc:mysql://master:3306/student?useSSL=false
--username 
root 
--password 
123456
--table 
student
--hbase-table 
stu 
--hbase-create-table 
--hbase-row-key 
id 
--m 
1
--column-family 
cf1
在HBase中创建student表
create 'stu','cf1'
执行脚本
sqoop --options-file MySQLToHBase.conf

export

HDFSToMySQL

编写脚本,并保存为HDFSToMySQL.conf
export
--connect
jdbc:mysql://master:3306/student?useSSL=false&useUnicode=true&characterEncoding=utf-8
--username
root
--password
123456
--table
student2
-m
1
--columns
id,name,age,gender,clazz
--export-dir
/sqoop/data/student1
--fields-terminated-by 
','
先清空MySQL student表中的数据,不然会造成主键冲突
执行脚本
sqoop --options-file HDFSToMySQL.conf

查看sqoop help

sqoop help

21/04/26 15:50:36 INFO sqoop.Sqoop: Running Sqoop version: 1.4.6
usage: sqoop COMMAND [ARGS]

Available commands:
  codegen            Generate code to interact with database records
  create-hive-table  Import a table definition into Hive
  eval               Evaluate a SQL statement and display the results
  export             Export an HDFS directory to a database table
  help               List available commands
  import             Import a table from a database to HDFS
  import-all-tables  Import tables from a database to HDFS
  import-mainframe   Import datasets from a mainframe server to HDFS
  job                Work with saved jobs
  list-databases     List available databases on a server
  list-tables        List available tables in a database
  merge              Merge results of incremental imports
  metastore          Run a standalone Sqoop metastore
  version            Display version information

See 'sqoop help COMMAND' for information on a specific command.
# 查看import的详细帮助
sqoop import --help

分区导入

-- 创建分区表
CREATE TABLE `partition_student`(
   `id` int, 
   `name` string, 
   `age` int, 
   `gender` string, 
   `clazz` string, 
   `last_mod` string)
 COMMENT 'Imported by sqoop on 2023/10/20 14:52:43'
 partitioned by(dt string)
 ROW FORMAT SERDE 
   'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' 
 WITH SERDEPROPERTIES ( 
   'field.delim'='\t', 
   'line.delim'='\n', 
   'serialization.format'='\t');
import 
--connect 
jdbc:mysql://master:3306/student?useSSL=false
--username 
root 
--password 
123456 
--m 
2 
--split-by 
id 
--e 
"SELECT * FROM student2 WHERE substr(last_mod,1,11) = '2023-10-21' and $CONDITIONS"
--fields-terminated-by 
"\t" 
--lines-terminated-by 
"\n" 
--target-dir 
/testQ 
--hive-import 
--hive-database 
testsqoop 
--hive-table 
partition_student
--hive-partition-key
dt
--hive-partition-value
2023-10-21
sqoop --options-file insert_10_21_partition_mysql2hive.conf

增量导入

#  模拟做全量数据导入:
sqoop import \
--connect 'jdbc:mysql://master:3306/student?useSSL=false' \
--username root \
--password 123456 \
--e "select * from student2 where id <= 1500100990 and \$CONDITIONS" \
--target-dir /sqoop/incremental/student \
--m 2 \
--split-by id \
--fields-terminated-by ',' \

#  增量导入
sqoop import \
--connect 'jdbc:mysql://master:3306/student?useSSL=false' \
--username root \
--password 123456 \
--table student2 \
--target-dir /sqoop/incremental/student \
--m 2 \
--split-by id \
--fields-terminated-by ',' \
--incremental append \
--check-column id \
--last-value 1500100990

**注意:对于sqoop可以直接使用命令模式加上参数,同时参数和参数值在同一行 末尾使用 \ 表示当前行的命令未结束,下一行继续编辑 同时 --e 参数中的 $ 需要使用反斜杠将其取消转义 **

# 模拟做全量数据导入:
sqoop import \
--connect 'jdbc:mysql://master:3306/student?useSSL=false' \
--username root \
--password 123456 \
--e "select * from student2 where last_mod <= '2023-10-20 14:34:12' and \$CONDITIONS" \
--target-dir /sqoop/incremental/student2 \
--m 2 \
--split-by id \
--fields-terminated-by ',' 

# 针对时间字段进行做增量合并操作
sqoop import \
--connect 'jdbc:mysql://master:3306/student?useSSL=false' \
--username root \
--driver com.mysql.jdbc.Driver \
--password 123456 \
--table student2 \
--target-dir /sqoop/incremental/student2 \
--split-by id \
--m 2 \
--fields-terminated-by ',' \
--incremental lastmodified \
--check-column last_mod \
--last-value "2023-10-20 14:34:20" \
--merge-key \
id

**merge-key是针对某个ID进行合并 将时间戳最大的进行保存 --last-value 指定上一次最大时间 在做查询时日志中 SQL查询语句为where last_mode >= '2023-10-20 14:34:20' **

标签:sqoop,java,--,Sqoop,hive,采集,apache,org,ETL
From: https://www.cnblogs.com/qianzhiqiang798/p/18570956

相关文章

  • GaussDB数据库SQL系列-SQL与ETL浅谈
    一、前言在SQL语言中,ETL(抽取、转换和加载)是一种用于将数据从源系统抽取到目标系统的过程。ETL过程通常包括三个阶段:抽取(Extract)、转换(Transform)和加载(Load)。但这些其实都脱离不了数据库系统,本节从GaussDB数据库生态出发,给大家简单讲一下SQL与ETL的过程与关系。二、SQL与ETL的......
  • 解决dedecms火车头采集到缩略图无法发布到网站的问题
    修改发布参数 picname 的值为采集到的标签发布模块参数说明:必选参数title:标题body:内容typeid:主栏目IDusername:用户名pw:验证密码可选参数ishtml=1:是否生成HTMLremote=1:是否下载远程图片和资源dellink=0:是否删除非站内链接shorttitle:简略标题description:内容摘......
  • 基于SpringBoot的学生行为与学习成绩分析系统设计与实现(源码+开发+讲解)学生行为与学习
    博主介绍:  ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W+粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台的优质作者。通过长期分享和实战指导,我致力于帮助更多学生......
  • 2024最火的资源牛知识付费系统小程序+PC+H5三端数据互通支持采集资源开源版
    下载:https://pan.baidu.com/s/19oircaQvJeE_nsX_jtjsBw?pwd=8888 .搭建:服务器配置1h2g以上均可使用运行环境php7.2sql5.6把防跨站点开1、在宝塔新建个站点,php版本使用7.2,将“后端”文件夹里的文件上传到站点根目录,运行目录设置为/public,安装好SSL证书,......
  • python实战项目47:Selenium采集百度股市通数据
    python实战项目47:Selenium采集百度股市通数据一、思路分析二、完整代码一、思路分析这里以获取百度股市通股评下的投票数据为例,页面中的其他数据同理。由于此页面数据是js动态加载的,所以采用Selenium获取数据。思路很简单,通过Selenium打开页面,然后定位到“股评”......
  • 设计资料:4通道1G PCIE3.0X8采集平台
    PCIe高速数字化仪平台1GS/s14bit4通道     DC耦合    PCIExpressGen3x8具备直流耦合和双极性宽带信号输入的高速数据采集卡,它具有4通道,14bit,1GS/s采样率特性。板载FPGA具备实时信号处理能力,可实现累加平均、峰值检测、数字滤波、快速傅立叶变换等信号......
  • PCIe宽带中频采集回放平台3GS/s 采集14bit 2通道 12.6GS/s回放 16bit 2通道
    PCIe宽带中频采集回放平台3GS/s采集14bit2通道12.6GS/s回放16bit2通道,是一款具备交流耦合和双极性宽带信号输入的高速数据采集卡,它具有2通道,14bit,3GS/s采集和2通道,16bit,12.6GS/s回放特性。板载FPGA具备实时信号处理能力,可实现数字下变频DDC、数字滤波、快速傅立叶变换等......
  • 新书图阁ptcms小说源码(附带最新4个可用采集规则)
    源码简介新书图阁小说源码ptcms(附带最新4个可用ptcms采集规则),自己花了点时间研究了下采集,写了4个可直接使用的采集规则,推荐采集时配合socks5代理一起使用。全新开发,新版UI,添加原创专区,新闻发布,书单发布,采集日志,百度推送,神马推送,推送日志功能。前端高仿起点小说网,自适应模......
  • 基于FPGA控制的AD采集,ads8688芯片8通道扫描
     1. ads8688芯片简介        芯片详细介绍可仔细查看数据手册,链接:    由于数据手册内容太多,在次不做过多介绍,此处将只对实现8通道的扫描采集所涉及到的知识点做解释说明,大概需掌握如下3点。1.1 程序寄存器配置    程序寄存器映射图如下所示。......
  • 数据采集实验一
    题目一(1)要求:用requests和BeautifulSoup库方法定向爬取给定网址(http://www.shanghairanking.cn/rankings/bcur/2020)的数据,屏幕打印爬取的大学排名信息。pytho......