Skip to content
muyannian edited this page Jul 30, 2013 · 33 revisions

Question1:大量的zk报错

  1. 请使用zookeeper-3.4.5.jar以及以上版本
  2. 如下几个配置请根据zk的负载情况配置
    tickTime=2000 
    initLimit=10
    syncLimit=5
    maxClientCnxns=300
    maxSessionTimeout=20000

Question2:大分组的计算和count(distinct)的讨论
    根据我们在电信行业的实践,经分系统中真正决定性能的都是一些大分组查询,无法通过数据预分布进行优化。现有的MPP架构对网络带宽要求确实比较高,否则节点的处理能力很难发挥出来。总体来看,开源软件在即席统计方面的性能水平,和商业软件差距极大。数据量一大,查询一复杂,基本上就跑不出来了。
    延年:大分组查询:我能不能这样理解,就是分类汇总后的组数特别多(例如uuid),这种场景会导致大量的网络IO。 针对这种情况我们采用近似计算,来解决这个IO问题,由于没整理文档,可以阅读我的开发日志。https://github.com/muyannian/higo/issues/117 与 https://github.com/muyannian/higo/issues/119
    神通冯柯:回复@延年:嗯,我觉得如果分组足够大,比如求 TOP N,我们可以在每个节点求TOP 10*N,再汇总,从概率的角度上看,对于许多应用都足够了。当然在商业应用中,很多时候我们并没有TOP N这个条件,应用就是要返回所有分组,比较常见的是OLAP建模,用户需要把分组统计结果导入到一个Cube中。
    延年:回复@神通冯柯:恩,mdrill在这个地方确实采用了近似计算,用以满足我们的业务,count(distinct)的计算也是类似,供大家参考,https://github.com/muyannian/higo/wiki/distinct

  神通冯柯:回复@延年:嗯,很不错,尽管我个人觉得,如果group key和dist key之间存在data skew的时候,准确度恐怕很难达到你宣称的99%。不过,能满足业务需求的设计就是好设计。

Question2:数据在内存中是如何存储的

1,mdrill是先进行分shard的,每个shard分布在不同的机器的不同的进程中
2, 每个shard是按照时间进行分区的,每个分区是一个索引
3,每个索引是按照列进行存储的,每次缓存的时候加载一个列的值到内存中,多个分区,多个表,多个列之间LRU方式淘汰
4.加载到内存中的列,并非是原始值,而是一个值的整形的代号,比方说用一个数字899代替一个很长的字符串

对内存结构的解释

  1. 将lucene默认的将整个列数据全部都load到内存中的方式修改为load 每个列的值的编码代号,操作的时候也仅仅操作这些代号,真正展现的时候再将这些编号转换成真实的值,编号的数据类型根据某个列的值的重复程度可以为byte,short,int
  2. 将数据进行分区(默认按照时间),用到的数据会加载到分区中,不用的分区会从内存中踢出,采用LRU的方式管理,如果同时需要检索大量的分区,则进行排队处理,一个分区一个分区的处理。
  3. 多个表之间也合并,共享内存,用到的表才会加载到内存中,没用到的则在硬盘中存储。
  4. 原先merger server与shard是在同一个进程中的,每次查询的时候随机使用其中一个shard作为merger server,如果每次查询merger server使用1G的内存,但shard的数量非常多,merger server每次只用一个,但是为每个shard都额外分配1G内存就是浪费,新版mdrill将这两者分开,避免浪费。
  5. 按照内存大小进行LRU,而不是按照field的个数,不同列因为重复读不同对内存的消耗也不一样,按照个数lru不合理,按照总内存使用LRU
  6. 由于每次逆旋都需要消耗时间,当lur被淘汰的时候,将逆旋的结果保留到硬盘中,以备下次使用。

Question3:mdrill依赖于一个jstorm的系统,我不是很理解mdrill的系统架构中是怎么使用jstorm这样的流式计算的?
mdrill使用jstorm做任务的监控和管理,如果某个任务挂了 nimbus会通过心跳的方式识别迁移该任务。并没有使用jstorm的流计算

Question4:如果我要部署一个mdrill的集群,zmq是必须在每个节点上面都安装部署么?
zeromq每个节点必须安装是因为,jstorm 依赖zeromq

Question5:./bluewhale mdrill index 创建索引的时候,{hdfs源数据地址}有没有什么格式上的要求,另外,{清洗多少天的数据}这个参数的含义具体是什么样子的?
1.hdfs源数据地址 必须有啊 安装文档有说明 ,数据要按照日期分区 ,并且要有 thedate字段 。
2.清洗多少天数据是因为这样,有很多系统只要求保存最近1年或一个月的数据,超过1年或一个月希望能踢出之前旧的数据
就是过期的数据希望能清理掉
3.数据是按照一定分隔符分割开的 ,默认文件格式为sequencefile格式(云梯标准格式),当然也可以设定为文本的格式

Question5:另外就是mdrill什么时候会将hdfs上面的index文件download到本地?我看文档里面没有涉及到这个步骤,是不是在“启动表”的时候?
启动的时候会download,然后 没间隔5分钟,会检查一下 校验文件vertify,如果那个分区的vertify不一致 ,那个索引重新下载
创建完的索引 目录有一个vertify文件
所以 这边索引创建完成后 最坏的情况是5分钟后才开始下载
Clone this wiki locally