簡介
Sqoop是一個用來將Hadoop和關係型數據庫中的數據相互轉移的工具,可以將一個關係型數據庫(例如 : MySQL ,Oracle ,Postgres等)中的數據導入到Hadoop的HDFS中,也可以將HDFS的數據導入到關係型數據庫中。
http://sqoop.apache.org/
環境
當調試過程出現IncompatibleClassChangeError一般都是版本兼容問題。
爲了保證hadoop和sqoop版本的兼容性,使用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,供業務查詢調用。
安裝
安裝比較簡單,直接解壓即可
唯一需要做的就是將mysql的jdbc適配包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中添加如下代碼:
- export HADOOP_COMMON_HOME=/home/hadoop/hadoop
- export HADOOP_MAPRED_HOME=/home/hadoop/hadoop
- export HBASE_HOME=/home/hadoop/hbase
- export HIVE_HOME=/home/hadoop/hive
- export ZOOCFGDIR=/home/hadoop/zookeeper
(如果數據讀取不設計hbase和hive,那麼相關hbase和hive的配置可以不加,如果集羣有獨立的zookeeper集羣,那麼配置zookeeper,反之,不用配置)。
hadoop的必要配置:
在hadoop-2.6.0/etc/hadoop目錄下配置mapred-site.xml
- <property>
- <name>mapreduce.framework.name</name>
- <value>yarn</value>
- </property>
- <property>
- <name>mapreduce.jobhistory.adress</name>
- <value>127.0.0.1:10020</value> //DataNode需要訪問 MapReduce JobHistory Server,默認值:0.0.0.0:10020
- </property>
- 啓動historyserver:
- sbin/mr-jobhistory-daemon.sh start historyserver
MYSQL轉HDFS-示例
- ./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 ------------------------------------------------------- |
HDFS轉MYSQ-示例
- ./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互導數據
- 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中:
- /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中用以下命令查看結果:- hbase(main):011:0> scan 'students'
- ROW COLUMN+CELL
- 10001 column=stuinfo:age, timestamp=1356759994058, value=29
- 10001 column=stuinfo:name, timestamp=1356759994058, value=liyang
- 10002 column=stuinfo:age, timestamp=1356760044478, value=28
- 10002 column=stuinfo:name, timestamp=1356760044478, value=lion
- 10003 column=stuinfo:age, timestamp=1356760044478, value=26
- 10003 column=stuinfo:name, timestamp=1356760044478, value=leon
- 3 row(s) in 0.0900 seconds
使用--columns 指定的字段大小寫要注意 得使用小寫。 如果使用大寫 導數據不會有異常 會成功的,hbase中表也會創建好,但是scan的時候 你會發現沒有數據 這個蛋疼吧 --columns id,order_id,order_code 而且每個字段之間用逗號分隔,但是不能有空格,在sqoop中沒有處理空格,如果在這個命令後的參數有空格的話 |
技巧
導出導入的數據與字段的順序進行匹配
從HDFS轉換回mysql 的時候,自動增長的主鍵字段處,可以留空注:爲了減少對HBase的負載,Sqoop可以做批量加載,而不是直接寫入。要使用批量加載,使用啓用--hbase-bulkload