1. 程式人生 > >大數據模塊開發之結果導出

大數據模塊開發之結果導出

blog 關系數據庫 -m form 修改 單個 part not 工作

1. Apache Sqoop
Sqoop是Hadoop和關系數據庫服務器之間傳送數據的一種工具。它是用來從關系數據庫如:MySQL,Oracle到Hadoop的HDFS,並從Hadoop的文件系統導出數據到關系數據庫。由Apache軟件基金會提供。
Sqoop:“SQL 到 Hadoop 和 Hadoop 到SQL”。
技術分享圖片
Sqoop工作機制是將導入或導出命令翻譯成mapreduce程序來實現。
在翻譯出的mapreduce中主要是對inputformat和outputformat進行定制。
sqoop安裝
安裝sqoop的前提是已經具備java和hadoop的環境。
最新穩定版: 1.4.6
配置文件修改:
cd $SQOOP_HOME/conf
mv sqoop-env-template.sh sqoop-env.sh
vi sqoop-env.sh
export HADOOP_COMMON_HOME=/root/apps/hadoop/
export HADOOP_MAPRED_HOME=/root/apps/hadoop/
export HIVE_HOME=/root/apps/hive
加入mysql的jdbc驅動包
cp /hive/lib/mysql-connector-java-5.1.28.jar $SQOOP_HOME/lib/
驗證啟動
bin/sqoop list-databases --connect jdbc:mysql://localhost:3306/ --username root --password hadoop
本命令會列出所有mysql的數據庫。
到這裏,整個Sqoop安裝工作完成。
2. Sqoop導入
“導入工具”導入單個表從RDBMS到HDFS。表中的每一行被視為HDFS的記錄。所有記錄都存儲為文本文件的文本數據(或者Avro、sequence文件等二進制數據)。
下面的語法用於將數據導入HDFS。
$ sqoop import (generic-args) (import-args)
Sqoop測試表數據
在mysql中創建數據庫userdb,然後執行參考資料中的sql腳本:
創建三張表: emp emp_add emp_conn。
2.1. 導入mysql表數據到HDFS
下面的命令用於從MySQL數據庫服務器中的emp表導入HDFS。
bin/sqoop import \
--connect jdbc:mysql://node-21:3306/sqoopdb \
--username root \
--password hadoop \
--target-dir /sqoopresult \
--table emp --m 1
其中--target-dir可以用來指定導出數據存放至HDFS的目錄;
mysql jdbc url 請使用 ip 地址。
為了驗證在HDFS導入的數據,請使用以下命令查看導入的數據:
hdfs dfs -cat /sqoopresult/part-m-00000
可以看出它會用逗號,分隔emp表的數據和字段。
1201,gopal,manager,50000,TP
1202,manisha,Proof reader,50000,TP
1203,khalil,php dev,30000,AC
1204,prasanth,php dev,30000,AC
1205,kranthi,admin,20000,TP
2.2. 導入mysql表數據到HIVE
將關系型數據的表結構復制到hive中
bin/sqoop create-hive-table \
--connect jdbc:mysql://node-21:3306/sqoopdb \
--table emp_add \
--username root \
--password hadoop \
--hive-table test.emp_add_sp
其中:
--table emp_add為mysql中的數據庫sqoopdb中的表。
--hive-table emp_add_sp 為hive中新建的表名稱。
從關系數據庫導入文件到hive中
bin/sqoop import \
--connect jdbc:mysql://node-21:3306/sqoopdb \
--username root \
--password hadoop \
--table emp_add \
--hive-table test.emp_add_sp \
--hive-import \
--m 1
2.3. 導入表數據子集
--where 可以指定從關系數據庫導入數據時的查詢條件。它執行在各自的數據庫服務器相應的SQL查詢,並將結果存儲在HDFS的目標目錄。
bin/sqoop import \
--connect jdbc:mysql://node-21:3306/sqoopdb \
--username root \
--password hadoop \
--where "city =‘sec-bad‘" \
--target-dir /wherequery \
--table emp_add --m 1
復雜查詢條件:
bin/sqoop import \
--connect jdbc:mysql://node-21:3306/sqoopdb \
--username root \
--password hadoop \
--target-dir /wherequery12 \
--query ‘select id,name,deg from emp WHERE id>1203 and $CONDITIONS‘ \
--split-by id \
--fields-terminated-by ‘\t‘ \
--m 1
2.4. 增量導入
增量導入是僅導入新添加的表中的行的技術。
--check-column (col) 用來作為判斷的列名,如id
--incremental (mode) append:追加,比如對大於last-value指定的值之後的記錄進行追加導入。lastmodified:最後的修改時間,追加last-value指定的日期之後的記錄
--last-value (value) 指定自從上次導入後列的最大值(大於該指定的值),也可以自己設定某一值
假設新添加的數據轉換成emp表如下:
1206, satish p, grp des, 20000, GR
下面的命令用於在EMP表執行增量導入:
bin/sqoop import \
--connect jdbc:mysql://node-21:3306/sqoopdb \
--username root \
--password hadoop \
--table emp --m 1 \
--incremental append \
--check-column id \
--last-value 1205
3. Sqoop導出
將數據從HDFS導出到RDBMS數據庫導出前,目標表必須存在於目標數據庫中。
默認操作是從將文件中的數據使用INSERT語句插入到表中,更新模式下,是生成UPDATE語句更新表數據。
以下是export命令語法:
$ sqoop export (generic-args) (export-args)
3.1. 導出HDFS數據到mysql
數據是在HDFS 中“emp/”目錄的emp_data文件中:
1201,gopal,manager,50000,TP
1202,manisha,preader,50000,TP
1203,kalil,php dev,30000,AC
1204,prasanth,php dev,30000,AC
1205,kranthi,admin,20000,TP
1206,satishp,grpdes,20000,GR
首先需要手動創建mysql中的目標表:
mysql> USE sqoopdb;
mysql> CREATE TABLE employee (
id INT NOT NULL PRIMARY KEY,
name VARCHAR(20),
deg VARCHAR(20),
salary INT,
dept VARCHAR(10));
然後執行導出命令:
bin/sqoop export \
--connect jdbc:mysql://node-21:3306/sqoopdb \
--username root \
--password hadoop \
--table employee \
--export-dir /emp/emp_data
還可以用下面命令指定輸入文件的分隔符
--input-fields-terminated-by ‘\t‘
技術分享圖片

如果運行報錯如下:
則需要把localhost更改為ip或者域名。
示例如下,將點擊流模型表導出到mysql
sqoop export \
--connect jdbc:mysql://hdp-node-01:3306/webdb --username root --password root \
--table click_stream_visit \
--export-dir /user/hive/warehouse/dw_click.db/click_stream_visit/datestr=2013-09-18 \
--input-fields-terminated-by ‘\001‘
<更多表的導出,可參照修改>

大數據模塊開發之結果導出