写在前面
近日网上各论坛,Q群对于 QQ 8亿数据、微博5亿数据讨论的很多,不管有没有用,很多人都把数据下载下来了。但对于庞大的数据,却又不知道怎么用。就算是在 EmEditor (超大文件编辑器)中打开查询起来也非常慢,这里简单给大家分享一下方法。
准备一台 Linux 系统的机器,用来存储数据硬盘需要比较大一些,硬盘 100G 以上。也可以购买公有云的 ES 服务,比如腾讯云有一款新用户免费 30 天的试用款,可以直接买来测试学习。
再准备一台 Linux 系统的机器,用来将数据处理写入到存储机上,当然你两台放一起也可以,性能可能没有两台好。
其次要保证,两台机器之间的网络速度要通畅,尽可能的在这方面减少损耗。
※ 因仅用于技术交流分享,本文不提供资源文件下载。
※ 因仅用于技术交流分享,本文不提供任何现成脚本文件。
安装 Elasticsearch
首先从官网下载Linux,在存储机上安装 ES.
安装路径为:/usr/local/elasticsearch
存储路径为:/mnt/hd1/es
没有则先创建:
mkdir /mnt/hd1/es/data -p
mkdir /mnt/hd1/es/logs -p
下载解压 elasticsearch
cd /usr/local
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.10.1-linux-x86_64.tar.gz
tar -xzf elasticsearch-7.10.1-linux-x86_64.tar.gz
mv elasticsearch-* elasticsearch
cd elasticsearch
执行用户
elasticsearch 执行需要在非root用户上,这里创建一个低级权限用户名为 es:
useradd es
虚拟内存
如果你在内存非常小的机器上试用时,ES需要相对大点的内存,比如 2G 以上。你就不得不开启 swap 虚拟交换内存,在此忽略此项。
如果物理内存满足的情况下,建议直接关闭 swap ,避免影响es的的性能处理速度。
swapoff -a
max_map_count
根据官方推荐,我们优化 max_map_count 参数 (https://www.elastic.co/guide/cn/elasticsearch/guide/current/_file_descriptors_and_mmap.html)
Elasticsearch 对各种文件混合使用了 NioFs( 注:非阻塞文件系统)和 MMapFs ( 注:内存映射文件系统)。请确保你配置的最大映射数量,以便有足够的虚拟内存可用于 mmapped 文件。这可以暂时设置:
编辑文件:/etc/sysctl.conf
修改或加入 vm.max_map_count=655360
执行 sysctl -p 使之生效
文件句柄
通过修改系统的句柄限制,来让 elasticsearch 支持更多同时处理能力。
编辑文件:vi /etc/security/limits.conf
es soft nofile 100001
es hard nofile 100002
es soft memlock unlimited
es hard memlock unlimited
其中的 es 为上面创建的 elasticsearch 执行用户。
JVM内存
修改承载 elasticsearch 的 JAVA 虚拟机内存。
vi config/jvm.options
建议最小填写为 2G,不够 swap 来凑(非高性能SSD建议就别开了),曾经尝试512M小鸡,经常会报内存不够无法处理,所以如果是小鸡不建议玩,或者一点点细水长流的慢慢写入?
虚拟机的话,建议物理内存3G以上,这里填写2G,一定是小于物理机的内存的。
-Xms2g
-Xmx2g
elasticsearch 配置
修改配置文件:
vi config/elasticsearch.yml
打开基础常见选项:
# 节点名称
node.name: node-1
# 指定数据存储目录
path.data: /mnt/hd1/es/data
# 指定日志存储目录
path.logs: /mnt/hd1/es/logs
# 指定IP地址
network.host: 192.168.1.112
# 指定端口
http.port: 9200
# 指定主节点
cluster.initial_master_nodes: ["node-1"]
赋值权限
chown es:es /usr/local/elasticsearch
chown es:es /mnt/hd1/es
chmod -R 775 /usr/local/elasticsearch
chmod -R 775 /mnt/hd1/es
运行ES
su - es -c '/usr/local/elasticsearch/bin/elasticsearch -d'
查看ES状态
# curl http://192.168.1.112:9200/_cat/nodes?pretty
192.168.1.112 56 97 63 2.25 4.18 7.11 cdhilmrstw * node-1
# curl http://192.168.1.112:9200/
{
"name" : "node-1",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "3oQSlikKS0qAn8dNXOcXtA",
"version" : {
"number" : "7.10.1",
"build_flavor" : "default",
"build_type" : "tar",
"build_hash" : "1c34507e66d7db1211f66f3513706fdf548736aa",
"build_date" : "2020-12-05T01:00:33.671820Z",
"build_snapshot" : false,
"lucene_version" : "8.7.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
安装 Kibana
照例,从官网下载并安装 kibana。
cd /usr/local
wget https://artifacts.elastic.co/downloads/kibana/kibana-7.10.1-linux-x86_64.tar.gz
tar -xzf kibana-7.10.1-linux-x86_64.tar.gz
mv kibana-* kibana
cd kibana
配置文件
修改配置
vi config/kibana.yml
打开基础选项
# kibana 监听端口
server.port: 5601
# 监听的 host 地址
server.host: "192.168.1.112"
# 服务器名称
server.name: "kibana-server"
# 配置 ES 的地址
elasticsearch.hosts: ["http://192.168.1.112:9200"]
# kibana 日志记录文件
logging.dest: /var/log/kibana.log
赋值权限
给予 kibana 运行目录及日志文件权限。
chown -R es:es /usr/local/kibana
chmod -R 775 /usr/local/kibana
chmod 777 /var/log/kibana.log
运行 kibana
su - es -c '/usr/local/kibana/bin/kibana serve>/dev/null 2>&1 &'
稍等片刻你就可以通过浏览器打开 kibana 界面了。
http://192.168.1.112:5601/app/management/data/index_management/indices
创建索引
根据现数据文件,在 es 中创建我们需要的索引库。
创建Q绑索引
Q绑文件我们可以通过 editor 打开,里面有两个字段,一个是QQ号码,一个是手机号。
PUT /qq
{
"mappings" : {
"properties" : {
"qq" : {
"type" : "keyword"
},
"phone" : {
"type" : "keyword"
}
}
},
"settings" : {
"index" : {
"number_of_shards" : 3,
"number_of_replicas" : 0
}
}
}
创建微博索引
PUT /weibo
{
"mappings" : {
"properties" : {
"phone" : {
"type" : "keyword"
},
"uid" : {
"type" : "keyword"
}
}
},
"settings" : {
"index" : {
"number_of_shards" : 3,
"number_of_replicas" : 0
}
}
}
关闭索引刷新
在入库时,关闭索引刷新,可以让 es 写入速度更高。
PUT /weibo/_settings
{ "refresh_interval": "-1" }
PUT /qq/_settings
{ "refresh_interval": "-1" }
打开索引刷新
在数据写入完毕后,再打开索引刷新,这样就可以查询数据了。
PUT /weibo/_settings
{ "refresh_interval": "10s" }
PUT /qq/_settings
{ "refresh_interval": "10s" }
写入数据到ES
这里你需要自己写一个程序将数据从文件读读入并写入到 es中,不提供写入源码,只提供写入请求体参考:
QQ入库:
{
"index": "qq",
"body": [
{
"index": {
"_index": "qq"
}
},
{
"qq": "12345",
"phone": "15222222222"
},
{
"index": {
"_index": "qq"
}
},
{
"qq": "10001",
"phone": "15522210101"
}
]
}
微博入库:
{
"index": "weibo",
"body": [
{
"index": {
"_index": "weibo"
}
},
{
"uid": "3057540037",
"phone": "18999999999"
},
{
"index": {
"_index": "weibo"
}
},
{
"uid": "5263746550",
"phone": "13000000000"
}
]
}
查询 QQ绑定数据
根据 QQ 查询绑定手机号:
GET /qq/_search
{
"query": {
"match": {
"qq": "10001"
}
}
}
根据手机号查询所属 QQ 号:
GET /qq/_search
{
"query": {
"match": {
"phone": "13600000000"
}
}
}
查询微博绑定数据
根据微博uid查询绑定手机号:
GET /weibo/_search
{
"query": {
"match": {
"uid": "3057540037"
}
}
}
根据手机号查询微博uid:
GET /weibo/_search
{
"query": {
"match": {
"phone": "13800002595"
}
}
}