Hermes实时部分查询使用手册

一、相关概念
Shard:
hermes在启动的时候会在不同的机器上启动很多进程,每个进程我们称之为一个shard,查询的时候多个shard并行的处理索引,最终通过merger server将结果返回给用户。
Merger server:
用于合并每个shard的处理结果,通常来说我们会为每台机器分配一个merger server,用于合并这台机器的shards的结果。
分区:
Hermes不会将全部的数据都完整的创建在一个索引中,这样单个索引太大了,索引的检索与合并开销太大,通常来说我们会按照天来进行分区,也就是一个shard每天会生成一个索引。查询那天的数据,就去对应的分区中区检索,其他的分区这闲置。
Hermes分区的名字 目前为thedate ; 检索查询的时候,必须要设置要查询那些分区,而且要写在SQL的最外层。
例子如下:
thedate='20140515'
thedate in ('20140515','20140514')
分表:
有些情形,特别是全文检索的场景,机器数量少,但数据量很大,这样落在一天的数据也会很多,即使按照天进行分区,单个索引文件也会特别大,所以需要按照一定的规则继续将索引拆开,故这种情形我们会对hermes进行分表处理,以sng的日志检索项目为例,5台机器每天50亿的数据,我们按照小时拆分成8张表,分别为cdn_test_00,cdn_test_03,cdn_test_06,cdn_test_09,cdn_test_12,cdn_test_15,cdn_test_18,cdn_test_21,这样每张表保存了3个小时的数据,索引大小就不会特备大了
查询的时候如果只查一个小时的数据,那么表的名字就写对应的表名就行,但是如果想查询整天或者跨越多个小时,则需要SQL中配置多个表的名字
例子如下
查询单个分表的,可以这样写
select thedate,ddwuin,dwinserttime,szlogstr,ddwlocaltime from sngsearch12 where thedate in ('20140511') and ddwuin=5713 limit 0,10
如果要查询整天的,则按照逗号将多个表写在一起就行了
select higo_uuid,thedate,ddwuid,dwinserttime,ddwlocaltime,dwappid,dwinituserdef1,dwclientip,sclientipv6,dwserviceip,dwlocaiip,dwclientversion,dwcmd,dwsubcmd,dwerrid,dwuserdef1,dwuserdef2,dwuserdef3,dwuserdef4,cloglevel,szlogstr from sngsearch06,sngsearch09,sngsearch12 where thedate in ('20140510') and ddwuin=5713 limit 0,20
二、基本SQL写法与例子
l 查看数据例子
select thedate,ddwuin,dwinserttime,szlogstr,ddwlocaltime from sngsearch12 where thedate in ('20140511') and ddwuin=5713 limit 0,10
l 对某个列进行排序(目前只支持单列排序)
select thedate,ddwuin,dwinserttime,ddwlocaltime from sngsearch12 where thedate in ('20140511') and ddwuin=5713 order by ddwlocaltime desc limit 0,10
l 常见过滤条件的写法
支持 in操作,例子如下
ddwuin in (5713,5714,5715)
过滤条件可以进行and与or的组合(但最外层必须是and ),例子如下
thedate in (20140508) and (ddwuid='1' or ddwuid='2' or (dwinserttime>=20140508202626 and dwinserttime<=20140508203026)) >,<,>=,<=,区间查询的写法 对于带有范围的过滤筛选推荐使用这种含有TO的查询,能提升查询效率,注意两种括号的区别,前者不包含边界值,但后者则包含 dwinserttime like '([20140511000000 TO 20140511115000] )' dwinserttime like '({20140511000000 TO 20140511115000})' 实在不能避免可以考虑下面的写法,但是对于重复值很少的列,查询起来会比较慢 dwinserttime>=20140511115000 and dwinserttime <=20140511000000 不等于的写法 默认的SQL语法还不支持不等于的写法,如有有这样的需求可以这样写 ddwuin like '(*:* ! 3 ! 1 ! 1087079569)' 表示 ddwuin不能等于3,1,1087079569 dwinserttime like '(*:* ! [20140508181500 TO 20140508181600])' 表示从结果中排除掉对应的区间 dwinserttime like '([20140515181500 TO 20140509181600]) ! [20140508181500 TO 20140508181600])' 表示匹配第一个区间,但要排除掉第二个区间 模糊匹配 szlogstr like 'iris *' 注意如何改列排重后的值得数量特别多,禁止将通配符写在最前面,否则查询性能很低 ddwuin like '6938433??' 如要要进行类似QQ号码的定长匹配,可以用?来代替*,*是匹配0~多个字符,而?则表示只匹配一个字符 l 对表进行简单的count统计 select count(*),count(ddwuid) from sngsearch03 where thedate=20140511 limit 0,100 注意下count(*)与count(ddwuid)的区别,前者不管列的值是否是null,计数都会加1,而且因为不需要读取字段的值,性能很高,后者需要判断改字段的值是否为null,如果是null则不会进行累加计数,所以大部分场景都推荐使用count(*) l 简单的统计函数,要注意平均数是average而不是avg select sum(acnt),average(acnt),max(acnt),min(acnt) from sngsearch03 where thedate=20140511 limit 0,100 l 分类汇总的写法group by select thedate,count(*),sum(acnt) from sngsearch03 where thedate=20140511 group by thedate limit 0,100 当然也可以对多个列进行gourp by select thedate,dwappidcount(*),sum(acnt) from sngsearch03 where thedate=20140511 group by thedate,dwappid limit 0,100 l 对分类汇总的结果进行排序(排序的列目前只能是单列) select thedate,count(*),sum(acnt) from sngsearch03 where thedate=20140511 group by thedate order by thedate limit 0,100 select thedate,count(*),sum(acnt) from sngsearch03 where thedate=20140511 group by thedate order by count(*) desc limit 0,100 select thedate,count(*),sum(acnt) as amt from sngsearch03 where thedate=20140511 group by thedate order by amt asc limit 0,100 三、使用限制与注意事项 l 全部的字段名和表名均为小写 l 如果是全文检索模式,每台机器存储的数据量往往是统计分析模式的十倍设置是百倍以上,故全文检索模式有额外的限制 请咨询阅读下面的限制,而且即使你无意中碰到了这些地方SQL疏忽写错了,我们的后台也会给予限制 1,禁止对全表进行全排序,全表分组或统计(包括order by ,group by,sum,avg,max,min), 2,禁止导出海量数据,比如说一次导出几万条,或者翻页翻到几万条记录以后 3,如果某个列的重复值特别少,禁止对这个列进行like模糊查询,如果要进行全文检索查询,可以将此列的类型更改为全文检索的字段类型 禁止对全表进行全排序,全表分组或统计 例如 下面的写法是不行的 select thedate,ddwuid,ddwlocaltime,dwinserttime,szlogstr from sngsearch18 where thedate in (20140508) order by dwinserttime desc limit 0,100 可以采用如下的写法,经过where过滤后的结果集比较小(暂约定为100w),那么是可以使用的 select thedate,ddwuid,ddwlocaltime,dwinserttime,szlogstr from sngsearch18 where thedate in (20140508) and ddwuid=7823 order by dwinserttime desc limit 0,100 select thedate,ddwuid,ddwlocaltime,dwinserttime,szlogstr from sngsearch18 where thedate in (20140508) and dwinserttime>=20140508202626 and dwinserttime<=20140508203026 order by dwinserttime desc limit 0,100 select thedate,ddwuid,sum(acnt),count(*) from sngsearch18 where thedate in (20140508) and ddwuid=7823 group by thedate,ddwuid limit 0,100; 当然了,如果真的要进行全表的扫描与统计,可以通过加机器来解决^_^ 四、SQL接口(全文检索模式地址) 调试入口 http://localhost:8080/sql.jsp?connstr=jdbc%3Amdrill%3A%2F%2Fhermeslocal&sql=select+thedate%2Cddwuin%2Cdwinserttime%2Cszlogstr%2Cddwlocaltime+from+sngsearch12+where+thedate+in+%28%2720140511%27%29+and+ddwuin%3D5713+order+by+ddwlocaltime+desc++limit+0%2C10%0D%0A&go=%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2 数据调用接口 http://localhost:8080/sqljson.jsp?connstr=jdbc%3Amdrill%3A%2F%2Fhermeslocal&sql=select+thedate%2Cddwuin%2Cdwinserttime%2Cszlogstr%2Cddwlocaltime+from+sngsearch12+where+thedate+in+%28%2720140511%27%29+and+ddwuin%3D5713+order+by+ddwlocaltime+desc++limit+0%2C10%0D%0A&go=%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2&callback=124

评论 (1)
  1. 沙发
    新用户053561 2017-04-10 03:49

    无聊吗?根本不无聊吗,你是怎么看的,眼拙吗?