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官网: