• mongo的坑

    mongo 作为nosql,与cassandra与hbase的优点是支持中庸的完善方便的查询DSL语言。同样支持二级索引也是比较迷人的。 相对couchbase来说还是二级索引做的不错。 Mongo 的坑 mongo 在集群方面,水平拓展性能比较差。 在mongo 2.0中的库级别的锁也是比较恶心(在mongo3.0 解决了)。和myql一样,当删除记录时,mongo的分配磁盘空间并不会回收,而是标记删除,预留给后来新插入的记录使用。 多语言与Mongo 如果同时使用java和python编程,可能遇到的问题是,java是静态语言,强类型语言。python只有整型数据(并不会特别可以区分int long),在保存记录时python可能会把整型数据保存为mongo的int32或者int64,造成类型不安全问题。同样java的时间类与python的时间类的时区问题也是比较恶心,


  • Elasticsearch

    Installing Elasticsearch curl -L -O http://download.elasticsearch.org/PATH/TO/VERSION.zip unzip elasticsearch-$VERSION.zip cd elasticsearch-$VERSION Installing Marvel Marvel is a management and monitoring tool for Elasticsearch Marvel is available as a plug-in. To download and install it, run this command in the Elasticsearch directory: ./bin/plugin -i elasticsearch/marvel/latest You probably don’t want Marvel to monitor your...


  • Redis在数据分析平台的用例

    Java中redis&kyro的缓存应用 在做服务化拆分过程中了,为了更好方便在各个应用需求中减少逻辑代码,而进一步方便拓展高可用。我们引入了thrift rpc+ zookeeper的分布式rpc服务。 过程中为了减少数据库的压力,加入redis做缓存层。用来缓存数据库查询结果和一些业务逻辑处理结果。开始使用的java原生的序列化发现字节空间比较浪费。 于是引入的kyro层,kyrox相对protobuf更加方便的在java使用,但缺点是对其他语言的基本是不支持。 在实时曲线最近60分,60秒曲线的应用 问题前景可以描述如下: 有 100 个产品,需要知道每个产品最近 60 秒的每秒请求负载数,并且可以看全国 400 个主要城市下以及华北,华东等聚合大区的负载指标。 分产品和城市储存的话 400*100 = 4w 个 k/v 数据 每秒写入 4w 条数据,对于任何数据库都是非常有挑战的 (放弃) 分产品存储,把同一时间戳各个大区和城市的指标聚成一条记录: 400 条每秒的记录量,数据库写入毫无压力。 为什么放弃 list 或者 有序集合, 因为需要多余的机制保证删除过期的数据,而使用 redis 过期 k/v 存储策略 ( 120 秒过期)能更好完成这项需求实现。(这些数据也会实时落地插入到 mysql 等备份)。 当展示最近 60 秒的数据时,我们发现可以在服务层缓存使用前 59 秒从 redis 已经拉取的数据。所以只要在服务后端加上一个内部缓存就可以加速数据的前端展示,因为后面的前端发请求带上时间戳,只要给时间戳后到现在时间几秒的数据(主要考虑到用户的网络延迟,大多数时间都是下一秒的数据)。最后当用户首次打开前端时,在网络正常的情况下,展示...


  • Elasticsearch index

    创建index 创建一个3个分片, 3个副本的索引库 PUT /blogs { "settings" : { "number_of_replicas": 3, "number_of_shards": 3 } } number_of_replicas 副本数量, 副本数是可以动态修改的。 number_of_shards 分片数,分片数量是固定的,指定后就不能修改了。 设置副本位2: PUT /blogs { "settings" : { "number_of_replicas": 2 } } 文档原元素(Document Metadata) 文档不尽含有数据,而且含有原元素。 index 文档储存所在的索引库 Where the document lives type 文档的类型 id 文档的唯一标识符 _index 存储相关文档的索引信息


  • 水塘抽样

    水塘抽样主要用来对未知大小数据集合或者数据非常大的集合中抽取随机的样本。 理论 假设有个N个元素的未知集合,取样品k个。 当N=1时, 选取到N的概率为K/1 = K。 当N=2, 因保证前面第一次抽样概览为K。 那么当此次抽样的概率的K/Q时, 保证了前面抽样不被替换概览为 K/(Q-1)*(1-1/Q) = K/Q && K/(Q-1) = K,得到新的均衡概览K/2. 因此 第N次时,N-1次的概览为K/N-1, K/(N-1)*(1-1/N) = K/N, 概率为K/N。 Spark中的水塘抽样算法 当抽样样品大小大于输入集合大小时取全集。 否则使用概览选择替换保一次性遍历且每个输入元素的概率都为1/N。 private[spark] object SamplingUtils { /** * Reservoir sampling implementation that also returns the input size. * * @param input input size * @param...