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中添加如下代碼:

  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

  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>  
  1. 啓動historyserver:  
  2. sbin/mr-jobhistory-daemon.sh start historyserver  

MYSQLHDFS-示例

  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-示例

  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互導數據

  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中:
  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中用以下命令查看結果:
  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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章