博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Sqoop实现 Hadoop(Hive)与Mysql间数据传递
阅读量:6241 次
发布时间:2019-06-22

本文共 2773 字,大约阅读时间需要 9 分钟。

hot3.png

sqoop中文手册:

 

一、准备

1.sqoop1.4.6安装包:

2.sqoop-1.4.6 jar包: 

3.mysql-connector-java.jar:

4.Hadoop版本:5.7.1

二、安装

1.解压

tar -zxvf sqoop-1.4.6.tar.gz

配置sqoop环境变量(可不配):

vim /etc/profile

export SQOOP_HOME=/opt/soft/sqoop-1.4.6

export PATH=$SQOOP_HOME/bin:$PATH

使环境变量生效source /etc/profile

2.将下载好的sqoop-1.4.6 jar,mysql-connector-java.jar移动到 sqoop-1.4.6/lib下

注意:sqoop-1.4.6.jar不导入启动会报错,mysql-connector-java.jar做MySQL数据库链接用

三、测试

1.导入功能:数据库中的数据导入到HDFS系统

命令: sqoop import -connect jdbc:mysql://192.168.20.8:3306/qf_db -username root -password root -table student -target-dir /qf_db/student2 -m 1  -fields-terminated-by '\t'

参数介绍: ./sqoop是操作sqoop最常用的命令也是功能最强大的命令

import是导入的意思;

-connect jdbc:mysql://192.168.220.8:3306意思是以jdbc的方式连接数据库,192.168.220.8是我们的Windows的IP地址,3306是端口,qf_db是我们t_clue表所在的数据库的名称;

-username root -password root 是指数据库的用户名和密码;

-table t_clue意思是我们要导的是t_clue表;

-target-dir指定要存放到服务器的哪个目录下;

-m指定要起的mapper的数量;

-fields-terminated-by '\t' 指定列与列的分隔符为制表符;

-split-by id 通过该参数值来进行切分,然后将切分出来的区域分配到不同map中,类型有不同的切分方法;

-columns 'ID,Name,Age' 意思是我们要导入的只有ID、Name和Age这三列;

-where 'ID>=3 and ID<=8',筛选数据并导入符合条件的数据;

-query 'select * from Student where ID>5 and $CONDITIONS' 使用query语句来筛选我们的数据,这意味着我们可以导入多张表的数据,使用query语句的话,就不用指定table了(注意:如果使用--query这个命令的时候,需要注意的是where后面的参数,AND $CONDITIONS这个参数必须加上,而且存在单引号与双引号的区别,如果--query后面使用的是双引号,那么需要在$CONDITIONS前加上\即\$CONDITIONS);

出现错误:

 (1)ERROR tool.BaseSqoopTool: Error parsing arguments for list-tables:

检查你的链接内容,是否添写正确,如果没有问题,再检查是否包含中文字符;

(2)java.sql.SQLException: null,  message from server: "Host 'Hadoop1' is not allowed to connect to this

update user set host ='%' where user ='root';

执行刷新权限:flush privileges;

注意:执行过程中只有map,reduce的进度始终是0%,说明导入功能根本就没用到reduce的功能。是因为要把数据库中的数据导入到HDFS系统,只需要多台设备同时到数据库中去读取一条一条数据然后直接上传到HDFS,根本就不需要进行合并操作。

原理:

1.读取要导入数据的表结构,生成运行类,默认是QueryResult,打成jar包,然后提交给Hadoop

2.设置好job,主要也就是设置好以上第六章中的各个参数

3.这里就由Hadoop来执行MapReduce来执行Import命令了,

1)首先要对数据进行切分,也就是DataSplit

DataDrivenDBInputFormat.getSplits(JobContext job)

2)切分好范围后,写入范围,以便读取

DataDrivenDBInputFormat.write(DataOutput output) 这里是lowerBoundQuery and  upperBoundQuery

3)读取以上2)写入的范围

DataDrivenDBInputFormat.readFields(DataInput input)

4)然后创建RecordReader从数据库中读取数据

DataDrivenDBInputFormat.createRecordReader(InputSplit split,TaskAttemptContext context)

5)创建Map

TextImportMapper.setup(Context context)

6)RecordReader一行一行从关系型数据库中读取数据,设置好Map的Key和Value,交给Map

DBRecordReader.nextKeyValue()

7)运行map

TextImportMapper.map(LongWritable key, SqoopRecord val, Context context)

最后生成的Key是行数据,由QueryResult生成,Value是NullWritable.get()

2.Hdfs 导出数据文件至MySQL

命令例子:sqoop export -connect jdbc:mysql://192.168.20.8:3306/qf_db_test -username root -password root -table student -export-dir /qf_db/student2 -m 1  -fields-terminated-by '\t'

Sqoop1与Sqoop2对比:

 

参考:

sqoop官网: 

转载于:https://my.oschina.net/u/1765168/blog/1574751

你可能感兴趣的文章
8.10 exec函数
查看>>
Shell命令-文件及内容处理之sort、uniq
查看>>
Android 之文件夹排序
查看>>
Java Assert 用法简介
查看>>
关于redo size(一)
查看>>
We Know What @You #Tag: Does the Dual Role Affect Hashtag Adoption-20160520
查看>>
(转)Eclipse新增安卓虚拟机
查看>>
SpringMvc访问Controller去掉do
查看>>
PHPnow升级PHP 5.4与Mysql 5.5
查看>>
正则表达式验证邮箱格式
查看>>
如何围绕企业战略,建设BI驾驶舱?
查看>>
java多线程stop,suspend使用代码实际例子
查看>>
中小型研发团队架构实践三:微服务架构(MSA)
查看>>
Windows动态库学习心得
查看>>
在VMware虚拟机上安装Ubuntu 10.04
查看>>
LDA主题模型简介
查看>>
可拖动的DIV续
查看>>
关于“类型初始值设定项引发异常”
查看>>
MySql 小表驱动大表
查看>>
Redis 数据结构的底层实现 (一) RealObject,embstr,sds,ziplist,quicklist
查看>>