gitweixin
  • 首页
  • 小程序代码
    • 资讯读书
    • 工具类
    • O2O
    • 地图定位
    • 社交
    • 行业软件
    • 电商类
    • 互联网类
    • 企业类
    • UI控件
  • 大数据开发
    • Hadoop
    • Spark
    • Hbase
    • Elasticsearch
    • Kafka
    • Flink
    • 数据仓库
    • 数据挖掘
    • flume
    • Kafka
    • Hive
    • shardingsphere
    • solr
  • 开发博客
    • Android
    • php
    • python
    • 运维
    • 技术架构
    • 数据库
  • 程序员网赚
  • bug清单
  • 量化投资
  • 在线查询工具
    • 去行号
    • 在线时间戳转换工具
    • 免费图片批量修改尺寸在线工具
    • SVG转JPG在线工具
    • SVG转PDF/Word
    • SVG转Draw.io可二次编辑格式
    • js代码混淆

Elasticsearch查询性能调优

精品微信小程序开发门户,代码全部亲测可用

  • 首页   /  
  • 作者: east
  • ( 页面74 )
Elasticsearch 8月 31,2020

Elasticsearch查询性能调优

查询语句优化

查询语句优化的内容包括:查询范围,单次查询数量等。

  1. 根据实际业务需求去规划查询范围,查询越少的字段越快,过大的查询范围不仅会导致查询效率低,而且会使Elasticsearch集群资源耗费急剧增加,甚至可能造成集群崩溃。通过_source参数可以控制返回字段信息,尽量避免读取大字段;
  2. 单次查询数量限制是为了保证内存不会被查询内存大量占用,Elasticsearch默认的查询请求通常返回排序后的前10条记录,最多一次读取10000条记录。通过from和size参数控制读取记录范围,避免一次读取过多的记录。一次性查询大于10000条的数据,使用scroll查询,请参考3.7.6。

安全模式下查询示例:

curl -XGET --tlsv1.2 --negotiate -k -v -u : "https://ip:httpport/myindex-001/_search?pretty"  -H 'Content-Type: application/json' -d' 
{
  "from": 0,
  "size": 10,
  "_source": "age",
  "query": {
      "match": {
        "age": "56"
      }
  },
  "sort": [
    {
      "age": {
        "order": "asc"
      }
    }
  ]
}'

强制段合并(force merge)

每个shard是基于多个segment组成创建的,segment的个数的减少可以大幅的提高查询的速度,定时的进行手动索引段合并,可以提高查询速度。支持单索引和多索引批量操作。

单索引安全模式下示例:

curl -XPOST --tlsv1.2 --negotiate -k -v -u : 'https://ip:httpport/myindex-001/_forcemerge?only_expunge_deletes=false&max_num_segments=1&flush=true&pretty'

多索引安全模式下示例:

curl -XPOST --tlsv1.2 --negotiate -k -v -u : 'https://ip:httpport/myindex-001,myindex-002/_forcemerge?only_expunge_deletes=false&max_num_segments=1&flush=true&pretty'
curl -XPOST --tlsv1.2 --negotiate -k -v -u : 'https://ip:httpport/_all/_forcemerge?only_expunge_deletes=false&max_num_segments=1&flush=true&pretty'

说明:

max_num_segments:merge到多少个segments,1的意思是强行merge到1个segment;

only_expunge_deletes:只清理有deleted标记的segments,推荐值false;

flush:清理完执行一下flush,默认是true。

过滤查询(filter)

Elasticsearch的查询操作分为2种:查询(query)和过滤(filter),查询(query)默认会计算每个返回文档的得分,然后根据得分排序;而过滤(filter)只会筛选出符合的文档,并不计算得分,且可以缓存文档。

对于非全文检索的使用场景,如果不关心查询结果和查询条件的相关度,只是想查找目标数据,可以使用filter来提高查询效率。

query安全模式下查询示例:

curl -XGET --tlsv1.2 --negotiate -k -v -u : "https://ip:httpport/myindex-001/_search?pretty" -H 'Content-Type: application/json' -d'
{
  "query": {
    "match": {
      "age": "56"
    }
  }
}'

filter安全模式下查询示例:

curl -XGET --tlsv1.2 --negotiate -k -v -u : "https://ip:httpport/myindex-001/_search?pretty" -H 'Content-Type: application/json' -d' {   "query": {     "bool": {       "filter": {          "match": {           "age": "56"         }       }     }   } }'

路由(routing)

Elasticsearch写入文档时,文档会通过一个公式路由到一个索引中的一个分片上。默认公式如下:

shard_num = hash(_routing) % num_primary_shards

_routing字段的取值,默认是_id字段,可以根据业务场景设置经常查询的字段作为路由字段。例如可以考虑将用户id、地区作为路由字段,查询时可以过滤不必要的分片,加快查询速度。

安全模式下写入时指定路由:

curl -XPUT --tlsv1.2 --negotiate -k -v -u : "https://ip:httpport/my_index/my_type/1?routing=user1&refresh=true" -H 'Content-Type: application/json' -d' 
{
  "title": "This is a document"
}'

安全模式下查询时不指定路由示例:

curl -XGET --tlsv1.2 --negotiate -k -v -u : "https://ip:httpport/my_index/_search?pretty" -H 'Content-Type: application/json' -d'
{
  "query": {
    "match": {
      "title": "document"
    }
  }
}'

需要查询所有的分片,返回结果:

{
  "took" : 5,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 0.2876821,
    "hits" : [
      {
        "_index" : "my_index",
        "_type" : "my_type",
        "_id" : "1",
        "_score" : 0.2876821,
        "_routing" : "user1",
        "_source" : {
          "title" : "This is a document"
        }
      }
    ]
  }
}

