1. 程式人生 > 資料庫 >使用StreamSets從MySQL增量更新資料到Hive

使用StreamSets從MySQL增量更新資料到Hive

使用StreamSets從MySQL增量更新資料到Hive

我們可以StreamSets實現資料採集,在實際生產中需要批量、實時捕獲MySQL、Oracle等資料來源的變化資料並將其寫入大資料平臺的Hive等。這裡主要介紹如何使用StreamSets通過JDBC方式實時從MySQL抽取資料到Hive。

StreamSets實現的流程如下:

 

 

 大致的流程如下:

  1. Reads data from a JDBC source using a query
  2. Generates Hive metadata and write information fo HDFS
  3. Updates the Hive Metastore。通俗的講就是在目標庫中建立表。
  4. Writes to a Hadoop file system。通俗的講就是把資料寫入到目標庫的表中。

用到的各元件介紹:

這裡除了看元件名稱,也注意右上角的字母,有的元件圖示很相似,但是功能是不一樣的,要選擇合適的元件。

第一個元件source, 如下圖, Source是JDBC Query Consumer,看其註釋:Reads data from a JDBC source using a query,可以知道是從資料庫讀取資料。

 

 

 

中間的元件,如下圖,Hive Metadata,註釋:Generates Hive metadata and write information fo HDFS。作用是根據源資料來產生相應的目標資料庫的metadata和寫入HDFS的需要的資訊。

 

 

兩個目標元件如下圖:

目標元件一:Hadoop FS,註釋:Writes to a Hadoop file system,是將資料寫到HDFS,通俗的講就是把data寫入硬碟或者說Hive表。

目標元件二:Hive Metastore,註釋:Updates the Hive Metastore,是將medata寫入Hive,通俗的講就是建立Hive表。

 

準備StreamSets。

下載StreamSets,一定要下載all版本,大概5.6G,迅雷一晚上下載完。Core版本不包含有些元件,安裝不上。

修改最大開啟檔案數

使用ulimit -a 可以檢視當前系統的所有限制值,使用ulimit -n 可以檢視當前的最大開啟檔案數。新裝的linux預設只有1024,當作負載較大的伺服器時,很容易遇到error: too many open files或者Configuration of maximum open file limit is too low: 1024。因此,需要將其改大。

使用 ulimit -n 65535 可即時修改,但重啟後就無效了。

臨時修改:

ulimit -n

ulimit -n 65535

永久修改:

echo ulimit -n 65535 >>/etc/profile

source /etc/profile

解壓啟動StreamSets。直接解壓即可。

tar zxvf streamsets-datacollector-core-3.19.0.tgz

cd /home/cg/streamsets/

bin/streamsets dc

登入。預設埠18630,原始使用者名稱和祕密均是admin.目前只有251上的streamsets能解密並且寫入hive,以此為例。

admin/admin

準備源資料庫的表及資料。注意:因為要做增量測試,也就是隨時需要向源MySQL中增加資料。

建立表:

drop table streamsetstest;

CREATE TABLE streamsetstest (

  id int auto_increment,

  no_encrypt varchar(255)   NULL,

  a nvarchar(255)   NULL,

  primary key (id)

);

插入資料:

INSERT INTO streamsetstest (no_encrypt,a) VALUES('BWP018930705', 'BWP018930705');

 

建立Pipeline.

建立一個Pipeline,依次建立所需要的元件,每次保證建立的元件能夠連通。

New Pipeline.

登入,點選Create New Pipeline

填寫Error Records相關的資訊

寫入Error Records的方式見下圖:

 

寫入Error Records的位置見下圖:

 

 

 

建立源元件

我們需要從MySQL或者Oracle中通過JDBC讀取資料。可以根據圖示和註釋來選擇合適的元件。

選擇JDBC Query Consumer。如果

 

這能找到,就這麼選擇JDBC Query Consumer

如果找不到,就Stage選JDBC,找到JDBC Query Consumer

 

 

配置JDBC Query Consumer。

JDBC Connection String,如圖,跟通常連JDBC的URL一致,無區別。如果是咱們的AOE,也是一樣的。注意中間有個AOE。

SQL Query: 有預設的模板,需要將table名稱改成具體的名稱,where雖然能改成<,但是我們只有要測增量,所以最好還是>。注意和Initial Offset、Offset column值得對應關係。

Credential Tab裡的配置,輸入使用者名稱和密碼,無特別需要注意的地方。

JDBC Tab配置如下圖:

 

對於常見的MySQL等JDBC連線,我們也不需要做額外的工作,streamsets會自動識別driver class。但是對於咱們的AOE,需要check上Show Advanced Options,在Legacy DriversTab中

JDBC Driver Class Name:

com.ciphergateway.aoe.plugin.engine.AOEDriver

圖如下:

 

這個源元件配置完畢之後,點選Preview按鈕,看看什麼地方有錯誤

