1。1Sqoop简介 Sqoop即SqlToHadoop 一般来说数据仓库中的数据不应该只有行为数据,还需要有业务数据,而业务数据一般存放在关系型数据库(例如Oracle、Mysql、SqlServer等)中,而在以前,从关系型数据库中导出数据到Hadoop是非常困难的,市场上也需要一款可以方便导入和导出的工具,此时Sqoop、Datax、Kettle等工具应运而生。 官网:https:sqoop。apache。org ApacheSqoop项目在2021年6月就已经进入Attic了,这意味着Sqoop移动到Attic后,是不会再修复任何的Bug、Release新版本了,并且也不会再重启社区,但从使用角度来说是完全不受影响的,ApacheAttic依旧会提供代码库的下载。 虽然Sqoopy已经退役,但目前将Sqoop做数据迁移工具公司也不在少数,如果遇到问题,我们只能自己建个分支去fix了。 Sqoop是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql、oracle。。。)之间进行数据的传递,可以将一个关系型数据库(例如:MySQL、Oracle、Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。 简单来说Sqoop的定位就是Hadoop生态存储和结构化存储之间的数据迁移。 我们比较常见的场景就是HDFSHBaseHive和MySqlOracle之间的数据互导。Sqoop作为数据传输的桥梁,通过定义MapReduce的InPutFormat和OutPutFormat来对接源存储和目的存储。 Sqoop项目开始于2009年,最早是作为Hadoop的一个第三方模块存在,后来为了让使用者能够快速部署,也为了让开发人员能够更快速的迭代开发,Sqoop独立成为一个Apache项目。 Sqloop的版本 目前Sqoop总体有两大版本分为Sqoop1和Sqoop2,Sqoop1的最新release是1。4。7; Sqoop2的最新Release是1。99。7;这里如果大家使用的话推荐使用Sqoop1,而Sqoop2虽然增加了CLI和Restapi,但实际上是一个半成品,跟Sqoop1也完全不兼容,并且无论是CDH还是之前Apache都是不建议生产使用的,自己随便玩玩还可以。 请注意,2与1不兼容,且特征不完整,它并不打算用于生产部署1。2Sqoop原理 将导入或导出命令翻译成mapreduce程序来实现。 在翻译出的mapreduce中主要是对inputformat和outputformat进行定制。 整个Sqoop的迁移过程,都会对应着一个MapReduce作业,实际上只有Map阶段,而迁移大致分为5个部分,如下所示。 Sqoop逻辑简图 Initializer:整个Sqoop迁移的初始化阶段,完成迁移前的准备工作,如连接数据源,创建临时表,添加依赖的jar包等。 Partitioner:源数据分片,根据作业并发数来决定源数据要切分多少片。 Extractor:开启extractor线程,内存中构造数据写入队列之中; Loader:开启loader线程,从队列中读取数据并写入对应后端; Destroyer:整个迁移的收尾工作,断开sqoop与数据源的连接,完成资源回收; 流程解析: 当迁移任务启动后,首先会进入初始化部分,使用JDBC检查导入的数据表,检索出表中的所有列以及列的数据类型,并将这些数据类型映射为Java数据类型,在转换后的MapReduce应用中使用这些对应的Java类型来保存字段的值,在每次Sqoop的任务执行时,代码生成器使用这些信息来创建对应表的类,用于保存从表中抽取的记录,即xxxx。java文件。 紧接着Partitioner会根据splitby或者m指定整个任务的分片数量,如不指定默认是4个分片(每一个partition对应着一个Mapper),然后编译成一个本地Jar包用于提交MapReduce作业。当任务提交到集群后,每个Mapper会分别启动一个Extractor线程和Loader线程,整个MapReduce的InputFormat实际上是通过JDBC读取原端数据写入到Context中,而Loader线程将从Context中读出写入对应的数据作为OutPutFormat迁移的目的端。当任务执行完成后,yarn资源释放,随之Destroyer回收所有与数据源的连接。 这里主要讲述的是Import的过程,而export流程与import十分相似,是把数据解析为一条条insert语句,在此不过多解析。1。3Sqoop安装 安装Sqoop的前提是已经具备Java和Hadoop的环境。 本文使用的是三台集群环境,选取192。168。204。103这台主机进行安装。 下载并解压 1)下载地址:http:archive。apache。orgdistsqoop1。4。7 2)上传安装包sqoop1。4。7。binhadoop2。6。0。tar。gz到虚拟机中 optsoftsqoop1。4。7。binhadoop2。6。0。tar。gz 3)解压sqoop安装包到指定目录,例如: 〔rootnode103soft〕tarzxvfsqoop1。4。7。binhadoop2。6。0。tar。gzC。。module 如果觉得目录名称过长,可以修改一下:〔rootnode103sqoop1。4。7。binhadoop2。6。0〕pwd optmodulesqoop1。4。7。binhadoop2。6。0 〔rootnode103module〕mvsqoop1。4。7。binhadoop2。6。0sqoop 〔rootnode103sqoop1。4。7。binhadoop2。6。0〕pwd optmodulesqoop 修改配置文件 Sqoop的配置文件与大多数大数据框架类似。 可以在etcprofile中配置,导出为全局变量 或者 在sqoopenv。sh文件中配置,该文件在sqoop根目录下的conf目录中。(本文章用的是这个方式进行的配置) 我们需要配置哪些内容呢?HADOOPHOME HIVEHOME HBASEHOME ZOOKEEPERHOME 为什么是这些环境变量,因为后面案例中要实现的导入、导出功能有:RDBMSHDFS RDBMSHive RDBMSHBase HDFSRDBMS HiveRDBMS 1)重命名或复制一个配置文件〔rootnode103conf〕mvsqoopenvtemplate。shsqoopenv。sh 或 〔rootnode103conf〕cpsqoopenvtemplate。shsqoopenv。sh 2)修改配置文件 sqoopenv。shexportHADOOPCOMMONHOMEoptmodulehadoop2。7。5 exportHADOOPMAPREDHOMEoptmodulehadoop2。7。5 exportHBASEHOMEoptmodulehbase1。3。1 exportHIVEHOMEoptmoduleapachehive2。1。1bin exportZOOKEEPERHOMEoptmodulezookeeper3。4。9 exportZOOCFGDIRoptmodulezookeeper3。4。9conf 效果图如下: 拷贝JDBC驱动 拷贝jdbc驱动到sqoop的lib目录下,可以从之前Hive的安装目录下找到mysql驱动包:〔rootnode103lib〕pwd optmoduleapachehive2。1。1binlib 〔rootnode103lib〕cpmysqlconnectorjava5。1。38。jaroptmodulesqooplib 验证Sqoop 我们可以通过某一个command来验证sqoop配置是否正确:〔rootnode103sqoop〕pwd optmodulesqoop 〔rootnode103sqoop〕。binsqoophelp 出现一些Warning警告(警告信息已省略),并伴随着帮助命令的输出:usage:sqoopCOMMAND〔ARGS〕 Availablecommands: codegenGeneratecodetointeractwithdatabaserecords createhivetableImportatabledefinitionintoHive evalEvaluateaSQLstatementanddisplaytheresults exportExportanHDFSdirectorytoadatabasetable helpListavailablecommands importImportatablefromadatabasetoHDFS importalltablesImporttablesfromadatabasetoHDFS importmainframeImportdatasetsfromamainframeservertoHDFS jobWorkwithsavedjobs listdatabasesListavailabledatabasesonaserver listtablesListavailabletablesinadatabase mergeMergeresultsofincrementalimports metastoreRunastandaloneSqoopmetastore versionDisplayversioninformation SeesqoophelpCOMMANDforinformationonaspecificcommand。 这里的输出信息中有一个HBase路径不正确,是因为做测试已经移除掉HBase,需要重新安装HBase即可(请参考Hbase系列)。 测试Sqoop是否能够成功连接数据库 〔rootnode103sqoop〕。binsqooplistdatabasesconnectjdbc:mysql:node103:3306usernamerootpassword123456 出现如下输出:informationschema hive mysql test 至此,Sqoop安装完毕!