使用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’
可以看到数据就可以了。

发布了78 篇原创文章 · 获赞 7 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/yao09605/article/details/104115334