Sqoop实现 Hadoop(Hive)与Mysql间数据传递

sqoop中文手册:http://blog.csdn.net/myrainblues/article/details/43673129html

 

1、准备

1.sqoop1.4.6安装包:https://mirrors.tuna.tsinghua.edu.cn/apache/sqoop/1.4.6/java

2.sqoop-1.4.6 jar包: http://central.maven.org/maven2/org/apache/sqoop/sqoop/1.4.6/mysql

3.mysql-connector-java.jar:http://central.maven.org/maven2/mysql/mysql-connector-java/5.1.25/sql

4.Hadoop版本:5.7.1数据库

2、安装

1.解压apache

tar -zxvf sqoop-1.4.6.tar.gzvim

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

vim /etc/profileapp

export SQOOP_HOME=/opt/soft/sqoop-1.4.6
export PATH=$SQOOP_HOME/bin:$PATHmaven

使环境变量生效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数据库连接用

3、测试

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对比:

http://blog.csdn.net/sunflower_cao/article/details/40348721

 

参考:

sqoop官网: http://sqoop.apache.org/docs/1.4.6/SqoopUserGuide.html

相关文章
相关标签/搜索