1. 程式人生 > 其它 >sqoop使用metastore進行增量資料抽取

sqoop使用metastore進行增量資料抽取

我們在sqoop抽取資料,肯定會 遇到這麼個場景,我們肯定會用到一個排程工具來執行sqoop指令碼,這時我們如果想在別的客戶端也能呼叫該sqoop指令碼,那麼我們就需要使用sqoop提供的metastore,metastore它本質是一個hsql記憶體級資料庫,sqoop通過它達到幾個客戶端共享sqoop指令碼的資訊,從而使別的客戶端也能呼叫除自己本身建立的sqoop指令碼。

在使用metastore之前,我們需要選擇一臺機器放置metastore,比如我們選擇master機器

開啟master機器的sqoop-site.xml檔案。 cd $SQOOP_HOME/conf/sqoop-site.xml 加入下面的配置


<property>
<name>sqoop.metastore.server.location</name>
<!--資料存放的目錄-->
<value>/usr/local/sqoop/tmp/sqoop-metastore/shared.db</value>
<description>Path to the shared metastore database files.
If this is not set, it will be placed in ~/.sqoop/.
</description>
</property>

<property>
<name>sqoop.metastore.server.port</name>
<!--client訪問的埠-->
<value>16000</value>
<description>Port that this metastore should listen on.
</description>
</property>
然後再在其他機器的sqoop-site.xml檔案加入下面的配置

<property>
<name>sqoop.metastore.client.autoconnect.url</name>
<value>jdbc:hsqldb:hsql://master:16000/sqoop</value>
</property>
最後在啟動master的metastore sqoop metastore &,啟動成功後,我們能通過jps命令看到一個sqoop應用已經啟動

之後我們就是建立一個sqoop job並將其儲存進metastore裡面。

建立之前我們先在mysql庫裡面建一張測試表

CREATE TABLE `customer` (
`customer_number` int(11) NOT NULL AUTO_INCREMENT COMMENT '客戶編號,主鍵' ,
`customer_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '客戶名稱' ,
`customer_street_address` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '客戶住址' ,
`customer_zip_code` int(11) NULL DEFAULT NULL COMMENT '郵編' ,
`customer_city` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '所在城市' ,
`customer_state` varchar(2) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '所在省份' ,
`times` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP ,
PRIMARY KEY (`customer_number`)
)
ENGINE=MyISAM
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
AUTO_INCREMENT=9
CHECKSUM=0
ROW_FORMAT=DYNAMIC
DELAY_KEY_WRITE=0
;

INSERT INTO `customer` VALUES (1, 'really large customers', '7500 louise dr.', 17050, 'mechanicsburg', 'pa', '2018-10-10 14:48:29');
INSERT INTO `customer` VALUES (2, 'small stores', '2500 woodland st.', 17055, 'pittsburgh', 'pa', '2018-10-10 13:48:35');
INSERT INTO `customer` VALUES (3, 'medium retailers', '1111 ritter rd.', 17055, 'pittsburgh', 'pa', '2018-10-10 10:48:40');
INSERT INTO `customer` VALUES (4, 'good companies', '9500 scott st.', 17050, 'mechanicsburg', 'pa', '2018-10-6 12:48:48');
INSERT INTO `customer` VALUES (5, 'wonderful shops', '3333 rossmoyne rd.', 17050, 'mechanicsburg', 'pa', '2018-10-10 17:48:55');
INSERT INTO `customer` VALUES (6, 'loyal clients', '7070 ritter rd.', 17055, 'pittsburgh', 'pa', '2018-10-2 14:49:00');
INSERT INTO `customer` VALUES (7, 'distinguished partners', '9999 scott st.', 17050, 'mechanicsburg', 'pa', '2018-10-8 14:49:06');
編寫sqoop指令碼

[hdfs@master root]$ sqoop job --create customertest --meta-connect jdbc:hsqldb:hsql://master:16000/sqoop -- import --connect jdbc:mysql://hostname:3306/test --query "select * from customer where \$CONDITIONS" --username root --password root --target-dir /data/customer --check-column customer_number --incremental append --last-value 1 -m 1
該sqoop指令碼我是採用append的方式 來處理增量資料,每次獲得增量資料,我直接另外生成一個小檔案儲存下來,如果是使用lastModify ,那麼增量資料它會根據和並列合併到一個檔案裡面中。

append

–incremental append 基於遞增列的增量匯入(將遞增列值大於閾值的所有資料增量匯入Hadoop)
–check-column 遞增列
–last-value 閾值(int)
lastmodified

–incremental lastmodified 基於時間列的增量匯入(將時間列大於等於閾值的所有資料增量匯入Hadoop)
–check-column 遞增列
–last-value 閾值(int)
–merge-key 合併列(主鍵,合併鍵值相同的記錄)
如果你是lastmodified,那麼就必須有個合併列,同時如果操作的檔案比較大,那麼使用lastmodified就有點慢了,使用append也有個壞處,如果小檔案過多了,會影響外部表讀取資料的資料,所以這個都大家自己去掌握吧。

之後我們使用sqoop job -list來檢視建立的job,我們當時是在master機器上建立的,現在我們可以在segment01機器來檢視 我們之前建立的job

最後在執行這個job

因為我們再每個客戶端的配置檔案中有配置metastore的屬性,所以我們再執行該job時,可以直接省略指定metastore地址的引數。


————————————————
版權宣告:本文為CSDN博主「沉默的迷茫」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處連結及本宣告。
原文連結:https://blog.csdn.net/pttaoge/article/details/83902233