安全模式下查询时指定路由示例:

curl -XGET --tlsv1.2 --negotiate -k -v -u : "https://ip:httpport/my_index/_search?routing=user1&pretty" -H 'Content-Type: application/json' -d'
{
  "query": {
    "match": {
      "title": "document"
    }
  }
}'

查询时只需要查询一个分片,查询结果:

{
  "took" : 8,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 0.2876821,
    "hits" : [
      {
        "_index" : "my_index",
        "_type" : "my_type",
        "_id" : "1",
        "_score" : 0.2876821,
        "_routing" : "user1",
        "_source" : {
          "title" : "This is a document"
        }
      }
    ]
  }
}

游标查询(scroll)

Elasticsearch为了避免深分页,不允许使用分页(from&size)查询10000条以后的数据,需要使用游标(scroll)查询。

安全模式下scroll查询示例:

curl -XGET --tlsv1.2 --negotiate -k -v -u : "https://ip:httpport/myindex-001/_search?scroll=1m&pretty" -H 'Content-Type: application/json' -d'
{
  "query": {
    "match": {
      "age": "36"
    }
  },
  "size":1000
}'

说明:

使用scroll查询,应该在初始搜索请求中指定scroll参数,这个参数告诉Elasticsearch保持游标窗口期多长时间。例如:scroll=1m,表示1分钟。

结果返回:

{
  "_scroll_id" : "DnF1ZXJ5VGhlbkZldGNoMgAAAAAAAABPFlFHZzExcFdnUWJDU0d5bU==",
  "took" : 55,
  "timed_out" : false,
  "_shards" : {
    "total" : 50,
    "successful" : 50,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 16692062,
    "max_score" : 0.0,
    "hits" : [...1000 data ]
  }
}

优化scroll:在一般场景下,scroll用来取得排序好的大量数据,但很多时候只需要返回数据,这时候可以对scroll进行优化。使用_doc去sort返回的结果不会有排序,此时执行效率最快。

安全模式下示例:

curl -XGET --tlsv1.2 --negotiate -k -v -u : "https://ip:httpport/myindex-001/_search?scroll=1m&pretty" -H 'Content-Type: application/json' -d'
{
  "query": {
    "match": {
      "age": "36"
    }
  },
  "size":1000,
  "sort": "_doc"
}'

避免使用wildcard模糊匹配查询

Elasticsearch默认支持通过*?正则表达式来做模糊匹配,数据量级别达到TB+甚至更高之后,模糊匹配查询通常会耗时比较长,甚至可能导致内存溢出,卡死乃至崩溃宕机的情况。所以数据量大的情况下,不要使用模糊匹配查询。

安全模式下模糊匹配查询示例:

curl -XGET --tlsv1.2 --negotiate -k -v -u : "https://ip:httpport/myindex-001/_search?pretty" -H 'Content-Type: application/json' -d'
{
  "query": {
    "wildcard" : {
	"name" : "*优" 
	}
  }
}'

聚合优化

大多时候对单个字段的聚合查询还是比较快的,但是当需要聚合多个字段时,就会产生大量的分组,最终结果就是占用Elasticsearch大量的内存,从而导致内存溢出的情况发生。尽量根据业务优化,减少聚合次数。

默认深度优化聚合改为广度优先聚合

添加设置:”collect_mode”: “breadth_first”。

depth_first:直接进行子聚合的计算。

breadth_first:先计算出当前聚合的结果,针对这个结果在对子聚合进行计算。

优化聚合执行方式

在每一层terms aggregation内部加一个 “execution_hint”: “map”。

添加设置:”execution_hint”: “map”。

  1. 查询结果直接放入到内存中构建map,在查询结果集小的场景下,速度极快;
  2. 但如果查询结果集合很大(百万-亿级别)的时候,传统聚合方式会比map方式快。

安全模式下聚合查询示例:

curl -XGET --tlsv1.2 --negotiate -k -v -u : "https://ip:httpport/myindex-001/_search?pretty" -H 'Content-Type: application/json' -d'
{
  "size" : 0,
  "aggregations": {
    "count_age" : {
	"terms" : {
		   "field" : "age"
		} 
	}
  }
}'

安全模式下聚合优化后查询示例:

curl -XGET --tlsv1.2 --negotiate -k -v -u : "https://ip:httpport/myindex-001/_search?pretty" -H 'Content-Type: application/json' -d'
{
  "size" : 0,
  "aggregations": {
    "count_age" : {
	"terms" : {
		   "field" : "age",
		   "execution_hint": "map",
		   "collect_mode": "breadth_first"
		} 
	}
  }
}'

配置EsClient角色(协调节点)

EsClient角色可以用于发送查询请求到其他节点,收集和合并结果,以及响应发出查询的客户端。通过配置EsClient角色可以加快查询运算速度,提升缓存命中数。

mappings优化

请确认mappings设置是否合理。

  • 对于只需要精确查询的字段,例如时间戳,应该设置为keyword。
  • 对需要进行全文检索的字段设置合理的分词器,不同的分词器查询效率相差较大。

超时参数

在对查询结果的精确度要求较低的场景下,如果低响应时间比搜索结果更重要,可以使用如下两个参数来提升查询性能:

  1. terminate_after:表示每个分片收集的文档的最大数量,一旦达到该数量,查询请求提前终止。
  2. timeout:表示每个分片上的查询超时时间,在请求超时之前,Elasticsearch将会返回已经成功从每个分片上获取的结果。 安全模式下使用示例 : curl -XGET –tlsv1.2 –negotiate -k -v -u : “https://ip:httpport/_search?pretty&timeout=10ms&terminate_after=10″
