Hadoop和关系数据库之间的数据流通

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类型。



你可能感兴趣的:(Distributed,Filesystem)