基于ALS算法的简易在线推荐系统

根据作者的后一篇文章的介绍,这应该是他在Intel做实习生的时候两个半月做个一个实习项目: 《Spark上流式机器学习算法实现”终期检查报告 》
原文地址: 基于ALS算法的简易在线推荐系统

继前期完成广义线性模型的在线流式机器学习的代码后,我们对spark的mllib中的推荐系统这一部分比较感兴趣,因为推荐系统这一部分在现实生活中也非常实用,尤其是基于地理位置的在线推荐系统目前非常火热,很多商业软件如大众点评,淘点点等都希望能根据用户以往的一些行为和当前所处的地理位置给用户做出最佳的推荐,给用户带来意想不到的惊喜。

在推荐系统领域,目前市面上中文的参考书并不多,我们主要学习了目前就职于hulu公司的项亮编著的《推荐系统实战》这本书,这本书详细的介绍了推荐系统方面的一些典型算法和评估方法,并且结合作者的实际经验给出了很多推荐系统的相关实例,是学习推荐系统不可多得的一本好书,我们也受益匪浅。

在spark的例程中作者是根据movielens数据库(采用spark自带的小型movielens数据库在spark的data/mllib/sample_movielens_data.txt中)通过ALS(alternating leastsquares)算法来做的推荐系统。参考链接 http://spark.apache.org/docs/latest/mllib-collaborative-filtering.html

最初我们也是用上面所说的1500个的数据集进行在线ALS算法的有效性,效果还不错,后面我们采用中等规模的movielens数据集进行测试,取得比较好的效果,具体过程记录如下。数据集的链接如下http://grouplens.org/datasets/movielens/.

这种ALS算法不像基于用户或者基于物品的协同过滤算法一样,通过计算相似度来进行评分预测和推荐,而是通过矩阵分解的方法来进行预测用户对电影的评分。即如下图所示。

阅读全文

大数据计算新贵Spark在国内知名厂商中的应用汇总

MapReduce由于其设计上的约束只适合处理离线计算,在实时查询和迭代计算上仍有较大的不足,而随着业务的发展,业界对实时查询和迭代分析有更多的需求,单纯依靠MapReduce框架已经不能满足业务的需求了。Spark由于其可伸缩、基于内存计算等特点,且可以直接读写Hadoop上任何格式的数据,成为满足业务需求的最佳候选者。

Spark作为Apache顶级的开源项目,项目主页见http://spark.apache.org。在迭代计算,交互式查询计算以及批量流计算方面都有相关的子项目,如Shark、Spark Streaming、MLbase、GraphX、SparkR等。从13年起Spark开始举行了自已的Spark Summit会议,会议网址见http://spark-summit.org。Amplab实验室单独成立了独立公司Databricks来支持Spark的研发。

为了满足挖掘分析与交互式实时查询的计算需求,腾讯大数据使用了Spark平台来支持挖掘分析类计算、交互式实时查询计算以及允许误差范围的快速查询计算,目前腾讯大数据拥有超过200台的Spark集群,并独立维护Spark和Shark分支。Spark集群已稳定运行2年,他们积累了大量的案例和运营经验能力,另外多个业务的大数据查询与分析应用,已在陆续上线并稳定运行。在SQL查询性能方面普遍比MapReduce高出2倍以上,利用内存计算和内存表的特性,性能至少在10倍以上。在迭代计算与挖掘分析方面,精准推荐将小时和天级别的模型训练转变为Spark的分钟级别的训练,同时简洁的编程接口使得算法实现比MR在时间成本和代码量上高出许多。

阅读全文

Scala简明教程

Scala是一门多范式(multi-paradigm)的编程语言。
Scala源代码被编译成Java字节码,所以它可以运行于JVM之上,并可以调用现有的Java类库。
洛桑联邦理工学院的Martin Odersky于2001年基于Funnel的工作开始设计Scala。Funnel是把函数式编程思想和佩特里网相结合的一种编程语言。Odersky先前的工作是Generic Java和javac。Java平台的Scala于2003年底/2004年初发布。该语言第二个版本,v2.0,发布于2006年3月。

  • Scala是面向对象的,比Java更彻底
    一切皆为对象, 数值,函数都是对象
  • 全部支持函数式编程
    包括函数即是对象,lambda,currying, type inference, immutability, lazy evaluation, and pattern matching
  • 强大的静态类型系统
    algebraic data types, covariance and contravariance, higher-order types, anonymous types, generic classes, upper and lower type bounds, inner classes and abstract types as object members, compound types, explicitly typed self references , views and polymorphic methods
  • 其它Java不支持的功能: operator overloading, optional parameters, named parameters, raw strings, and no checked exceptions

2009年4月,Twitter宣布他们已经把大部分后端程序从Ruby迁移到Scala,其余部分也打算要迁移。这里有一篇文章解释Twitter为什么使用Scala编程语言。
Engineer-to-Engineer Series Programming Languages Programming Languages Scala Talks
Coursera把Scala作为服务器语言使用。Why we love Scala at Coursera
一些Scala学习资料:

大数据生态圈中的Kafka和Spark都是由Scala开发的,这也是我为什么学习Scala的原因之一。
作为一个十多年Java程序员,同时在学习Scala和go这两种语言。 学习的过程中感觉go语言太好学了, 入手很快, 而Scala的语法和类C语言如Java,C#等很不一样, 很多语法的技巧在里面。 基于此,我特地整理了这篇文章。 简单扼要的介绍Scala语言的知识点,尤其是和Java不太一样的地方。

阅读全文

[译]Protobuf 语法指南

英文: Proto Buffers Language Guide

本指南描述了怎样使用protocol buffer 语法来构造你的protocol buffer数据,包括.proto文件语法以及怎样生成.proto文件的数据访问类。
(本文只针对proto2的语法)

本文是一个参考指南——如果要查看如何使用本文中描述的多个特性的循序渐进的例子,请在http://code.google.com/intl/zh-CN/apis/protocolbuffers/docs/tutorials.html中查找需要的语言的教程。

阅读全文

Spark Streaming 集成 Kafka 总结


最近在做利用Spark streaming和Kafka进行数据分析的研究, 整理一些相应的开发文档, 做了一些代码实践。 本文特意将这些资料记录下来。

本文最后列出了一些参考的文档,实际调研中参考了很多的资料,并没有完全将它们记录下来, 只列出了主要的一些参考资料。
当前的版本:

  • Spark: 1.2.0
  • Kafka: 0.8.1.1

Spark Streaming属于Spark的核心api,它支持高吞吐量、支持容错的实时流数据处理。 有以下特点:

  • 易于使用
    提供了和批处理一致的高级操作API,可以进行map, reduce, join, window。

  • 容错
    Spark Streaming可以恢复你计算的状态, 包括lost work和operator state (比如 sliding windows)。 支持worker节点和driver 节点恢复。

  • Spark集成
    可以结合批处理流和交互式查询。 可以重用批处理的代码。还可以直接使用内置的机器学习算法、图算法包来处理数据。
    它可以接受来自文件系统, Akka actors, rsKafka, Flume, Twitter, ZeroMQ和TCP Socket的数据源或者你自己定义的输入源。

    阅读全文

Android中Handler引起的内存泄露

在Android常用编程中,Handler在进行异步操作并处理返回结果时经常被使用。通常我们的代码会这样实现。

1
2
3
4
5
6
7
8
9
public class SampleActivity extends Activity {
private final Handler mLeakyHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
// ...
}
}
}

但是,其实上面的代码可能导致内存泄露,当你使用Android lint工具的话,会得到这样的警告

In Android, Handler classes should be static or leaks might occur, Messages enqueued on the application thread’s MessageQueue also retain their target Handler. If the Handler is an inner class, its outer class will be retained as well. To avoid leaking the outer class, declare the Handler as a static nested class with a WeakReference to its outer class

看到这里,可能还是有一些搞不清楚,代码中哪里可能导致内存泄露,又是如何导致内存泄露的呢?那我们就慢慢分析一下。

阅读全文

如何高效编写可维护代码?

原文:How to make your code self-documenting?
淡忘~浅思 翻译 如何高效编写可维护代码?

在代码中找到一个放错地方并且没有用的注释是不是很有趣呢?
怎么样才能做到写很少的注释但仍能让代码易于理解呢?
一个主要的方式就是让代码自我文档化。当代码自我文档化的时候,就不需要注释去它的作用或者目的,并且也能使代码变得非常容易维护。

阅读全文

为什么Disruptor会那么快?

Disruptor是一个高性能的线程间消息传递的框架。

LMAX 目标是成为当世最快的商务平台。 为了实现这个目标,LMAX需要做一些特殊的工作在Java平台上取得低延迟和高吞吐率的目标。 性能测试表明使用队列(queue)传递数据会带来延迟, 所以LAMX对这一块做了非常好的优化。

Disruptor就是他们的研究成果。 研究发现CPU级别的cache miss和 需要内核仲裁的锁非常的耗费性能, 所以他们创建了一个Disruptor, 这是一个锁无关的实现。

它不是一个为特别任务实现的方案,不仅仅应用于金融领域。Disruptor可以用来解决并发编程中的一个普遍的问题: 消息队列的处理(producer和consumer)。

它使用了一个和传统不一样方式来实现。 所以你可能不能用文本替换的方式使用ring buffer替换你代码中的Queue等。官方网站上提供了一些例子, 本文的参考文档上也列出了一些。 官方的技术白皮书介绍了一些你想知道的细节。 官方文档还提供了非常多的性能测试的代码,也是学习disruptor好材料。

Disruptor究竟有多块, 看官方的和ArrayBlockingQueue测试结果:

注意y轴的刻度是指数级别的, 如果按照均匀递增的刻度,一张图无法显示。
这张图可以这样解读。 x轴越靠近零的比例越多, 性能越好。
Disrutor延迟时间大部分小于1ns, 而ArrayBlockingQueue平均32ns左右了。

阅读全文

lock-free 编程介绍

这篇文章收集整理了lock free的编程概念。
如果在一个共享的数据结构上的操作都不需要互斥,那么它是无锁的。如果一个进程在操作中间被中断,其它进程不受影响。

lock free(翻译成 无锁或者锁无关)的优势

  • 通过减少阻塞和等待,来改进并发性和可扩展性。
  • 消除条件竞争(race condition)、死锁、可组合性不足带来的潜在问题。
  • 避免优先级反转

但是无锁编程不是万能药,因为无锁算法实现起来更复杂,它也有潜在问题,比如竞争(contention),这会极大地影响性能。从这一点出发,Herb引出了他的第一条强烈建议:

  • 在使用无锁技术前,你必须先测试你的程序,确定它有性能或可扩展性问题。
  • 实现无锁算法后,再次测试你的程序,确定结果得到了有效的改进。

阅读全文