之前工作积累的数据需要到合作伙伴某银行上内部进行部署,中间遇到很多坑,最后都一一解决了,现在把遇到的坑都好好总结一下,以后遇到同样的问题,可作为参考。
数据的导入
1.将mysql数据库操作:
- 把原数据库中的表数据结构导成sql文件
- 把原数据库中的表数据导成.txt文件
- 把load file 的sql 脚本导成sql文件
2.优化mysql的存储配置
[mysqld]
port = 3306
socket = /var/lib/mysql/mysql.sock
#innodb_buffer_pool_size = 2G
#innodb_flush_log_at_trx_commit = 0
lower_case_table_names = 1
innodb_file_per_table = 1
wait_timeout=1800
max_connection=3000
default-storage-engine = innodb
thread_cache_size=64
local-infile = 1
# Change following line if you want to store your database elsewhere
datadir = /var/lib/mysql
skip-external-locking
key_buffer_size = 400M
max_allowed_packet = 1M
table_open_cache = 256
sort_buffer_size = 4M
net_buffer_length = 1M
read_buffer_size = 4M
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 8M
innodb_log_file_size = 500M
innodb_log_buffer_size = 20M
innodb_flush_log_at_trx_commit = 0
innodb_lock_wait_timeout = 50
[safe_mysqld]
log-error = /var/log/mysql/mysqld.log
socket = /var/lib/mysql/mysql.sock
!includedir /etc/mysql
[mysqldump]
socket = /var/lib/mysql/mysql.sock
quick
max_allowed_packet = 16M
[mysql]
local-infile = 1
[myisamchk]
key_buffer_size = 20M
sort_buffer_size = 20M
read_buffer = 2M
write_buffer = 2M
[mysqlhotcopy]
interactive-timeout
ps : 关于mysql的优化配置参照了这边博客http://blog.51cto.com/5434718/1207526
3.使用Load导入.txt数据文件
ps:如果想了解如何操作LOAD DATA的具体操作可以看我的另一篇博客:
环境搭建
1.安装python3环境与依赖包
- 生产环境是SUSE11 企业版,离线内网系统,无法连网操作,意味着只能源码安装
- 在自己电脑的的环境下,预先现在好所有的安装包
关于如何离线安装python环境可以参照这篇博客pip 9.0 离线安装Python3的环境库
- 安装Anacoda 的Linux版本【python3.6版本】,这里要罗嗦两句,原本打算下载python3.4的源码进行安装的,但是离线环境无法用yum安装所需要的依赖环境,安装的python3总是缺少相关依赖包,在折腾了一天无果之后放弃,最终采用这这种方案。
关于如何下载Anacoda的Linux版本可以参见这篇博客 linux下Anaconda的安装
如果sudo vim /etc/profile 编辑时没有权限,就 sudo chmod 755 /etc/profile
- 安装环境所需依赖包。前面已经下载了离线文件packages依赖包和requiements.txt文件,Anacoda里边自带pip,如果缺少那个依赖包,进入到packages目录,直接利用pip install 下载相应的包就可以了。
同步到本地Elasticsearch
1.打开elsaticsearch
2.导入数据,从mysql中提取数据导入ES中
下面是部分代码:
# -*- coding: utf-8 -*-
from datetime import datetime
from elasticsearch import Elasticsearch
import elasticsearch.helpers
import pymysql
import json
def conn():
es = Elasticsearch("http://esaddress:9200/", verify_certs=False,timeout = 60)
db=pymysql.connect(host='localhost',user='root',password='123123',db='dbdb',local_infile=1,charset='utf8')
cursor = db.cursor()
sql = "select * from sm_auction "
cursor.execute(sql)
data = cursor.fetchall()
for dataInfo in data:
#print(dataInfo)
package = []
row = {
"id": dataInfo[1],
"create_by": dataInfo[2],
"create_date": dataInfo[3]
}
# print(row)
package.append(row)
action = [
{
'_op_type': 'index',
'_index': "test",
'_type': "data",
'_source': d
}
for d in package
]
elasticsearch.helpers.bulk(es, action)
print("******"*20)
print("插入elasticsearch成功")
if __name__ == '__main__':
conn()