下面我们结合 HDFS,介绍 Sqoop 从关系型数据库的导入和导出
一、MySQL里的数据通过Sqoop import HDFS
它的功能是将数据从关系型数据库导入 HDFS 中,其流程图如下所示。
我们来分析一下 Sqoop 数据导入流程,首先用户输入一个Sqoop import 命令,Sqoop 会从关系型数据库中获取元数据信息,
比如要操作数据库表的 schema是什么样子,这个表有哪些字段,这些字段都是什么数据类型等。
它获取这些信息之后,会将输入命令转化为基于 Map 的 MapReduce作业。
这样 MapReduce作业中有很多 Map 任务,每个 Map 任务从数据库中读取一片数据,这样多个 Map 任务实现并发的拷贝,把整个数据快速的拷贝到 HDFS 上。
Sqoop Import HDFS(带着官网)
具体,自己去尝试做吧!
在这之前,先启动hadoop集群,sbin/start-all.sh。这里不多赘述。
同时,开启MySQL数据库。这里,不多赘述。
同时,因为后续的sqoop运行啊,会产生一些日志等,我这里先新建一个目录,用来专门存放它。在哪个目录下运行后续的sqoop操作,就在哪个目录下新建就好。(因为,已经配置了环境变量,在任何路径下都是可以运行的)
[hadoop@djt002 sqoop]$ pwd/usr/local/sqoop
[hadoop@djt002 sqoop]$ ll
total4drwxr-xr-x. 9 hadoop hadoop 4096 Apr 27 2015 sqoop-1.4.6[hadoop@djt002 sqoop]$ mkdir sqoopRunCreate
[hadoop@djt002 sqoop]$ ll
total8drwxr-xr-x. 9 hadoop hadoop 4096 Apr 27 2015 sqoop-1.4.6drwxrwxr-x. 2 hadoop hadoop 4096 Mar 17 23:33sqoopRunCreate
[hadoop@djt002 sqoop]$ cd sqoopRunCreate/[hadoop@djt002 sqoopRunCreate]$ pwd/usr/local/sqoop/sqoopRunCreate
[hadoop@djt002 sqoopRunCreate]$
比如,以后我就在这个目录下运行操作sqoop,/usr/local/sqoop/sqoopRunCreate。
Sqoop Import 应用场景——密码访问
(1)明码访问
[hadoop@djt002 sqoopRunCreate]$ sqoop list-databases \>--connect jdbc:mysql://192.168.80.200/ \
>--username hive \> --password hive
(2)交互式密码访问
[hadoop@djt002 sqoopRunCreate]$ sqoop list-databases \> --connect jdbc:mysql://192.168.80.200/ \
> --username hive \> -P
Enter password: (输入hive)
(3)文件授权密码访问
因为,官网上是这么给的,在家目录,且需赋予400权限。所以
[hadoop@djt002 ~]$ pwd/home/hadoop
[hadoop@djt002~]$echo -n "hive" >.password
[hadoop@djt002~]$ ls -a
. .bash_history .cache djt flume .gnote .gvfs .local .nautilus .pulse Videos .xsession-errors
.. .bash_logout .config Documents .gconf .gnupg .hivehistory .mozilla .password .pulse-cookie .vim .xsession-errors.old
.abrt .bash_profile .dbus Downloads .gconfd .gstreamer-0.10.ICEauthority Music Pictures .ssh .viminfo
anagram.jar .bashrc Desktop .esd_auth .gnome2 .gtk-bookmarks .imsettings.log .mysql_history Public Templates .Xauthority
[hadoop@djt002~]$ more .password
hive
[hadoop@djt002~]$
[hadoop@djt002 ~]$ chmod 400 .password
[hadoop@djt002 sqoopRunCreate]$ sqoop list-databases \> --connect jdbc:mysql://192.168.80.200/ \
> --username hive \> --password-file /home/hadoop/.password
java.io.IOException: The provided password file /home/hadoop/.password does not exist!
[hadoop@djt002 local]$ $HADOOP_HOME/bin/hadoop dfs -put /home/hadoop/.password /user/hadoop
[hadoop@djt002 local]$ $HADOOP_HOME/bin/hadoop dfs -chmod 400 /user/hadoop/.password
[hadoop@djt002 ~]$ rm .password
rm: remove write-protected regular file `.password'? y
[hadoop@djt002 sqoopRunCreate]$ sqoop list-databases \> --connect jdbc:mysql://192.168.80.200/ \
> --username hive \> --password-file /user/hadoop/.password
Sqoop Import 应用场景——导入全表
(1)不指定目录 (则默认是在/user/hadoop/下)
我这里啊,给大家尝试另一个软件。(为什么,要这样带大家使用,是为了你们的多适应和多自学能力)(别嫌麻烦!)
这里,我们选择在hive这个数据库里,创建新的表,命名为
如果,面对 SQLyog不能正常显示中文数据的情况:在SQLyog下输入SET character_set_results = gb2312(或 gbk),执行,重新启动SQLyog,显示应该也可以看到你所插入的中文数据了。
注意,我的数据表是djt-user。我这里改名啦!
[hadoop@djt002 sqoopRunCreate]$ sqoop import \> --connect jdbc:mysql://192.168.80.200/hive \
> --username hive \> --password-file /user/hadoop/.password \> --table djt-user
SET character_set_database=utf8;
SET character_set_server=utf8;
SHOW VARIABLES LIKE'character%';
[hadoop@djt002 ~]$ $HADOOP_HOME/bin/hadoop fs -rmr /user/hadoop/djt-user
[hadoop@djt002 sqoopRunCreate]$ sqoop import --connect jdbc:mysql://192.168.80.200/hive --username hive --password-file /user/hadoop/.password --table djt-user
[hadoop@djt002 sqoopRunCreate]$ sqoop import --connect jdbc:mysql://192.168.80.200/hive --username hive --password-file /user/hadoop/.password --table djt-user
Warning: /usr/local/sqoop/sqoop-1.4.6/../hcatalog d