教育行業(yè)A股IPO第一股(股票代碼 003032)

全國咨詢/投訴熱線:400-618-4000

大數(shù)據(jù)離線階段我們應(yīng)該學(xué)習(xí)的是模塊開發(fā)的結(jié)果導(dǎo)出

更新時(shí)間:2018年11月16日15時(shí)40分 來源:傳智播客 瀏覽次數(shù):

Apache Sqoop
Sqoop是Hadoop和關(guān)系數(shù)據(jù)庫服務(wù)器之間傳送數(shù)據(jù)的一種工具。它是用來從關(guān)系數(shù)據(jù)庫如:MySQL,Oracle到Hadoop的HDFS,并從Hadoop的文件系統(tǒng)導(dǎo)出數(shù)據(jù)到關(guān)系數(shù)據(jù)庫。由Apache軟件基金會(huì)提供。
Sqoop:“SQL 到 Hadoop 和 Hadoop 到SQL”。
 

Sqoop工作機(jī)制是將導(dǎo)入或?qū)С雒罘g成mapreduce程序來實(shí)現(xiàn)。
在翻譯出的mapreduce中主要是對(duì)inputformat和outputformat進(jìn)行定制。
sqoop安裝
安裝sqoop的前提是已經(jīng)具備java和hadoop的環(huán)境。
新穩(wěn)定版: 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驅(qū)動(dòng)包
cp  /hive/lib/mysql-connector-java-5.1.28.jar   $SQOOP_HOME/lib/
驗(yàn)證啟動(dòng)
bin/sqoop list-databases --connect jdbc:mysql://localhost:3306/ --username root --password hadoop
本命令會(huì)列出所有mysql的數(shù)據(jù)庫。
到這里,整個(gè)Sqoop安裝工作完成。
2. Sqoop導(dǎo)入
“導(dǎo)入工具”導(dǎo)入單個(gè)表從RDBMS到HDFS。表中的每一行被視為HDFS的記錄。所有記錄都存儲(chǔ)為文本文件的文本數(shù)據(jù)(或者Avro、sequence文件等二進(jìn)制數(shù)據(jù))。
下面的語法用于將數(shù)據(jù)導(dǎo)入HDFS。
$ sqoop import (generic-args) (import-args)
Sqoop測(cè)試表數(shù)據(jù)
在mysql中創(chuàng)建數(shù)據(jù)庫userdb,然后執(zhí)行參考資料中的sql腳本:
創(chuàng)建三張表: emp  emp_add emp_conn。  
2.1. 導(dǎo)入mysql表數(shù)據(jù)到HDFS
下面的命令用于從MySQL數(shù)據(jù)庫服務(wù)器中的emp表導(dǎo)入HDFS。
bin/sqoop import \
--connect jdbc:mysql://node-21:3306/sqoopdb \
--username root \
--password hadoop \
--target-dir /sqoopresult \
--table emp --m 1
其中--target-dir可以用來指定導(dǎo)出數(shù)據(jù)存放至HDFS的目錄;
mysql jdbc url 請(qǐng)使用 ip 地址。
為了驗(yàn)證在HDFS導(dǎo)入的數(shù)據(jù),請(qǐng)使用以下命令查看導(dǎo)入的數(shù)據(jù):
hdfs dfs -cat /sqoopresult/part-m-00000
可以看出它會(huì)用逗號(hào),分隔emp表的數(shù)據(jù)和字段。
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. 導(dǎo)入mysql表數(shù)據(jù)到HIVE
將關(guān)系型數(shù)據(jù)的表結(jié)構(gòu)復(fù)制到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中的數(shù)據(jù)庫sqoopdb中的表。   
--hive-table emp_add_sp 為hive中新建的表名稱。
從關(guān)系數(shù)據(jù)庫導(dǎo)入文件到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. 導(dǎo)入表數(shù)據(jù)子集
--where        可以指定從關(guān)系數(shù)據(jù)庫導(dǎo)入數(shù)據(jù)時(shí)的查詢條件。它執(zhí)行在各自的數(shù)據(jù)庫服務(wù)器相應(yīng)的SQL查詢,并將結(jié)果存儲(chǔ)在HDFS的目標(biāo)目錄。
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
復(fù)雜查詢條件:
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. 增量導(dǎo)入
增量導(dǎo)入是僅導(dǎo)入新添加的表中的行的技術(shù)。
--check-column (col)        用來作為判斷的列名,如id
--incremental (mode)        append:追加,比如對(duì)大于last-value指定的值之后的記錄進(jìn)行追加導(dǎo)入。lastmodified:最后的修改時(shí)間,追加last-value指定的日期之后的記錄
--last-value (value)        指定自從上次導(dǎo)入后列的最大值(大于該指定的值),也可以自己設(shè)定某一值
假設(shè)新添加的數(shù)據(jù)轉(zhuǎn)換成emp表如下:
1206, satish p, grp des, 20000, GR
下面的命令用于在EMP表執(zhí)行增量導(dǎo)入:
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導(dǎo)出
將數(shù)據(jù)從HDFS導(dǎo)出到RDBMS數(shù)據(jù)庫導(dǎo)出前,目標(biāo)表必須存在于目標(biāo)數(shù)據(jù)庫中。
默認(rèn)操作是從將文件中的數(shù)據(jù)使用INSERT語句插入到表中,更新模式下,是生成UPDATE語句更新表數(shù)據(jù)。
以下是export命令語法:
$ sqoop export (generic-args) (export-args)
3.1. 導(dǎo)出HDFS數(shù)據(jù)到mysql
數(shù)據(jù)是在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
首先需要手動(dòng)創(chuàng)建mysql中的目標(biāo)表:
mysql> USE sqoopdb;
mysql> CREATE TABLE employee (
   id INT NOT NULL PRIMARY KEY,
   name VARCHAR(20),
   deg VARCHAR(20),
   salary INT,
   dept VARCHAR(10));
然后執(zhí)行導(dǎo)出命令:
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'

如果運(yùn)行報(bào)錯(cuò)如下:

則需要把localhost更改為ip或者域名。
示例如下,將點(diǎn)擊流模型表導(dǎo)出到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'

作者:傳智播客云計(jì)算大數(shù)據(jù)培訓(xùn)學(xué)院
首發(fā):http://cloud.itcast.cn/

0 分享到:
和我們?cè)诰€交談!