文章较长,附目录,此次安装是在VM虚拟环境下进行。文章第一节主要是介绍Hive,只需安装配置的朋友可以直接跳到文章第二节。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错,请留下你宝贵的点赞,谢谢。
注:本次案例是在基于Hadoop配置完成以及其他组件安装成功的情况下搭建的,需要的朋友可以查看我的这刊专栏学习:
大数据技术之Hadoop全生态组件学习与搭建http://t.csdnimg.cn/OkPpo虽然目前sqoop已经在Apache退役,但目前仍有许多公司将它作为数据迁移工具使用,所以还是有学习的必要的,是十分不错的学习练手选择。
目录
一、了解Sqoop
1.什么是sqoop
Sqoop是一个用于在Apache Hadoop和结构化数据存储(如关系数据库)之间高效传输批量数据的工具。它可以将关系型数据库(如MySQL、Oracle)中的数据导入到Hadoop中,也可以将Hadoop中的数据导出到关系型数据库中。Sqoop充分利用MapReduce并行特点以批处理的方式加快数据传输,实现高效、可控的资源利用。此外,Sqoop支持多种数据库,数据类型映射与转换可自动进行,用户也可自定义。
Sqoop的主要角色包括数据库管理员、Hadoop管理员、Sqoop管理员、开发人员和运维人员。数据库管理员负责管理关系型数据库,提供数据库的连接信息和访问权限;Hadoop管理员负责管理Hadoop集群,提供Hadoop的连接信息和访问权限;Sqoop管理员负责配置和管理Sqoop工具,包括Sqoop的安装、配置以及导入导出任务的管理;开发人员负责编写Sqoop的导入导出任务,包括数据源的选择、数据转换和数据的输出方式;运维人员负责监控Sqoop的运行状态,包括任务的执行情况、数据传输速率等。
总之,Sqoop是一个强大的数据迁移工具,能够帮助用户在不同类型的数据存储系统之间实现高效、可靠的数据传输。
2.sqoop的历史
Sqoop是一款开源工具,其历史可以追溯到Apache项目的一部分。该项目起始于2009年,最初作为Hadoop的一个第三方模块存在。Sqoop的命名来源于SQL到Hadoop的缩写,即SQL--Hadoop => Sq + oop = Sqoop。它的主要目的是在Hadoop和关系数据库或大型机之间传输数据,使得数据能够在两种不同的存储系统之间高效、可靠地迁移。
在Sqoop的发展历程中,为了实现更快速的部署和迭代开发,它在2012年3月被孵化出来,并在2013年独立成为Apache的一个顶级开源项目。至今,Sqoop主要分为Sqoop1和Sqoop2两个版本,它们各自有不同的开发定位和体系结构,因此互不兼容。
Sqoop的工作原理基于MapReduce的并行处理方式,显著提高了数据传输的效率。它首先需要建立起Hadoop和关系型数据库之间的连接,这通常需要用户提供相关的数据库连接信息。然后,Sqoop利用这些连接信息进行数据的读取或写入操作,包括数据的序列化和反序列化,以及数据的切分和合并。
随着技术的发展和社区的需求变化,Sqoop虽然曾经是一个流行的数据迁移工具,但现在它已经退役,但作为学习来说,是十分不错的练手选择。
总的来说,Sqoop的历史是一个开源项目从诞生到发展,再到最终退役的过程,它见证了数据迁移工具在技术发展和用户需求变化中的演变。
3.sqoop的特点
- 跨平台数据传输:Sqoop能够将关系型数据库中的数据导入到Hadoop组件中,如HDFS、Hive或HBase,同时也能将Hadoop中的数据导出到关系型数据库中。这种跨平台的数据传输能力使得Sqoop在处理大规模数据时具有极高的灵活性。
- 高效并行处理:Sqoop在导入导出数据时,充分利用了MapReduce计算框架。它根据输入条件生成一个MapReduce作业,在Hadoop集群中运行。这种并行处理方式使得Sqoop在多个节点上同时进行import或export操作,显著提高了数据传输的速度,并提供了良好的并发性和容错性。
- 灵活的数据处理模式:Sqoop支持insert和update模式,用户可以根据需要选择参数。如果目标位置的内容已经存在,Sqoop可以选择更新该内容;如果不存在,则可以选择插入新内容。这种灵活性使得Sqoop能够适应各种复杂的数据处理需求。
- 对主流关系型数据库的良好支持:Sqoop对国外的主流关系型数据库支持性更好,这使得它能够在多种数据库环境中无缝工作,无需进行复杂的配置或调整。
4.sqoop的架构
sqoop的架构
Sqoop的架构主要由三个核心部分组成:Sqoop client、Hadoop组件(如HDFS、HBase和Hive)以及关系型数据库。
Sqoop client是用户与Sqoop交互的主要界面,用户可以通过Sqoop client来指定源数据库(如MySQL、Oracle等)的连接信息、目标Hadoop集群的连接信息以及数据传输的各种选项。用户利用Sqoop client来配置导入或导出任务,包括指定源数据库表的名称、目标Hadoop文件系统的目录等。
Hadoop组件则是Sqoop进行数据传输的目标或源。Sqoop可以将数据从关系型数据库导入到HDFS、HBase或Hive等Hadoop组件中,也可以将Hadoop中的数据导出到关系型数据库中。
关系型数据库是Sqoop进行数据迁移的起点或终点,它存储着需要被导入到Hadoop中的数据,或者接收从Hadoop中导出的数据。
Sqoop通过利用MapReduce的并行特点,可以高效地进行数据传输。在导入数据时,Sqoop会根据用户的配置生成一个MapReduce作业,该作业负责从源数据库中读取数据,并根据需要拆分成多个数据切片进行并行处理。在导出数据时,Sqoop同样利用MapReduce来从Hadoop中读取数据并导出到关系型数据库中。
5.sqoop的工作原理
sqoop的工作原理
-
建立连接:Sqoop首先与源数据库(如MySQL、Oracle等)和目标Hadoop集群建立连接。这一过程中,用户需要提供数据库的连接信息,如主机地址、端口号、用户名和密码等。Sqoop通过这些连接信息来访问数据库中的数据,并将数据读取到Hadoop集群中,或者从Hadoop集群中读取数据并写入到数据库中。
-
数据迁移配置:用户通过Sqoop的命令行工具或图形界面,指定数据迁移的配置信息。这包括源数据库表的名称、目标Hadoop文件系统的目录、数据转换规则、并行度设置等。Sqoop根据这些配置信息来生成相应的MapReduce作业。
-
MapReduce作业生成与执行:Sqoop根据用户的配置信息,生成一个或多个MapReduce作业。这些作业负责从源数据库中读取数据,进行必要的转换和处理,然后将数据写入到目标Hadoop集群中。由于MapReduce具有并行处理的能力,Sqoop可以充分利用Hadoop集群的资源,实现数据的并行传输,从而显著提高数据迁移的速度和效率。
-
数据拆分与合并:在数据迁移过程中,Sqoop可能会根据需要对数据进行拆分和合并。拆分是为了更好地利用并行处理能力,将大数据量拆分成多个小数据块,每个数据块由一个MapReduce任务进行处理。合并则是在数据处理完成后,将多个小数据块合并成最终的输出文件。
-
错误处理与日志记录:Sqoop在数据迁移过程中会进行错误处理和日志记录。如果发生错误或异常情况,Sqoop会记录相关信息,并根据用户的配置进行相应的处理,如重试、跳过或停止任务。同时,Sqoop还会记录数据迁移过程中的详细日志信息,供用户查看和分析。
二、下载安装包
Sqoop下载地址https://github.com/apache/sqoop
三、Sqoop配置
我使用的主机、从机名称分别为BigData01,BigData02,BigData03,Hadoop配置版本与上篇文章一致,解压到opt下,如有主机、从机名称,ip,版本,路径与我不一致的,更改成自己的即可。
tar -zxvf /root/Downloads/sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz -C/opt/
mv /opt/sqoop-1.4.7.bin__hadoop-2.6.0/ /opt/sqoop
vim /etc/profile
export SQOOP_HOME=/opt/sqoop
export PATH=$PATH:$SQOOP_HOME/bin
source /etc/profile
scp /opt/hive/lib/mysql-connector-java-5.1.46-bin.jar /opt/sqoop/lib/
cp sqoop-env-template.sh sqoop-env.sh
vim sqoop-env.sh
#Set path to where bin/hadoop is available
export HADOOP_COMMON_HOME=/opt/hadoopHA
#Set path to where hadoop-*-core.jar is available
export HADOOP_MAPRED_HOME=/opt/hadoopHA
#set the path to where bin/hbase is available
export HBASE_HOME=/opt/hbase-1.2.6
#Set the path to where bin/hive is available
export HIVE_HOME=/opt/hive
#Set the path for where zookeper config dir is
export ZOOCFGDIR=/opt/zookeeper
sqoop list-databases --connect jdbc:mysql://localhost:3306/ --username root -P
配置即可
拓展-sqoop使用方法
Sqoop命令
$ sqoop help
$ sqoop help import
$ sqoop help export
数据导入/导出
1、数据从MySQL导入到HDFS
例如:StudentDB.Student表数据导入到HDFS。(默认导入到集群中的/user/hadoop/Student/part-m-00000等系列文件)
sqoop import --connect jdbc:mysql://localhost:3306/StudentDB --username root --password 'password' --table Student
sqoop import -Dorg.apache.sqoop.splitter.allow_text_splitter=true --connect jdbc:mysql://localhost:3306/StudentDB --username root --password 'password' --table Student
sqoop import -Dorg.apache.sqoop.splitter.allow_text_splitter=true --connect jdbc:mysql://localhost:3306/StudentDB --username root --password 'password' --table Student --num-mappers 1
sqoop import --connect jdbc:mysql://localhost:3306/StudentDB --username root --password 'password' --table Users --num-mappers 1
注1:“-Dorg.apache.sqoop.splitter.allow_text_splitter=true”参数表示——当表的主键字段不是自增id,而是字符类型时。
注2:“--num-mappers 1”或者“-m 1”,即最后汇总为一个输出文件。
注3:可以指定导入到指定目录下,需要带上“ --warehouse-dir ”参数,比如:
sqoop import -Dorg.apache.sqoop.splitter.allow_text_splitter=true --connect jdbc:mysql://localhost:3306/StudentDB --username root --password 'password' --table Student --warehouse-dir /user/sqoop
注4:默认以短号分隔,可以更换为以\t分隔数据(需带上“--fields-terminated-by ”参数)
sqoop import -Dorg.apache.sqoop.splitter.allow_text_splitter=true --connect jdbc:mysql://localhost:3306/StudentDB --username root --password 'password' --table Student --warehouse-dir /user/sqoop --fields-terminated-by '\t' -m1
2、数据从HDFS导出到MySQL
例如:HDFS指定位置的文件数据导出到数据库test的Student表中。比如 /user/sqoop/Student/part-m-00000
sqoop export --connect 'jdbc:mysql://IP或主机名:3306/testDB?useUnicode=true&characterEncode=utf8mb4' --username root -P --table Student --export-dir '/user/sqoop/Student/part-m-00000' --fields-terminated-by '\t'
sqoop export --connect "jdbc:mysql://IP或主机名:3306/testDB?characterEncode=utf8mb4" --username root -P --table Users --export-dir '/user/hadoop/Users/part-m-00000' --fields-terminated-by ','
注1:当导出时出现如下类似错误,
ERROR mapreduce.ExportJobBase: Export job failed!
ERROR tool.ExportTool: Error during export:
Export job failed!
at org.apache.sqoop.mapreduce.ExportJobBase.runExport(ExportJobBase.java:445)
at org.apache.sqoop.manager.SqlManager.exportTable(SqlManager.java:931)
at org.apache.sqoop.tool.ExportTool.exportTable(ExportTool.java:80)
at org.apache.sqoop.tool.ExportTool.run(ExportTool.java:99)
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)
则可
a. 在MySQL中授权:
对其他节点添加了远程访问,但没有对自己添加远程访问权限。
grant all privileges on *.* to 'root'@'%' identified by 'password' with grant option;
flush privileges;
单独添加对 BigData01 的远程访问权限
grant all privileges on *.* to 'root'@'BigData01' identified by 'password' with grant option;
flush privileges;
b. jdbc连接不要使用localhost,可使用host名称或IP地址。
c. 注意:HDFS数据文件的字段值和MySQL的字段对应,且注意字段类型和字符串长度问题。
d. 输入数据字段分隔符,输出数据字段分隔符
e. 若数据中存在中文的,则考虑连接数据库参数中加入 永久设置MySQL字符编码 -- 解决jdbc数据导入由于存在中文字符出错问题!
sqoop export --connect "jdbc:mysql://BigData01:3306/testDB?useUnicode=true&characterEncoding=utf8mb4" --username root -P --table Users --input-fields-terminated-by "," --export-dir '/user/hadoop/Users/part-m-00000' --fields-terminated-by ','