作者 east
Elasticsearch 8月 31,2020

ES常见性能问题与解决方案

常见性能问题与解决方案

当前性能问题很多是硬件资源限制,或者是配置使用不合理,再或者是集群部署不合理,常见问题如下:

  1. 全文检索场景下查询速度慢问题。 分析:对全索引,全字段进行全文检索,发现查询速度很慢。通过集群状态分析发现,index数和shard数偏多,规划不合理,同时索引分片数设置不合理。通过查询慢日志发现,提取阶段需要合并大量的结果,导致整个查询时间慢。 解决方案:关闭swap交换内存,重新规划索引的shard个数,定时的进行索引段合并减少集群segment个数。
  2. 写入数据达到一定量时,指定ID导致读IO很高问题。 分析:在EsNode节点上执行iotop命令,发现大量Elasticsearch线程的磁盘读速率高。通过线程堆栈信息发现,在索引bulk命令的写入流程中,由于写入请求指定文档ID,需要先做一次全量查询,确认该index是否存在指定的文档ID,这个查询过程占用大量的磁盘读IO。 解决方案:业务测进行调整,写入数据时不指定文档ID,而是将其作为一个index字段。

针对性能问题首先排查系统部署是否合理,然后查看硬件资源是否达到瓶颈,结合客户的查询特点,有针对性的利用第3节的调优参数进行调整。

查看日志信息,排查系统后台是否有报错,根据错误信息针对具体问题分析性能不达标的根本原因。

日志分类介绍:

当前Elasticsearch各个实例的日志保存在“${BigdataLogHome}/elasticsearch/${Rolename}”和“${BigdataLogHome}/audit/elasticsearch/${Rolename}”目录下。

  • 安装日志如下:
日志文件名 分析描述
es-postinstall.log Elasticsearch安装日志
es-start.log Elasticsearch启动日志
es-stop.log Elasticsearch停止日志
  • 运行日志如下:
日志文件名 分析描述
elasticsearch_cluster.log Elasticsearch集群日志,实例运行日志
es-process-check.log Elasticsearch健康检查日志
es-sevice-check.log Elasticsearch服务检查日志
elasticsearch_cluster_index_indexing_slowlog.log Elasticsearch索引慢日志
elasticsearch_cluster_index_search_slowlog.log Elasticsearch查询慢日志
es-gc.log Elasticsearch实例的GC日志
elasticsearch_cluster-audit.log 记录对索引级别的操作,比如迁移shard,删除索引等
  • 开启慢日志: 默认的情况下,Elasticsearch的查询慢日志和索引慢日志是没有启用的。需要通过设置日志的级别(warn, info, debug, trace)和阀值来开启慢日志。 首先设置日志级别,如下所示将日志级别设置为debug:curl -XPUT –tlsv1.2 –negotiate -k -v -u : ‘https://ip:httpport/_cluster/settings?pretty’ -H ‘Content-Type: application/json’ -d’ { “transient”: { “logger.index.indexing.slowlog”:”DEBUG”, “logger.index.search.slowlog”:”DEBUG” } }’ 设置完日志级别后需要分别设置查询慢日志和索引慢日志的对应日志级别下的阀值,可以在elasticsearch.yml文件里定义这些阀值。没有阀值设置的索引会自动继承在静态配置文件里配置的参数。同时也提供动态API的方式来设置。
    1. 查询慢日志 shard级别的查询慢日志会将慢查询(查询和获取阶段)记录到elasticsearch_cluster_index_search_slowlog.log日志中。 设置查询慢日志各种级别下的阀值,同时也支持多索引(索引名按逗号分隔)和全索引(用*通配符)操作。curl -XPUT –tlsv1.2 –negotiate -k -v -u : ‘https://ip:httport/myindex-001/_settings?pretty’ -H ‘Content-Type: application/json’ -d’ { “index.search.slowlog.threshold.query.warn”: “10s”, “index.search.slowlog.threshold.query.info”: “5s”, “index.search.slowlog.threshold.query.debug”: “2s”, “index.search.slowlog.threshold.query.trace”: “500ms”, “index.search.slowlog.threshold.fetch.warn”: “1s”, “index.search.slowlog.threshold.fetch.info”: “800ms”, “index.search.slowlog.threshold.fetch.debug”: “500ms”, “index.search.slowlog.threshold.fetch.trace”: “200ms”, }’ 说明: index.search.slowlog.threshold.query.*:对应日志级别下的阀值,查询阶段慢于该阀值即打印日志。 index.search.slowlog.threshold.fetch.*:对应日志级别下的阀值,提取阶段慢于该阀值即打印日志。
    2. 索引慢日志 设置索引慢日志各种级别下的阀值,同时也支持多索引(索引名按逗号分隔)和全索引(用*通配符)操作。curl -XPUT –tlsv1.2 –negotiate -k -v -u : ‘https://ip:httpport/myindex-001/_settings?pretty’ -H ‘Content-Type: application/json’ -d’ { “index.indexing.slowlog.threshold.index.warn”: “10s”, “index.indexing.slowlog.threshold.index.info”: “5s”, “index.indexing.slowlog.threshold.index.debug”: “2s”, “index.indexing.slowlog.threshold.index.trace”: “500ms”, “index.indexing.slowlog.source”: “1000” }’ 说明: index.indexing.slowlog.threshold.index.*:对应日志级别下的阀值,索引时间慢于该阀值即打印日志。 index.indexing.slowlog.source:Elasticsearch默认将在慢索引日志中记录_source的前1000个字符,将其设置为false或0将完全跳过记录源,设置为true将记录整个源。
