使用streamsets實現mysql到hbase的實時數據流同步

streamsets的下載流程:(我建議下載full版本的)
https://blog.csdn.net/yao09605/article/details/104098797
streamsets的同步過程全程是無代碼的
下面我介紹整個流程,以及我遇到的坑和排坑方法

下載完之後我們照例直接解壓,放到srv目錄下,然後更改權限,編輯.bashrc 增加一個STREAMSETS_HOME
這裏簡單寫一下

$ tar -xvf streamsets-datacollector-all-3.13.0.tgz
$ sudo cp streamsets-datacollector-3.13.0 /srv/
$ sudo chown -R hadoop:hadoop /srv/streamsets-datacollector-3.13.0
$ sudo ln -s /srv/streamsets-datacollector-3.13.0 /srv/streamsets
$ vim ~/.bashrc
# .bashrc 增加
export STREAMSETS_HOME=/srv/streamsets
export PATH=$PATH:$STREAMSETS_HOME/bin

$ source ~/.bashrc

啓動streamsets

$ streamsets dc

此時可能遇到的報錯:

Java 1.8 detected; adding $SDC_JAVA8_OPTS of “-XX:+UseConcMarkSweepGC -XX:+UseParNewGC -Djdk.nio.maxCachedBufferSize=262144” to $SDC_JAVA_OPTS
Configuration of maximum open file limit is too low: 1024 (expected at least 32768). Please consult https://goo.gl/6dmjXd

這個是因爲系統默認同時打開文件數1024過小,我們需要設置
網上查了幾個方法,好像都沒有用
我使用的方式是進入root

$ su
root@yaochenli-VirtualBox:/etc# ulimit -n 63553
root@yaochenli-VirtualBox:/etc# su hadoop

切換回原來的用戶就能順利開啓streamsets dc 服務了

在瀏覽器中輸入:http://localhost:18630/
這個是streamsets的管理頁面
進入後密碼和用戶名都是admin

進入之後可以新建一個pipeline,我這裏已經新建好一個了
在這裏插入圖片描述這裏新建一個tutorial演示
在這裏插入圖片描述選擇origin就是你的原系統
我們選擇mysql的binlog
在這裏插入圖片描述然後會出現兩個選項,一個是選擇中間處理件或者選擇目標系統,中間件可以做一些篩選工作,然後目標系統就是你要把數據導到哪裏。
我們看我做好的這個例子:
在這裏插入圖片描述然後重點就是這三個組件的配置
首先是mysql
這一頁沒什麼重點,隨便填
在這裏插入圖片描述這裏注意serverID不能和你mysql裏面my.cnf文件裏的server_id重複,不然運行時候會報錯
在這裏插入圖片描述這裏注意必須是root用戶,mysql的root用戶初始是沒有密碼的,如果不知道怎麼給root用戶設置密碼請看這個鏈接https://blog.csdn.net/yao09605/article/details/104101433
在這裏插入圖片描述這裏可以設置你要監控的表明,格式是[DATABASE].[TABLE],其餘參數根據需要設置。
在這裏插入圖片描述中間件我們不做任何處理,這裏不展示配置了。
下面是hbase的配置:
這裏要注意的是CDH的版本也就是hbase client的版本要和你hbase服務的版本一致,不一致會報錯的,這也是我爲什麼推薦下載full版本,這樣你很簡單的試驗幾個選項而不用重複去下載。
在這裏插入圖片描述這裏要注意的點是源系統數據格式要寫成/Data/XXX的形式,目標的column格式是【列族:列名】如果沒有列名,列族之後也要加冒號。
其他大家看那個問好裏的提示吧。
在這裏插入圖片描述在這裏插入圖片描述這邊配置準備完成之後,我們需要在兩邊系統裏建好表。

 CREATE TABLE `STOCK` (
  `time` text,
  `price` double DEFAULT NULL,
  `change` double DEFAULT NULL,
  `volume` bigint(20) DEFAULT NULL,
  `amount` bigint(20) DEFAULT NULL,
  `type` text
) 

首先把hadoop和hbase啓動起來

$ start-dfs.sh
$ start-yarn.sh
$ start-hbase.sh
$ jps

如果你看到下面這些服務在運行,那麼就沒有問題了

10400 Jps
9600 HRegionServer
3812 SecondaryNameNode
3557 DataNode
4007 ResourceManager
4168 NodeManager
4618 BootstrapMain
9468 HMaster
9405 HQuorumPeer
3390 NameNode

在hbase那邊也建表:

# 有可能不對,僅供參考
create 'stock','time','amount','change','price','type','volume'

兩邊建表好了之後就可以測試一下通路了
點擊右上角的小眼睛
在這裏插入圖片描述可能遇到的問題呢除了剛剛說的用戶必須是root之外,你有可能沒有打開binlog,如何查看呢
進入mysql的shell

mysql> show variables like 'log_bin%';
+---------------------------------+-----------------------------+
| Variable_name                   | Value                       |
+---------------------------------+-----------------------------+
| log_bin                         | ON                          |
| log_bin_basename                | /var/log/mysql/binlog       |
| log_bin_index                   | /var/log/mysql/binlog.index |
| log_bin_trust_function_creators | OFF                         |
| log_bin_use_v1_row_events       | OFF                         |
+---------------------------------+-----------------------------+
5 rows in set (0.01 sec)

看下自己的log_bin是否打開了
如果沒有打開,那麼打開他的方法如下:

$ sudo vim /etc/mysql/my.cnf
my.cnf

!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/
#bin log
[mysqld]
log_bin=mysql_bin
binlog_format=ROW
server_id=100
log-bin=/var/log/mysql/binlog

增加上面的配置後,重啓服務,或者你的電腦。
再檢查一下應該就打開了
你的這個binlog文件就在/var/log/mysql目錄下。

root@yaochenli-VirtualBox:/var/log/mysql# ls
binlog         binlog.000002  binlog.index  error.log.1.gz  error.log.3.gz  error.log.5.gz  error.log.7.gz
binlog.000001  binlog.000003  error.log     error.log.2.gz  error.log.4.gz  error.log.6.gz  product-bin.index

如果還是提示沒有binlog的話,就往mysql裏面插點東西,生成個文件。

應該沒有別的坑了,我們點擊run啓動服務。然後,我們寫個小程序往mysql裏面插入數據:

#股票分筆數據
import tushare as ts
import pymysql
from sqlalchemy import create_engine
df = ts.get_tick_data('600848',date='2018-12-12',src='tt')
engine = create_engine('mysql+pymysql://hive:[email protected]:3306/STOCK?charset=utf8mb4')
con = engine.connect()
# 這裏ubuntu下面給mysql輸入中文有點問題,最後就放棄中文了。
df = df.replace('買盤',0)
df = df.replace('賣盤',1)
df = df.replace('中性盤',2)
df.to_sql(name='STOCK', con=con, if_exists='append', index=False)

運行之後我們可以看到儀表盤有數據了,
然後去hbase檢查
hbase(main):001:0> scan ‘stock’
可以看到數據就可以了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章