使用StreamSets從MySQL增量更新資料到Hive
使用StreamSets從MySQL增量更新資料到Hive
我們可以StreamSets實現資料採集,在實際生產中需要批量、實時捕獲MySQL、Oracle等資料來源的變化資料並將其寫入大資料平臺的Hive等。這裡主要介紹如何使用StreamSets通過JDBC方式實時從MySQL抽取資料到Hive。
StreamSets實現的流程如下:
大致的流程如下:
- Reads data from a JDBC source using a query
- Generates Hive metadata and write information fo HDFS
- Updates the Hive Metastore。通俗的講就是在目標庫中建立表。
- 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可能也需要做此操作。
- 配置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
- 修改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>
- 重啟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