Sqoop可以在Hadoop和关系数据库之间拷贝数据。在很多方面,它和Hadoop的交互方式与Hive和Hadoop的交互方式完全相同
下载和配置Sqoop
下载已编译包到/usr/local,建立符号链接并更新环境变量。
$ ln -s sqoop-xx.tar.gz sqoop
$ export SQOOP_HOME=/usr/local/sqoop
$ export PATH=${SQOOP_HOME}/bin:${PATH}
下载MySql的JDBC驱动程序,拷入Sqoop的lib目录。
$ cp mysql-connector-java-xx-bin.jar /opt/sqoop/lib
测试Sqoop安装是否成功。
$ sqoop help
MySQL到HDFS
从Mysql数据表读取数据并将其写入HDFS的结构化文件中。
$ sqoop import --connect jdbc:mysql://localhost/hadooptest hadooptest为数据库名
--uesrname hadoopuser -p --table employees
默认情况下,Sqoop使用4个mapper(可使用-m选项设定mapper数量)读取数据表内容,会在Hadoop用户根目录下生成与数据表名完全相同的目录名,且在该目录下会包含多个文件(part-m-x )。Sqoop根据主键列的内容对源数据表智能分块,然后用多个mapper分别读取各段数据。所有这些智能控制都是在运行于Hadoop上的MapReduce作业中实现的。Sqoop命令行客户端程序只负责高效生产MapReduce代码,之后便不参与数据处理过程。一般是把ID作为主键,但有时使用文本主键让Sqoop很好发挥处理数据的方式。假设用4个mapper处理由100万条记录组成的表,借助主键列的信息,Sqoop可以创建4条SQL语句获取数据,每条语句都限定了目标数据的主键范围(最简单情况,是用where id between)。
MySQL到Hive
把一个MySQL数据表中的所有数据(部分数据)导入Hive中相应的数据表。
$ hive -e "show tables like 'employees'" 确认Hive中不存在employees数据表
$ sqoop import --connect jdbc:mysql://localhost/hadooptest --username hadoopuser -p
--table employees --column first_name,salary
--where "salary>45000"
--hive-import --hive-table employees
$ hive -e "describe employees" 检查Hive中已创建的数据表
--hive-import选项指明数据的目标存储位置是Hive。除timestamp之外,目前Hive不支持Date和DateTime数据类型,如果被导入的数据是与时间或日期相关的其他类型,Sqoop会把它转换成string类型。