从零开始实施推荐系统的落地部署——21.推荐系统案例(十一)使用logstash做数据同步
- 导入数据到mysql
从https://github.com/Kidand/dianping-project下载ddl.sql和dml.sql目录/opt/datas,因为mysql是docker的形式安装,要把SQL格式的文档拷贝到mysql的/opt/目录里。
docker cp /opt/datas/ddl.sql zabbix-mysql:/opt/
docker cp /opt/datas/dml.sql zabbix-mysql:/opt/
如图所示在mas5的主机里。
使用命令进入mysql的docker系统里:docker exec -it zabbix-mysql /bin/bash
在登录mysql数据库里,建立数据库dianpingdb。使用source /opt/ddl.sql建表。在进入dianpingdb,使用source /opt/dml.sql导入数据到表中。
2. 使用logstash做数据同步
到官方https://www.elastic.co/cn/downloads/past-releases/logstash-7-6-2下载相对应的logstash包,下载到/opt/elk/并进到其目录里。解压tar -zvxf logstash-7.6.2.tar.gz。进到logstash-7.6.2/bin的目录里建立mysql目录,把mysql-connector-java-5.1.40-bin.jar拷贝到mysql文件夹里。
编辑jdbc.sql和last_value_meta,这两个文件的主要作用是判断是否要做数据更新。
jdbc.conf这个配置文件比较重要。配置如下:
input {
jdbc {
#设置timezone
jdbc_default_timezone => "Asia/Shanghai"
# mysql 数据库链接,dianpingdb为数据库名
jdbc_connection_string => "jdbc:mysql://mas5.wuyi.com:3306/dianpingdb"
# 用户名和密码
jdbc_user => "root"
jdbc_password => "123456"
# 驱动 注意:如果不要下面这行代码,那就要把mysql-connector-java-5.1.40-bin.jar放到/opt/elk/logstash-7.6.2/logstash-core/lib/jars目录里即可。
jdbc_driver_library => "/opt/elk/logstash-7.6.2/bin/mysql/mysql-connector-java-5.1.40-bin.jar"
# 驱动类名
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_paging_enabled => "true"
jdbc_page_size => "50000"
codec => plain{ charset => "UTF-8"}
last_run_metadata_path => "/opt/elk/logstash-7.6.2/bin/mysql/last_value_meta"
# 执行的sql 文件路径+名称;
statement_filepath => "/opt/elk/logstash-7.6.2/bin/mysql/jdbc.sql"
# 设置监听间隔 各字段含义(由左至右)分、时、天、月、年,全部为*默认含义为每分钟都更新
schedule => "* * * * *"
}
}
output {
elasticsearch {
# ES的IP地址及端口
hosts => ["mas2.wuyi.com:9200"]
# 索引名称
index => "shop"
# document_type => "_doc"
# 自增ID 需要关联的数据库中有有一个id字段,对应索引的id号
document_id => "%{id}"
codec => plain{ charset => "UTF-8"}
}
stdout {
# JSON格式输出
codec => json_lines
}
}
配置完成后,使用浏览器打开http://mas2.wuyi.com:5601/app/kibana#/dev_tools/console
建立shop索引,代码如下:
PUT shop
{
"settings" : {
"number_of_shards" : 1,
"number_of_replicas" : 1},
"mappings": {
"properties": {
"id":{
"type":"integer"},
"name":{
"type":"text",
"analyzer": "ik_max_word",
"search_analyzer":"ik_smart"},
"tags":{
"type":"text",
"analyzer": "whitespace",
"fielddata":true},
"location":{
"type":"geo_point"},
"remark_score":{
"type":"double"},
"price_per_man":{
"type":"integer"},
"category_id":{
"type":"integer"},
"category_name":{
"type":"keyword"},
"seller_id":{
"type":"integer"},
"seller_remark_score":{
"type":"double"},
"seller_disabled_flag":{
"type":"integer"}
}
}
}
运行后,获取的结果和右图所示一样,说明创建shop索引成功。
使用命令执行./logstash -f mysql/jdbc.conf
虽然执行成功,但是中文出现乱码。即使在jdbc.conf添加input和output都添加codec => plain{ charset => "UTF-8"}还是出现乱码。如图所示:
在http://mas2.wuyi.com:5601/app/kibana#/dev_tools/console使用GET /shop/_search查询全表,还是乱码。
经多次排查,有可能是之前mysql的编码没弄好出现的问题,进入docker版的mysql,使用show variables like 'character%';查出character_set_client的值为latin1,使用set names utf8;命令把character的值都变为utf8,但是重启docker生效后,character的值有变回到latin1。
因为这个mysql配置的数据库太多了,有hue,hive, zabbix。暂时不想弄这个mysql。明天再重新配置一个mysql再做测试。
这次排查乱码的原因,一直以为是logstash的问题,浪费了很多时间,同时也发现了我对logstash还不熟悉,要多花点时间去学习logstash。
- 点赞
- 收藏
- 关注作者
评论(0)