Preview按鈕如下圖。

 

如果配置有錯,streamsets會提示,根據提示找到相應的配置項改過來。如果配置沒有錯,就能看到下圖中顯示輸出的資料。確定沒錯之後,退出Preview模式即可。

 

streamsets預設的JDBC lib裡並不含有MySQL的jdbc driver檔案mysql.jar,我們需要點選Install External Libraries來新增需要的driver。我們的AOE可能也需要做此操作。

 

 

  1. 配置Hive Metadata元件。

這個元件的作用是Generates Hive metadata and write information fo HDFS。各個Tab裡的配置會在下邊說明。

General:對於整個流程裡涉及到的三個Hive相關的元件的Stage Library要選一樣的,其他的不用管了。

General Tab配置如下圖

 

 

Hive Tab:

JDBC URL,這個沒特別需要注意的地方

jdbc:hive2://10.1.1.251:10000

JDBC Driver Name,也沒啥需要特別注意的地方。

org.apache.hive.jdbc.HiveDriver

Use Credentials,這個依賴於Hive本身的配置,如果不需要使用者密碼,就不用填。如果需要就填上。至於怎麼配置hive可以遠端匿名訪問,可以在網上查,或者見後邊的附錄。

Hadoop Configuration Directory,這個需要特別注意,這是存放core-site.xml  hdfs-site.xml  hive-site.xml的配置檔案目錄。我們會直覺的認為這是hadoop伺服器上的directory,實際上不是。我們需要在StreamSets伺服器所在的那臺機器上建立一個目錄,然後從Hadoop那臺機器下載那幾個檔案,放在這個目錄裡。

Hive Tab配置如下圖

 

 

Table Tab:

Database Expression:無特別需要注意的地方。這個應該是hive已經存在的資料庫名稱。

Table Name: 這個不需要在資料庫中手動建立此表。如果整個流程沒有問題,會自動建立這個表。咱們可以寫任何我們想要的表名稱。

Partition Configuration: 這裡我們不需要分表儲存,所以刪掉,不用配置此項。

Table Tab配置如下圖:

 

Data Format Tab:

Data Format:選Avro即可。無特別需要注意的地方。

 

新增目標元件一:Hadoop FS,註釋:Writes to a Hadoop file system,是將資料寫到HDFS。通俗的講就是把data寫入。

Connection Tab:

File System URI,

hdfs://10.1.1.251:9000

這個值可以從core-site.xml裡找。

<property>

    <name>fs.defaultFS</name>

    <value>hdfs://10.1.1.251:9000</value>

</property>

Connection Tab 配置如下:

 

Output Files Tab:

也是需要Show Advanced Options,注意

check上Directory in Header

修改Idle Timeout,預設的可能是1小時,導致長時間沒有寫入到Hive。

Output Files Tab配置如下圖:

 

Data Format如下圖所示選擇即可:

 

 

新增目標元件二:Hive Metastore,註釋:Updates the Hive Metastore,是將medata寫入Hive,通俗的講就是建立Hive表。

整個元件的配置也沒有特別需要說明的地方,一些配置從上個Hive Metastore元件copy過來就行。

 

結果驗證

SELECT * FROM atest WHERE id > 1 ORDER BY id

 

遇到的問題及解決方法

l  -9000: Connect to KMS failed

116和117上的環境一直找不到原因,放棄了,後來移動到251,也遇到相同的問題,劉騰幫忙看了,確定是網路的原因。後來成功在251上解密寫入Hive。

tcpdump -i eno2 -s 0 -w aaa.pcap

/home/cg/streamsets/streamsets-libs-extras/streamsets-datacollector-jdbc-lib/lib/

l  遠端匿名訪問10.1.1.251 上的hive

  1. 修改core-site.xml加上以下部分,然後重啟Hadoop。

遠端匿名訪問Hive,會直接以root使用者訪問Hive。

<property>

    <name>hadoop.proxyuser.root.hosts</name>

    <value>*</value>

</property>

<property>

    <name>hadoop.proxyuser.root.groups</name>

    <value>*</value>

</property>

 

<property>

    <name>hadoop.proxyuser.sdc.hosts</name>

    <value>*</value>

</property>

<property>

    <name>hadoop.proxyuser.sdc.groups</name>

    <value>*</value>

</property>

  1. 重啟Hadoop

cd /usr/local/hadoop-2.10.1/

sbin/stop-all.sh

sbin/stop-all.sh

 

l  將資料寫入表時遇到如下錯誤

Permission denied: user=anonymous, access=WRITE, inode="/hive/warehouse":root:supergroup:drwxr-xr-x

       at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.check(FSPermissionChecker.java:3

原因是許可權問題,根據錯誤提示,開放相應目錄許可權。

hadoop dfs -chmod -R 777 /hive/warehouse

hadoop dfs -chmod -R 777 /tmp/hadoop-yarn