作者 east
运维 8月 23,2020

lnmp一键安装包重新安装mysql

安装mysql好长时间,一直没去管,后来一直频繁重启,各种网上找方案去解决,最后问题太异常,一顿操作猛如虎之后把mysql彻底搞垮,无奈只能进行重装。

#whereis mysql

#mysql: /usr/bin/mysql /usr/lib/mysql /usr/include/mysql /usr/local/mysql

找到五个目录

rm -rf /usr/bin/mysql 五个目录依次删除

然后就可以安装,新的MYSQL了,INIT 启动下的就不用删了,如果还要安装的话,

目前提供了较多的MySQL、MariaDB版本和不安装数据库的选项,需要注意的是MySQL 5.6,5.7及MariaDB 10必须在1G以上内存的更高配置上才能选择!如仅需安装数据库在lnmp安装包目录下执行:

./install.sh db

加上这个DB 就只安装数据库了,别的NGINX就不安 装了

杀死以前安装的mysql进程,然后重启就可以啦

lnmp restart

查看进程

ps -ef|grep mysql

强制杀死进程4328

kill -s 9 4328

作者 east
Elasticsearch 7月 26,2020

Elasticsearch日期Text类型查询的坑

项目需求用时间范围进行查询,并按时间进行逆序查询。

刚开始为了方便用了text类型,发现存在2个问题,比如from 2020-07-26 00:00:00 ,to 2020-07-26 10:57:00,发现查不了2020-07-26那天的数据。扩大时间范围查询,有数据范围的,当天数据也不是按时间逆序,
2020-07-26 00:00:02 可能比 2020-07-26 10:57:00还排在前面。原因是
es对于text类型的,按中间空格进行分词,即使对日期设置format
yyyy-MM-dd HH:mm:ss 也没作用。

解决方法有2种:1、使用date类型。2、使用时间戳方式。

作者 east
人工智能 6月 27,2020

2020人工智能下载数据集最全最新集合

UCI 是一个关于机器学习测试数据的下载中心站点,里面包含了适用于做聚类,分群,回归等各种机器学习问题的数据集。 http://archive.ics.uci.edu/ml/datasets/Wholesale+customers

https://aidown.52msr.cn/

Public Data Sets on Amazon Web Services (AWS) 
http://aws.amazon.com/datasets 
Amazon从2008年开始就为开发者提供几十TB的开发数据。

Yahoo! Webscope 
http://webscope.sandbox.yahoo.com/index.php

Konect is a collection of network datasets 
http://konect.uni-koblenz.de/

Stanford Large Network Dataset Collection 
http://snap.stanford.edu/data/index.html

再就是说说几个跟互联网有关的数据集: 
Dataset for “Statistics and Social Network of YouTube Videos” 
http://netsg.cs.sfu.ca/youtubedata/

1998 World Cup Web Site Access Logs 
http://ita.ee.lbl.gov/html/contrib/WorldCup.html 
这个是1998年世界杯期间的数据集。从1998/04/26 到 1998/07/26 的92天中,发生了 1,352,804,107次请求。

Page view statistics for Wikimedia projects 
http://dammit.lt/wikistats/

AOL Search Query Logs – RP 
http://www.researchpipeline.com/mediawiki/index.php?title=AOL_Search_Query_Logs

livedoor gourmet 
http://blog.livedoor.jp/techblog/archives/65836960.html

海量图像数据集: 
ImageNet 
http://www.image-net.org/ 
包含1400万的图像。

Tiny Images Dataset 
http://horatio.cs.nyu.edu/mit/tiny/data/index.html 
包含8000万的32×32图像。

MirFlickr1M 
http://press.liacs.nl/mirflickr/ 
Flickr中的100万的图像集。

CoPhIR 
http://cophir.isti.cnr.it/whatis.html 
Flickr中的1亿600万的图像

SBU captioned photo dataset 
http://dsl1.cewit.stonybrook.edu/~vicente/sbucaptions/ 
Flickr中的100万的图像集。

Large-Scale Image Annotation using Visual Synset(ICCV 2011) 
http://cpl.cc.gatech.edu/projects/VisualSynset/ 
包含2亿图像

NUS-WIDE 
http://lms.comp.nus.edu.sg/research/NUS-WIDE.htm 
Flickr中的27万的图像集。

SUN dataset 
http://people.csail.mit.edu/jxiao/SUN/ 
包含13万的图像

MSRA-MM 
http://research.microsoft.com/en-us/projects/msrammdata/ 
包含100万的图像,23000视频

TRECVID 
http://trecvid.nist.gov/

2014/07/07 雅虎发布超大Flickr数据集 1亿的图片+视频 
http://yahoolabs.tumblr.com/post/89783581601/one-hundred-million-creative-commons-flickr-images-for

============================================
数据挖掘数据集下载资源

1、气候监测数据集 http://cdiac.ornl.gov/ftp/ndp026b

2、几个实用的测试数据集下载的网站
http://www.fs.fed.us/fire/fuelman/
http://www.cs.toronto.edu/~roweis/data.html
http://kdd.ics.uci.edu/summary.task.type.html
http://www-2.cs.cmu.edu/afs/cs.cmu.edu/project/theo-20/www/data/
http://www-2.cs.cmu.edu/afs/cs.cmu.edu/project/theo-11/www/wwkb/
http://www.phys.uni.torun.pl/~duch/software.html
在下面的网址可以找到reuters数据集:http://www.research.att.com/~lewis/reuters21578.html
该网址有各种数据集:http://kdd.ics.uci.edu/summary.data.type.html
进行文本分类,还有一个数据集是可以用的,即rainbow的数据集
http://www-2.cs.cmu.edu/afs/cs/project/theo-11/www/naive-bayes.html

