Skip to content
muyannian edited this page Aug 1, 2013 · 33 revisions

大量的zk报错

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

大分组的计算和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%。不过,能满足业务需求的设计就是好设计。

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

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被淘汰的时候,将逆旋的结果保留到硬盘中,以备下次使用。

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

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

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

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

请问下hadoop版本问题,我昨天试了hadoop 2.05.-alpha这个版本,但是在createtable的时候总是出现目录无法创建的问题,我想请问下用哪个版本的hadoop比较稳定,现在hadoop0.20.x的在官网上都没有了,选用hadoop1.1.X的行不?
亲 如果要测试 建议用hadoop 0.20.2版本,因为我用的也是这个版本,哈哈。

如果生产环境用的是其他版本,请更改pom.xml,将hadoop 版本做响应更改,更改成兼容版本

另外hadoop 2.05-alpha版本 我不建议使用,目前还不能作为生产环境使用,一般都是供hadoop爱好者 研究源码用的


如何编译源码
采用maven编译,编译命令为
mvn clean && mvn package assembly:assembly

创建索引时候我的分隔符为\001或\t如何设定啊
目前可以通过 设置为default和tab来表示\001和\t
示例如下
./bluewhale higo index fact_seller_all_d /data/fact_seller_all_d 1000 20010101 seq default
./bluewhale higo index fact_seller_all_d /data/fact_seller_all_d 1000 20010101 seq tab

执行创建索引的命令后无任何反应
./bluewhale higo index fact_seller_all_d /data/fact_seller_all_d 10 20010101 seq default
1、先确定原始数据目录是否存在,是否是按照日期分区
2.这里的10这个参数,表示只对最近10天的索引进行创建,确保存在最近10天的分区目录,以及最近10天的分区目录要有数据

报错:出现-data-hs_err_pid13033.log文件或者日志中提升下述信息 VirtualPortDispatch [INFO] Received invalid message directed at port 516. Dropping...
1.清理 storm.local.dir
2.确保 storm.local.dir有读写权限,硬盘可用
3.确保安装正确的zeroMq和jzmq版本,如果是64位系统,可以使用我传的这个https://github.com/alibaba/mdrill/tree/master/software
配置文件中的 worker.childopts与 higo.merge.ports有什么区别
worker.childopts用来标记 这台机器可以启动那些端口
higo.merge.ports用来标记 这些端口中那些是merger server的端口

配置文件中的 worker.childopts与 higo.merge.ports有什么区别
worker.childopts用来标记 这台机器可以启动那些端口
higo.merge.ports用来标记 这些端口中那些是merger server的端口

那我这样配置行么?

 supervisor.slots.ports:
    - 6701
    - 6702
    - 6703
    - 6704
    - 6705
    - 6706
    - 6707
    - 6708
    - 6601
    - 6602
    - 6603
    - 6604
 higo.merge.ports: "6601,6602,6603,6604"

这样是不是指定了8个shard端口和4个mage端口?
答,一般一台机器启动一个merger server就够了 ,没必要启动那么多
就一个6601 吧 merger server 不需要那么多的
merger server只管理合并数据,shard才是资源使用大户

Clone this wiki locally