Sqoop实现Mysql与HDFS/Hbase的数据迁移

简介

        Sqoop是一个用来将Hadoop和关系型数据库中的数据相互转移的工具,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导入到HadoopHDFS中,也可以将HDFS的数据导入到关系型数据库中。

http://sqoop.apache.org/

环境

    当调试过程出现IncompatibleClassChangeError一般都是版本兼容问题。

    为了保证hadoopsqoop版本的兼容性,使用Cloudera

    Cloudera简介:

        Cloudera为了让Hadoop的配置标准化,可以帮助企业安装,配置,运行hadoop以达到大规模企业数据的处理和分析。

http://www.cloudera.com/content/cloudera-content/cloudera-docs/CDHTarballs/3.25.2013/CDH4-Downloadable-Tarballs/CDH4-Downloadable-Tarballs.html

    下载安装sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz。

目的

        将mysql数据转换为hadoop文件,从而可以使用map/reduce进行大数据的分析,然后再将分析结果转换回mysql,供业务查询调用。

安装

    安装比较简单,直接解压即可

    唯一需要做的就是将mysqljdbc适配包mysql-connector-java-5.0.7-bin.jar copy$SQOOP_HOME/lib下。

    配置好环境变量:/etc/profile

    export SQOOP_HOME=/home/hadoop/sqoop-1.4.6.bin__hadoop-2.0.4-alpha/

    export PATH=$SQOOP_HOME/bin:$PATH

    在sqoop-env.sh中添加如下代码:

[html] view plain copy
  1. export HADOOP_COMMON_HOME=/home/hadoop/hadoop   
  2. export HADOOP_MAPRED_HOME=/home/hadoop/hadoop   
  3. export HBASE_HOME=/home/hadoop/hbase   
  4. export HIVE_HOME=/home/hadoop/hive   
  5. export ZOOCFGDIR=/home/hadoop/zookeeper  
    (如果数据读取不设计hbase和hive,那么相关hbase和hive的配置可以不加,如果集群有独立的zookeeper集群,那么配置zookeeper,反之,不用配置)。

    hadoop的必要配置:

   在hadoop-2.6.0/etc/hadoop目录下配置mapred-site.xml

[html] view plain copy
  1. <property>  
  2.   <name>mapreduce.framework.name</name>  
  3.   <value>yarn</value>  
  4. </property>  
  5. <property>  
  6.   <name>mapreduce.jobhistory.adress</name>  
  7.   <value>127.0.0.1:10020</value>  //DataNode需要访问 MapReduce JobHistory Server,默认值:0.0.0.0:10020   
  8. </property>  
[html] view plain copy
  1. 启动historyserver:  
  2. sbin/mr-jobhistory-daemon.sh start historyserver  

MYSQLHDFS-示例

[html] view plain copy
  1. ./sqoop import --connect jdbc:mysql://10.8.210.166:3306/recsys --username root --password root --table shop -m 1 --target-dir /user/recsys/input/shop/$today  

输出数据:

./hadoop fs -cat /user/recsys/input/shop/2013-05-07/*

生成的hdfs数据

287,516809,0,0,6,25,45.78692,126.65384

288,523944,0,0,29,6,120.26087,30.17264

-------------------------------------------------------


HDFSMYSQ-示例

[html] view plain copy
  1. ./sqoop export --connect jdbc:mysql://10.8.210.166:3306/recsys --username root --password root --table shopassoc  --fields-terminated-by ',' --export-dir /user/recsys/output/shop/$today  

输入数据:

./hadoop fs -cat /user/recsys/output/shop/2013-05-07/*

Hdfs原始数据

null,857207,729974,947.0818,29,2013-05-08 10:22:29

null,857207,524022,1154.2603,29,2013-05-08 10:22:29

--------------------------------------------------------------------------

Mysql与Hbase互导数据

[html] view plain copy
  1. sqoop import --connect jdbc:mysql://mysqlserver_IP/databaseName --username --password password --table datatable --hbase-create-table --hbase-table hbase_tablename --column-family col_fam_name --hbase-row-key key_col_name  
其中 ,databaseName 和datatable 是mysql的数据库和表名,hbase_tablename是要导成hbase的表名,key_col_name可以指定datatable中哪一列作为hbase新表的rowkey,col_fam_name是除rowkey之外的所有列的列族名
例如 :可通过如下命令将Mysql中的students表导入到Hbase中:
[html] view plain copy
  1. /home/grid/sqoop/bin/sqoop import --connect jdbc:mysql://192.168.66.96/sqoop --username sqoop --password liyang16 --table students --hbase-create-table --hbase-table students --column-family stuinfo --hbase-row-key id  
成功执行后,可在hbase中用以下命令查看结果:
[html] view plain copy
  1. hbase(main):011:0> scan 'students'  
  2. ROW COLUMN+CELL  
  3. 10001 column=stuinfo:age, timestamp=1356759994058value=29  
  4. 10001 column=stuinfo:name, timestamp=1356759994058value=liyang  
  5. 10002 column=stuinfo:age, timestamp=1356760044478value=28  
  6. 10002 column=stuinfo:name, timestamp=1356760044478value=lion  
  7. 10003 column=stuinfo:age, timestamp=1356760044478value=26  
  8. 10003 column=stuinfo:name, timestamp=1356760044478value=leon  
  9. 3 row(s) in 0.0900 seconds  

使用--columns 指定的字段大小写要注意 得使用小写。
如果使用大写 导数据不会有异常 会成功的,hbase中表也会创建好,但是scan的时候 你会发现没有数据 这个蛋疼吧
--columns id,order_id,order_code
而且每个字段之间用逗号分隔,但是不能有空格,在sqoop中没有处理空格,如果在这个命令后的参数有空格的话


技巧

 导出导入的数据与字段的顺序进行匹配

 从HDFS转换回mysql 的时候,自动增长的主键字段处,可以留空
注:为了减少对HBase的负载,Sqoop可以做批量加载,而不是直接写入。要使用批量加载,使用启用--hbase-bulkload
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值