3、UCI收集的机器学习数据集
ftp://pami.sjtu.edu.cn/
http://www.ics.uci.edu/~mlearn//MLRepository.htm

4、statlib
http://liama.ia.ac.cn/SCILAB/scilabindexgb.htm
http://lib.stat.cmu.edu/

5、关于基金的数据挖掘的网站
http://www.gotofund.com/index.asp

http://lans.ece.utexas.edu/~strehl/

6、进行文本分类&WEB
http://www-2.cs.cmu.edu/afs/cs/project/theo-11/www/naive-bayes.html

http://www.w3.org/TR/WD-logfile-960221.html
http://www.w3.org/Daemon/User/Config/Logging.html#AccessLog
http://www.w3.org/1998/11/05/WC-workshop/Papers/bala2.html
http://www-2.cs.cmu.edu/afs/cs.cmu.edu/project/theo-11/www/wwkb/
http://www.web-caching.com/traces-logs.html
http://www-2.cs.cmu.edu/webkb
http://www.cs.auc.dk/research/DP/tdb/TimeCenter/TimeCenterPublications/TR-75.pdf
http://www.cs.cornell.edu/projects/kddcup/index.html

7、时间序列数据的网址
http://www.stat.wisc.edu/~reinsel/bjr-data/

8、apriori算法的测试数据
http://www.almaden.ibm.com/cs/quest/syndata.html

9、数据生成器的链接
http://www.cse.cuhk.edu.hk/~kdd/data_collection.html
http://www.almaden.ibm.com/cs/quest/syndata.html
10、关联:
http://flow.dl.sourceforge.net/sourceforge/weka/regression-datasets.jar
http://www.almaden.ibm.com/software/quest/Resources/datasets/syndata.html#assocSynData

11、WEKA:
http://flow.dl.sourceforge.net/sourceforge/weka/regression-datasets.jar
1。A jarfile containing 37 classification problems, originally obtained from the UCI repository
http://prdownloads.sourceforge.net/weka/datasets-UCI.jar
2。A jarfile containing 37 regression problems, obtained from various sources
http://prdownloads.sourceforge.net/weka/datasets-numeric.jar
3。A jarfile containing 30 regression datasets collected by Luis Torgo
http://prdownloads.sourceforge.net/weka/regression-datasets.jar

12、癌症基因:
http://www.broad.mit.edu/cgi-bin/cancer/datasets.cgi

13、金融数据:
http://lisp.vse.cz/pkdd99/Challenge/chall.htm

14、一个很好的据资源按应用领域划分的资源网址为:http://kdd.ics.uci.edu/ 

作者 east
运维 6月 26,2020

Linux查看日志常用命令

实时查看日志命令

tail -f jar.log

查看最后多少行日志:程序中断了,需要看日志,但日志可能太大了,所以查看末尾的日志通常可以找出问题,例如查看最后100行的日志

tail -n 100 jar.log

清空日志文件:

echo “” >jar.log

更多知识参考

https://ke.qq.com/course/5978198?saleToken=2725343&from=pclink

作者 east
Java, spring 6月 26,2020

Mysql 查询今天、昨天、前天的sql语句

查询今天的
SELECT * FROM t_table WHERE TO_DAYS(CREATE_TIME) = TO_DAYS(NOW())

查询昨天的
SELECT * FROM t_table WHERE TO_DAYS(NOW()) - TO_DAYS(CREATE_TIME) = 1


查询前天天的
SELECT * FROM t_table WHERE TO_DAYS(NOW()) - TO_DAYS(CREATE_TIME) = 1
作者 east
bug清单, spring 6月 26,2020

springboot内嵌tomcat文件上传路径不存在bug解决

在开发上传功能时,发现在开发环境正常,在线上环境出现问题,经过定位发现tomcat临时目录导致的问题。

springboot内嵌tomcat,上传文件时会存放到tomcat临时文件目录(停止时删除/重启时新建),如:/tmp/tomcat.1046709481715876128.17301/work/Tomcat/localhost/cms

可知文件保存在/tmp目录下,/tmp目录在centos下会定时清理,大约10天未使用将会删除目录,(当tomcat未重启,但centos删除相应目录,tomcat获取相应目录却获取不到会报错)

解决方案:

配置multipartFile上传路径

1.application.properties 文件中添加

spring.http.multipart.location=${tmp.file.path} 注意:tmp.file.path 如果不存在,spring会认为是相对路径,对应根路径是tomcat临时文件目录
2

2.配置相应bean

