Sqoop是一个开源的数据抽取工具,它可以快速的将hdfs中的数据抽取到结构化数据库中,也可以从结构化数据库中把数据写入到hdfs中
Sqoop的配置类似于Hive,需要在大数据集群中任一节点上搭建sqoop,这个节点就是sqoop的客户端。
在slave3节点中搭建sqoop
1.将安装包上传到slave3的/root/app
安装Sqoop
[root@slave3 ~]# cd /root/app
[root@slave3 app]# tar -zxvf sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz
[root@slave3 app]# rm -rf sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz
[root@slave3 app]# cd sqoop-1.4.6.bin__hadoop-2.0.4-alpha/
[root@slave3 sqoop-1.4.6.bin__hadoop-2.0.4-alpha]# pwd
/root/app/sqoop-1.4.6.bin__hadoop-2.0.4-alpha
配置环境变量
[root@slave3 sqoop-1.4.6.bin__hadoop-2.0.4-alpha]# vim /etc/profile
#sqoop path
export SQOOP_HOME=/root/app/sqoop-1.4.6.bin__hadoop-2.0.4-alpha
export PATH=$PATH:$SQOOP_HOME/bin
[root@slave3 sqoop-1.4.6.bin__hadoop-2.0.4-alpha]# source /etc/profile
配置sqoop
[root@slave3 sqoop-1.4.6.bin__hadoop-2.0.4-alpha]# cd conf
[root@slave3 conf]# ls
oraoop-site-template.xml sqoop-env-template.sh sqoop-site.xml
sqoop-env-template.cmd sqoop-site-template.xml
[root@slave3 conf]# cp sqoop-env-template.sh sqoop-env.sh
[root@slave3 conf]# vim sqoop-env.sh
export HADOOP_COMMON_HOME=/root/app/hadoop-2.7.7
export HADOOP_MAPRED_HOME=/root/app/hadoop-2.7.7
修改这两项:
将sqoop接口包上传到/root/app/sqoop-1.4.6.bin__hadoop-2.0.4-alpha/lib目录下
至此,Sqoop安装完成
Sqoop工具的应用
*****************************创建数据库和数据表开始**************************
一、在win10的navicate中连接上slave3中的mysql
直接连接会报错:navicate:192.168...is not alowed to connect
进入slave中,执行下列语句:
1、连接MySQL服务器: mysql -phost -u root -p
2、看当前所有数据库:show databases;
3、进入mysql数据库:use mysql;
4、查看mysql数据库中所有表:show tables;
5、查看user表中数据:select Host, User from user;
6、修改user表中的Host:update user set Host='%' where User='root';
其中第6步如有报错:ERROR 1062 (23000): Duplicate entry '%-root' for key 'PRIMARY' 不予理会,直接执行第7步
7、刷新:flush privileges;
此时再连接就能连接上了
创建数据库bigdata和student表
插入数据:
SQL:
INSERT INTO `student`(`id`, `name`, `sex`) VALUES (20221023, '李四', '男');
INSERT INTO `student`(`id`, `name`, `sex`) VALUES (20221188, '张三', '男');
INSERT INTO `student`(`id`, `name`, `sex`) VALUES (20221321, '韩梅梅', '女');
*****************************创建数据库和数据表结束**************************
经过上面的步骤后,centos 下mysql使用密码root登录不了,navicat使用密码root又能连上
造成这种情况的原因是数据库mysql中的数据表user中没有localhost记录了
可以参考MySQL修改密码终极方法.docx操作试试
但是我这里操作成功了localhost登录没有了mysql,应该是执行过程中哪里出错了
我们这里直接指定登录主机为127.0.0.1登录即可
即登录mysql使用:密码还是root
[root@slave3 ~]# mysql -h 127.0.0.1 -u root -p
显示所有数据库
[root@slave3 ~]# sqoop list-databases --connect jdbc:mysql://127.0.0.1:3306/ --username root --password root
information_schema
bigdata
hive_metadata
mysql
performance_schema
显示指定数据库下所有表
[root@slave3 ~]# sqoop list-tables --connect jdbc:mysql://127.0.0.1:3306/bigdata --username root -password root
student
使用sqoop导入Mysql数据到HDFS中
需先确保output目录不存在,执行一下删除目录命令
[root@slave3 ~]# hadoop fs -rmr /output
sqoop import --connect jdbc:mysql://127.0.0.1:3306/bigdata --username root --password root --table student -m 1 --target-dir '/output/sqoop' --fields-terminated-by '\t'
参数说明:
--table student表示从bigdata数据库中的student表获取数据
--target-dir '/output/sqoop' 表示将数据输出到hdfs的/output/sqoop目录中
-m 1表示设置mapreduce的数量,sqoop的底层实现也是mapreduce,所以sqoop的运行也是以作业的方式运行。
--fields-terminated-by '\t‘表示将数据写入hdfs后,数据之间用制表符分隔
执行:
[root@slave3 ~]sqoop import --connect jdbc:mysql://127.0.0.1:3306/bigdata --username root --password root --table student -m 1 --target-dir '/output/sqoop' --fields-terminated-by '\t'
执行完成:
查看写入hdfs的数据:
[root@slave3 ~]# hadoop fs -cat /output/sqoop/p*
20221023 李四 男
20221188 张三 男
20221321 韩梅梅 男
到此,代表从mysql导出数据写入hdfs成功
将数据写入到mysql中
注意:从HDFS导出数据到Mysql中,接收数据的表必须事先存在
为了看到实验的效果,先将bigdata数据库下的student表清空
将hdfs的数据写入到mysql中:
注意从hdfs导出数据到mysql中时,必须设置字符编码集,因为二者编码不一样,不设置可能会出现中文乱码的问题:
[root@slave3 ~]# sqoop export --connect jdbc:mysql://127.0.0.1:3306/bigdata?characterEncoding=UTF-8 --username root -password root --table student --export-dir '/output/sqoop/p*' --fields-terminated-by '\t'
执行成功后到navicat中查看,发现数据写入成功!
本文作者为BUG之神,转载请注明。