/**
* 文件上传临时路径
*/
@Bean
MultipartConfigElement multipartConfigElement() {
  MultipartConfigFactory factory = new MultipartConfigFactory();
factory.setLocation("/data/ops/app/cms/cache");
return factor
246810121416
作者 east
Java 6月 25,2020

shardingsphere 4.0的2种配置格式

首先配置pom.xml


        <!-- shardingsphere最新版本 -->
        <dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
            <version>4.0.0-RC1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>sharding-jdbc-spring-namespace</artifactId>
            <version>4.0.0-RC1</version>
        </dependency>

yml格式只分表,不分库的写法

Spring:
  shardingsphere:
    datasource:
      names: master
      master:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://197.1.26.138:53306/test?serverTimezone=Asia/Shanghai&useSSL=false&allowMultiQueries=true
        username: root
        password: root
#数据分表规则
#指定所需分的表
    sharding:
      tables:
        test_user:
          actual-data-nodes: master.test_user$->{0..2}
          table-strategy:
            inline:
              sharding-column: night_id
              algorithm-expression: test_user$->{night_id % 3}
    props:
      sql:
        show: false

properties分库分表的写法


#指定mybatis信息
mybatis.config-location=classpath:mybatis-config.xml

#数据库
spring.shardingsphere.datasource.names=master0,slave0

spring.shardingsphere.datasource.master0.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.master0.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.master0.url=jdbc:mysql://localhost:3306/master?characterEncoding=utf-8
spring.shardingsphere.datasource.master0.username=root
spring.shardingsphere.datasource.master0.password=123456

spring.shardingsphere.datasource.slave0.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.slave0.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.slave0.url=jdbc:mysql://localhost:3306/slave?characterEncoding=utf-8
spring.shardingsphere.datasource.slave0.username=root
spring.shardingsphere.datasource.slave0.password=root

#数据分表规则
#指定所需分的表
spring.shardingsphere.sharding.tables.tab_user.actual-data-nodes=master0.tab_user$->{0..1}
#指定主键
spring.shardingsphere.sharding.tables.tab_user.table-strategy.inline.sharding-column=id
#分表规则为主键除以2取模
spring.shardingsphere.sharding.tables.tab_user.table-strategy.inline.algorithm-expression=tab_user$->{id % 2}

# 读写分离
spring.shardingsphere.masterslave.load-balance-algorithm-type=round_robin
spring.shardingsphere.masterslave.name=ms
#这里配置读写分离的时候一定要记得添加主库的数据源名称 这里为master0
spring.shardingsphere.sharding.master-slave-rules.master0.master-data-source-name=master0
spring.shardingsphere.sharding.master-slave-rules.master0.slave-data-source-names=slave0

#打印sql
spring.shardingsphere.props.sql.show=true
作者 east
Spark, 大数据开发 6月 25,2020

大数据利用基站或GPS推断是家和工作地

如果有某个手机用户的GPS轨迹或基站,是可以利用大数据来推断他的家和工作地。

思路应该从时空2个维度进行考虑:

1、从时间上考虑:对于一般人来说,一天最早的出发地通常是家,晚上最后的目的地通常是家。而上班的地方,普通是6-10点出发的,在17点到22点后回来的,工作地通常是停留时间很长。(可以把轨迹按天归类,并按每天时间排序,从而计算最早、最晚、白天停留时间最长的地点)





2、从空间上考虑:家和工作点应该是2个不同的聚类中心。 可以利用轨迹绘制集群中每个集群中GPS或基站数据点的时间分布。 应该可以推断出从早上9点到晚上18点,用户停留在集群1区域,而在午夜到早上8点,用户倾向于留在集群2。从而大概率推断出集群1是家,集群2是工作地(可以用 DBSCAN算法来识别此数据集中的聚类。 DBSCAN是一种聚类算法,对于聚类具有许多异常值的空间数据特别有用 )

作者 east
spring 6月 10,2020

Springboot读取excel工具类

public List<DeviceInfo> readXls() throws IOException {
InputStream is = new FileInputStream(EXCEL_PATH);
XSSFWorkbook hssfWorkbook = new XSSFWorkbook(is);
DeviceInfo student = null;
List<DeviceInfo> list = new ArrayList<DeviceInfo>();
// 循环工作表Sheet
for (int numSheet = 0; numSheet < hssfWorkbook.getNumberOfSheets(); numSheet++) {
XSSFSheet hssfSheet = hssfWorkbook.getSheetAt(numSheet);
if (hssfSheet == null) {
continue;
}
// 循环行Row
for (int rowNum = 1; rowNum <= hssfSheet.getLastRowNum(); rowNum++) {
XSSFRow hssfRow = hssfSheet.getRow(rowNum);
if(CheckRowNull(hssfRow)){
continue;
}
if (hssfRow != null) {
student = new DeviceInfo();
XSSFCell no = hssfRow.getCell(0);
no.setCellType(no.CELL_TYPE_STRING);
XSSFCell name = hssfRow.getCell(3);
XSSFCell longitude = hssfRow.getCell(1);
XSSFCell latitude = hssfRow.getCell(2);
student.setDeviceId(getValue(no));
student.setDeviceName(getValue(name));
student.setLongitude(new BigDecimal(getValue(longitude)));
student.setLatitude(new BigDecimal(getValue(latitude)));
list.add(student);
}
}
}
return list;
}

@SuppressWarnings("static-access")
private String getValue(XSSFCell hssfCell) {
if (hssfCell.getCellType() == hssfCell.CELL_TYPE_BOOLEAN) {
// 返回布尔类型的值
return String.valueOf(hssfCell.getBooleanCellValue());
} else if (hssfCell.getCellType() == hssfCell.CELL_TYPE_NUMERIC) {
// 返回数值类型的值
return String.valueOf(hssfCell.getNumericCellValue());
} else if (hssfCell.getCellType() == hssfCell.CELL_TYPE_FORMULA) {
return String.valueOf(hssfCell.getCellFormula());
} else {
// 返回字符串类型的值
return String.valueOf(hssfCell.getStringCellValue());
}
}

//判断行为空
private boolean CheckRowNull(XSSFRow hssfRow){
Iterator<Cell> cellItr =hssfRow.iterator();
while(cellItr.hasNext()){
Cell c =cellItr.next();
if(c != null && c.getCellType() !=XSSFCell.CELL_TYPE_BLANK){
return false;
}
}
return true;
}

作者 east
大数据开发 6月 10,2020

ShardingSphere不支持的SQL操作(having等复杂统计及子查询)

在大数据时代,面对海量数据存储和处理,除了nosql方案外,很多时候还是需要关系型数据库。mysql单表在千万级别时性能就明显下降,这时靠加索引等也难根本性解决,这时需要分库分表。shardingshpere是一款轻巧绿色的分库分表利器。不是它也是有局限性,下面是它不支持的sql操作。


路由至多数据节点

不支持CASE WHEN、HAVING、UNION (ALL),有限支持子查询。

除了分页子查询的支持之外(详情请参考分页),也支持同等模式的子查询。无论嵌套多少层,ShardingSphere都可以解析至第一个包含数据表的子查询,一旦在下层嵌套中再次找到包含数据表的子查询将直接抛出解析异常。

例如,以下子查询可以支持:

SELECT COUNT(*) FROM (SELECT * FROM t_order o)

以下子查询不支持:

SELECT COUNT(*) FROM (SELECT * FROM t_order o WHERE o.id IN (SELECT id FROM t_order WHERE status = ?))

简单来说,通过子查询进行非功能需求,在大部分情况下是可以支持的。比如分页、统计总数等;而通过子查询实现业务查询当前并不能支持。

由于归并的限制,子查询中包含聚合函数目前无法支持。

不支持包含schema的SQL。因为ShardingSphere的理念是像使用一个数据源一样使用多数据源,因此对SQL的访问都是在同一个逻辑schema之上。

对分片键进行操作

运算表达式和函数中的分片键会导致全路由。

假设create_time为分片键,则无法精确路由形如SQL:

SELECT * FROM t_order WHERE to_date(create_time, 'yyyy-mm-dd') = '2019-01-01';

由于ShardingSphere只能通过SQL字面提取用于分片的值,因此当分片键处于运算表达式或函数中时,ShardingSphere无法提前获取分片键位于数据库中的值,从而无法计算出真正的分片值。

当出现此类分片键处于运算表达式或函数中的SQL时,ShardingSphere将采用全路由的形式获取结果。

示例

支持的SQL

SQL必要条件
SELECT * FROM tbl_name
SELECT * FROM tbl_name WHERE (col1 = ? or col2 = ?) and col3 = ?
SELECT * FROM tbl_name WHERE col1 = ? ORDER BY col2 DESC LIMIT ?
SELECT COUNT(*), SUM(col1), MIN(col1), MAX(col1), AVG(col1) FROM tbl_name WHERE col1 = ?
SELECT COUNT(col1) FROM tbl_name WHERE col2 = ? GROUP BY col1 ORDER BY col3 DESC LIMIT ?, ?
INSERT INTO tbl_name (col1, col2,…) VALUES (?, ?, ….)
INSERT INTO tbl_name VALUES (?, ?,….)
INSERT INTO tbl_name (col1, col2, …) VALUES (?, ?, ….), (?, ?, ….)
UPDATE tbl_name SET col1 = ? WHERE col2 = ?
DELETE FROM tbl_name WHERE col1 = ?
CREATE TABLE tbl_name (col1 int, …)
ALTER TABLE tbl_name ADD col1 varchar(10)
DROP TABLE tbl_name
TRUNCATE TABLE tbl_name
CREATE INDEX idx_name ON tbl_name
DROP INDEX idx_name ON tbl_name
DROP INDEX idx_name
SELECT DISTINCT * FROM tbl_name WHERE col1 = ?
SELECT COUNT(DISTINCT col1) FROM tbl_name

不支持的SQL

SQL不支持原因
INSERT INTO tbl_name (col1, col2, …) VALUES(1+2, ?, …)VALUES语句不支持运算表达式
INSERT INTO tbl_name (col1, col2, …) SELECT col1, col2, … FROM tbl_name WHERE col3 = ?INSERT .. SELECT
SELECT COUNT(col1) as count_alias FROM tbl_name GROUP BY col1 HAVING count_alias > ?HAVING
SELECT * FROM tbl_name1 UNION SELECT * FROM tbl_name2UNION
SELECT * FROM tbl_name1 UNION ALL SELECT * FROM tbl_name2UNION ALL
SELECT * FROM ds.tbl_name1包含schema
SELECT SUM(DISTINCT col1), SUM(col1) FROM tbl_name详见DISTINCT支持情况详细说明
SELECT * FROM tbl_name WHERE to_date(create_time, ‘yyyy-mm-dd’) = ?会导致全路由

DISTINCT支持情况详细说明

支持的SQL

SQL
SELECT DISTINCT * FROM tbl_name WHERE col1 = ?
SELECT DISTINCT col1 FROM tbl_name
SELECT DISTINCT col1, col2, col3 FROM tbl_name
SELECT DISTINCT col1 FROM tbl_name ORDER BY col1
SELECT DISTINCT col1 FROM tbl_name ORDER BY col2
SELECT DISTINCT(col1) FROM tbl_name
SELECT AVG(DISTINCT col1) FROM tbl_name
SELECT SUM(DISTINCT col1) FROM tbl_name
SELECT COUNT(DISTINCT col1) FROM tbl_name
SELECT COUNT(DISTINCT col1) FROM tbl_name GROUP BY col1
SELECT COUNT(DISTINCT col1 + col2) FROM tbl_name
SELECT COUNT(DISTINCT col1), SUM(DISTINCT col1) FROM tbl_name
SELECT COUNT(DISTINCT col1), col1 FROM tbl_name GROUP BY col1
SELECT col1, COUNT(DISTINCT col1) FROM tbl_name GROUP BY col1

不支持的SQL

SQL不支持原因
SELECT SUM(DISTINCT col1), SUM(col1) FROM tbl_name同时使用普通聚合函数和DISTINCT聚合函数


作者 east

上一 1 … 73 74 75 … 93 下一个

关注公众号“大模型全栈程序员”回复“小程序”获取1000个小程序打包源码。回复”chatgpt”获取免注册可用chatgpt。回复“大数据”获取多本大数据电子书

标签

AIGC AI创作 bert chatgpt github GPT-3 gpt3 GTP-3 hive mysql O2O tensorflow UI控件 不含后台 交流 共享经济 出行 图像 地图定位 外卖 多媒体 娱乐 小程序 布局 带后台完整项目 开源项目 搜索 支付 效率 教育 日历 机器学习 深度学习 物流 用户系统 电商 画图 画布(canvas) 社交 签到 联网 读书 资讯 阅读 预订

官方QQ群

小程序开发群:74052405

大数据开发群: 952493060

近期文章

  • 解决gitlab配置Webhooks,提示 Invalid url given的问题
  • 如何在Chrome中设置启动时自动打开多个默认网页
  • spark内存溢出怎样区分是软件还是代码原因
  • MQTT完全解析和实践
  • 解决运行Selenium报错:self.driver = webdriver.Chrome(service=service) TypeError: __init__() got an unexpected keyword argument ‘service’
  • python 3.6使用mysql-connector-python报错:SyntaxError: future feature annotations is not defined
  • 详解Python当中的pip常用命令
  • AUTOSAR如何在多个供应商交付的配置中避免ARXML不兼容?
  • C++thread pool(线程池)设计应关注哪些扩展性问题?
  • 各类MCAL(Microcontroller Abstraction Layer)如何与AUTOSAR工具链解耦?

文章归档

  • 2025年10月
  • 2025年8月
  • 2025年7月
  • 2025年6月
  • 2025年5月
  • 2025年4月
  • 2025年3月
  • 2025年2月
  • 2025年1月
  • 2024年12月
  • 2024年11月
  • 2024年10月
  • 2024年9月
  • 2024年8月
  • 2024年7月
  • 2024年6月
  • 2024年5月
  • 2024年4月
  • 2024年3月
  • 2023年11月
  • 2023年10月
  • 2023年9月
  • 2023年8月
  • 2023年7月
  • 2023年6月
  • 2023年5月
  • 2023年4月
  • 2023年3月
  • 2023年1月
  • 2022年11月
  • 2022年10月
  • 2022年9月
  • 2022年8月
  • 2022年7月
  • 2022年6月
  • 2022年5月
  • 2022年4月
  • 2022年3月
  • 2022年2月
  • 2022年1月
  • 2021年12月
  • 2021年11月
  • 2021年9月
  • 2021年8月
  • 2021年7月
  • 2021年6月
  • 2021年5月
  • 2021年4月
  • 2021年3月
  • 2021年2月
  • 2021年1月
  • 2020年12月
  • 2020年11月
  • 2020年10月
  • 2020年9月
  • 2020年8月
  • 2020年7月
  • 2020年6月
  • 2020年5月
  • 2020年4月
  • 2020年3月
  • 2020年2月
  • 2020年1月
  • 2019年7月
  • 2019年6月
  • 2019年5月
  • 2019年4月
  • 2019年3月
  • 2019年2月
  • 2019年1月
  • 2018年12月
  • 2018年7月
  • 2018年6月

分类目录

  • Android (73)
  • bug清单 (79)
  • C++ (34)
  • Fuchsia (15)
  • php (4)
  • python (45)
  • sklearn (1)
  • 云计算 (20)
  • 人工智能 (61)
    • chatgpt (21)
      • 提示词 (6)
    • Keras (1)
    • Tensorflow (3)
    • 大模型 (1)
    • 智能体 (4)
    • 深度学习 (14)
  • 储能 (44)
  • 前端 (5)
  • 大数据开发 (494)
    • CDH (6)
    • datax (4)
    • doris (31)
    • Elasticsearch (15)
    • Flink (79)
    • flume (7)
    • Hadoop (19)
    • Hbase (23)
    • Hive (41)
    • Impala (2)
    • Java (71)
    • Kafka (10)
    • neo4j (5)
    • shardingsphere (6)
    • solr (5)
    • Spark (100)
    • spring (11)
    • 数据仓库 (9)
    • 数据挖掘 (7)
    • 海豚调度器 (10)
    • 运维 (36)
      • Docker (3)
  • 小游戏代码 (1)
  • 小程序代码 (139)
    • O2O (16)
    • UI控件 (5)
    • 互联网类 (23)
    • 企业类 (6)
    • 地图定位 (9)
    • 多媒体 (6)
    • 工具类 (25)
    • 电商类 (22)
    • 社交 (7)
    • 行业软件 (7)
    • 资讯读书 (11)
  • 嵌入式 (71)
    • autosar (63)
    • RTOS (1)
    • 总线 (1)
  • 开发博客 (16)
    • Harmony (9)
  • 技术架构 (6)
  • 数据库 (32)
    • mongodb (1)
    • mysql (13)
    • pgsql (2)
    • redis (1)
    • tdengine (4)
  • 未分类 (8)
  • 程序员网赚 (20)
    • 广告联盟 (3)
    • 私域流量 (5)
    • 自媒体 (5)
  • 量化投资 (4)
  • 面试 (14)

功能

  • 登录
  • 文章RSS
  • 评论RSS
  • WordPress.org

All Rights Reserved by Gitweixin.本站收集网友上传代码, 如有侵犯版权,请发邮件联系yiyuyos@gmail.com删除.