Ji ZHANG's Blog

If I rest, I rust.

Spark快速入门

Apache Spark是新兴的一种快速通用的大规模数据处理引擎。它的优势有三个方面:

  • 通用计算引擎 能够运行MapReduce、数据挖掘、图运算、流式计算、SQL等多种框架;
  • 基于内存 数据可缓存在内存中,特别适用于需要迭代多次运算的场景;
  • 与Hadoop集成 能够直接读写HDFS中的数据,并能运行在YARN之上。

Spark是用Scala语言编写的,所提供的API也很好地利用了这门语言的特性。它也可以使用Java和Python编写应用。本文将用Scala进行讲解。

安装Spark和SBT

  • 官网上下载编译好的压缩包,解压到一个文件夹中。下载时需注意对应的Hadoop版本,如要读写CDH4 HDFS中的数据,则应下载Pre-built for CDH4这个版本。
  • 为了方便起见,可以将spark/bin添加到$PATH环境变量中:
1
2
export SPARK_HOME=/path/to/spark
export PATH=$PATH:$SPARK_HOME/bin
  • 在练习例子时,我们还会用到SBT这个工具,它是用来编译打包Scala项目的。Linux下的安装过程比较简单:
    • 下载sbt-launch.jar到$HOME/bin目录;
    • 新建$HOME/bin/sbt文件,权限设置为755,内容如下:
1
2
SBT_OPTS="-Xms512M -Xmx1536M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=256M"
java $SBT_OPTS -jar `dirname $0`/sbt-launch.jar "$@"

数据挖掘指南[5]进一步探索分类

效果评估算法和kNN

让我们回到上一章中运动项目的例子。

在那个例子中,我们编写了一个分类器程序,通过运动员的身高和体重来判断她参与的运动项目——体操、田径、篮球等。

上图中的Marissa Coleman,身高6尺1寸,重160磅,我们的分类器可以正确的进行预测:

1
2
3
>>> cl = Classifier('athletesTrainingSet.txt')
>>> cl.classify([73, 160])
'Basketball'

对于身高4尺9寸,90磅重的人:

1
2
>>> cl.classify([59, 90])
'Gymnastics'

当我们构建完一个分类器后,应该问以下问题:

  • 分类器的准确度如何?
  • 结果理想吗?
  • 如何与其它分类器做比较?

前往GitHub阅读全文

离线环境下构建sbt项目

在公司网络中使用sbtMaven等项目构建工具时,我们通常会搭建一个公用的Nexus镜像服务,原因有以下几个:

  • 避免重复下载依赖,节省公司带宽;
  • 国内网络环境不理想,下载速度慢;
  • IDC服务器没有外网访问权限;
  • 用于发布内部模块。

sbt的依赖管理基于Ivy,虽然它能直接使用Maven中央仓库中的Jar包,在配置时还是有一些注意事项的。

数据挖掘指南[4]分类

在上几章中我们使用用户对物品的评价来进行推荐,这一章我们将使用物品本身的特征来进行推荐。这也是潘多拉音乐站所使用的方法。

内容:

  • 潘多拉推荐系统简介
  • 特征值选择的重要性
  • 示例:音乐特征值和邻域算法
  • 数据标准化
  • 修正的标准分数
  • Python代码:音乐,特征,以及简单的邻域算法实现
  • 一个和体育相关的示例
  • 特征值抽取方式一览

根据物品特征进行分类

前几章我们讨论了如何使用协同过滤来进行推荐,由于使用的是用户产生的各种数据,因此又称为社会化过滤算法。比如你购买了Phoenix专辑,我们网站上其他购买过这张专辑的用户还会去购买Vampire的专辑,因此会把它推荐给你;我在Netflix上观看了Doctor Who,网站会向我推荐Quantum Leap,用的是同样的原理。我们同时也讨论了协同过滤会遇到的种种问题,包括数据的稀疏性和算法的可扩展性。此外,协同过滤算法倾向于推荐那些已经很流行的物品。试想一个极端的例子:一个新乐队发布了专辑,这张专辑还没有被任何用户评价或购买过,那它将永远不会出现在推荐列表中。

这类推荐系统会让流行的物品更为流行,冷门的物品更无人问津。

— Daniel Fleder & Kartik Hosanagar 2009 《推荐系统对商品分类的影响》

这一章我们来看另一种推荐方法。以潘多拉音乐站举例,在这个站点上你可以设立各种音乐频道,只需为这个频道添加一个歌手,潘多拉就会播放和这个歌手风格相类似的歌曲。比如我添加了Phoenix乐队,潘多拉便会播放El Ten Eleven的歌曲。它并没有使用协同过滤,而是通过计算得到这两个歌手的音乐风格是相似的。其实在播放界面上可以看到推荐理由:

“根据你目前告知的信息,我们播放的这首歌曲有着相似的旋律,使用了声响和电音的组合,即兴的吉他伴奏。”在我的Hiromi音乐站上,潘多拉会播放E.S.T.的歌曲,因为“它有着古典爵士乐风,一段高水准的钢琴独奏,轻盈的打击乐,以及有趣的歌曲结构。”

潘多拉网站的推荐系统是基于一个名为音乐基因的项目。他们雇佣了专业的音乐家对歌曲进行分类(提取它们的“基因”)。这些音乐家会接受超过150小时的训练,之后便可用20到30分钟的时间来分析一首歌曲。这些乐曲特征是很专业的:

这些专家要甄别400多种特征,平均每个月会有15000首新歌曲,因此这是一项非常消耗人力的工程。

注意:潘多拉的音乐基因项目是商业机密,我不曾了解它的任何信息。下文讲述的是如何构造一个类似的系统。

前往GitHub阅读全文

MySQL异常UTF-8字符的处理

ETL流程中,我们会将Hive中的数据导入MySQL——先用Hive命令行将数据保存为文本文件,然后用MySQL的LOAD DATA语句进行加载。最近有一张表在加载到MySQL时会报以下错误:

1
Incorrect string value: '\xF0\x9D\x8C\x86' for column ...

经查,这个字段中保存的是用户聊天记录,因此会有一些表情符号。这些符号在UTF-8编码下需要使用4个字节来记录,而MySQL中的utf8编码只支持3个字节,因此无法导入。

根据UTF-8的编码规范,3个字节支持的Unicode字符范围是U+0000–U+FFFF,因此可以在Hive中对数据做一下清洗:

1
SELECT REGEXP_REPLACE(content, '[^\\u0000-\\uFFFF]', '') FROM ...

这样就能排除那些需要使用3个以上字节来记录的字符了,从而成功导入MySQL。

以下是一些详细说明和参考资料。

数据挖掘指南[3]隐式评价和基于物品的过滤算法

原文:http://guidetodatamining.com/chapter-3/

本章会从用户的评价类型开始讨论,包括显式评价(赞一下、踩一脚、五星评价等等)和隐式评价(比如在亚马逊上购买了MP3,我们可以认为他喜欢这个产品)。

内容:

  • 显式评价
  • 隐式评价
  • 哪种评价方式更准确?
  • 基于用户的协同过滤
  • 基于物品的协同过滤
  • 修正的余弦相似度
  • Slope One算法
  • Slope One的Python实现
  • MovieLens数据

第二章中我们学习了协同过滤和推荐系统的基本知识,其中讲述的算法是比较通用的,可以适用于多种数据集。用户使用5到10分的标尺来对不同的物品进行打分,通过计算得到相似的用户。但是,也有迹象表明用户通常不会有效地使用这种度量方式,而更倾向于给出极好或极差的评价,这种做法会使推荐结果变得不可用。这一章我们将继续探讨这个问题,尝试使用高效的方法给出更精确的推荐。

显式评价

用户的评价类型可以分为显式评价和隐式评价。显式评价指的是用户明确地给出对物品的评价,最常见的例子是Pandora和YouTube上的“喜欢”和“不喜欢”按钮:

以及亚马逊的星级系统:

隐式评价

所谓隐式评价,就是我们不让用户明确给出对物品的评价,而是通过观察他们的行为来获得偏好信息。示例之一是记录用户在纽约时报网上的点击记录。

经过几周的观察之后,我们就可以为用户刻画出一个合理的模型了——她不喜欢体育新闻,但关注科技新闻;如果用户连续看了两篇文章:《快速减肥方法》和《不反弹的减肥方式》,那她很可能正在减肥;如果她点击了iPhone的广告,就表明她或许对这款产品感兴趣。

试想一下,如果我们记录了用户在亚马逊上的操作记录,可以得出一些什么结论。你的首页上可能有这样的内容:

在这个示例中,亚马逊记录了用户的点击操作,因此它会知道浏览了Jupter Travel这本书的用户还浏览了Long Way Round这部DVD,其详细记录了演员伊万环球骑行的旅程。因此,亚马逊就用这些信息来做出“看过还看过”的推荐。

前往GitHub阅读全文

数据挖掘指南[2]推荐系统入门

原文:http://guidetodatamining.com/chapter-2/

内容:

  • 推荐系统工作原理
  • 社会化协同过滤工作原理
  • 如何找到相似物品
  • 曼哈顿距离
  • 欧几里得距离
  • 闵可夫斯基距离
  • 皮尔逊相关系数
  • 余弦相似度
  • 使用Python实现K最邻近算法
  • 图书漂流站(BookCrossing)数据集

你喜欢的东西我也喜欢

我们将从推荐系统开始,开启数据挖掘之旅。推荐系统无处不在,如亚马逊网站的“看过这件商品的顾客还购买过”板块:

last.fm上对音乐和演唱会的推荐(相似歌手):

在亚马逊的例子里,它用了两个元素来进行推荐:一是我浏览了里维斯翻译的《法华经》一书;二是其他浏览过该书的顾客还浏览过的译作。

本章我们讲述的推荐方法称为协同过滤。顾名思义,这个方法是利用他人的喜好来进行推荐,也就是说,是大家一起产生的推荐。他的工作原理是这样的:如果要推荐一本书给你,我会在网站上查找一个和你类似的用户,然后将他喜欢的书籍推荐给你——比如巴奇加卢比的《发条女孩》。

如何找到相似的用户?

所以首先要做的工作是找到相似的用户。这里用最简单的二维模型来描述。假设用户会在网站用五颗星来评价一本书——没有星表示书写得很糟,五颗星表示很好。因为我们用的是二维模型,所以仅对两本书进行评价:史蒂芬森的《雪崩》(纵轴)和拉尔森的《龙纹身的女孩》(横轴)。

首先,下表显示有三位用户对这两本书做了评价:

现在我想为神秘的X先生推荐一本书,他给《雪崩》打了四星,《龙纹身的女孩》两星。第一个任务是找出哪个用户和他最为相似。我们用距离来表示。

前往GitHub阅读全文

数据挖掘指南[1]简介

原文链接:http://guidetodatamining.com/chapter-1/

内容:

  • 寻找事物
  • 本书结构
  • 阅读完本书后你可以做些什么?
  • 为什么数据挖掘很重要?哪些内容可以为我所用?
  • 标题里的“Numerati的古老艺术”是什么意思?

Shoshin

如果你每天都能重复做这些简单的事,你就会获得某种特别的力量。在你获得之前,这是特别的,但获得之后,就没什么大不了的了。

——鈴木 俊隆

在阅读本书之前,你可能会认为像潘多拉、亚马逊那样的推荐系统、或是恐怖分子用的数据挖掘系统,一定会非常复杂,只有拥有博士学位的人才能够了解其中的算法。你也许会认为设计出这些系统的人都是研究火箭技术的。而我撰写本书的目的之一就是希望能够揭开这些系统的神秘面纱,展示它们所使用的基本原理。虽然的确会有像Google工程师或是在国家安全局工作的天才技术人员,数据挖掘却是建立在一些基本逻辑和方法之上的,非常易于理解。在阅读本书之前,你可能会认为数据挖掘是一种让人震惊的技术,但阅读之后你会发现,其实也没什么大不了的。

上图中的日本文字“初心”,表示要始终保持一颗“初学者的心”,也就是一种开放的心态,接受各种可能性。下面这个故事你可能在哪儿听过(很有可能是来自李小龙的“龙争虎斗”):一位教授想要寻求指引,于是来到一位智者面前,希望能得到点化。这个教授不停地说着自己毕生学到了什么,发表了多少论文等等。这时,智者问他:“喝茶吗?”然后开始向教授的杯子里倒茶,一直倒,最后溢到了桌子上、地上。“你在干什么?”教授大叫道。智者说:“我在倒茶。你的思想就像这个茶杯,已经倒满了茶,容不下任何其他东西。你必须先放空你的思想,我们才能继续往下说。”

在我看来,优秀的程序员就像是空的茶杯,他不断地探索着新的技术(noSQL、node-js等等)。普通的程序员沉浸在那些固有的想法中:C++很棒,Java不好,PHP只能用来编写网页,MySQL是数据库的唯一选择。我希望你能够以开放的心态阅读本书,从而发现一些有价值的东西。正如铃木俊隆所说:

在初学者眼中,世界充满了可能;专家眼中,世界大都已经既定。

前往GitHub阅读全文

在CDH 4.5上安装Shark 0.9

Spark是一个新兴的大数据计算平台,它的优势之一是内存型计算,因此对于需要多次迭代的算法尤为适用。同时,它又能够很好地融合到现有的Hadoop生态环境中,包括直接存取HDFS上的文件,以及运行于YARN之上。对于Hive,Spark也有相应的替代项目——Shark,能做到 drop-in replacement ,直接构建在现有集群之上。本文就将简要阐述如何在CDH4.5上搭建Shark0.9集群。

准备工作

  • 安装方式:Spark使用CDH提供的Parcel,以Standalone模式启动
  • 软件版本
  • 服务器基础配置
    • 可用的软件源(如中科大的源
    • 配置主节点至子节点的root账户SSH无密码登录。
    • /etc/hosts中写死IP和主机名,或者DNS做好正反解析。

Use WebJars in Scalatra Project

As I’m working with my first Scalatra project, I automatically think of using WebJars to manage Javascript library dependencies, since it’s more convenient and seems like a good practice. Though there’s no official support for Scalatra framework, the installation process is not very complex. But this doesn’t mean I didn’t spend much time on this. I’m still a newbie to Scala, and there’s only a few materials on this subject.

Add WebJars Dependency in SBT Build File

Scalatra uses .scala configuration file instead of .sbt, so let’s add dependency into project/build.scala. Take Dojo for example.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
object DwExplorerBuild extends Build {
  ...
  lazy val project = Project (
    ...
    settings = Defaults.defaultSettings ++ ScalatraPlugin.scalatraWithJRebel ++ scalateSettings ++ Seq(
      ...
      libraryDependencies ++= Seq(
        ...
        "org.webjars" % "dojo" % "1.9.3"
      ),
      ...
    )
  )
}

To view this dependency in Eclipse, you need to run sbt eclipse again. In the Referenced Libraries section, you can see a dojo-1.9.3.jar, and the library lies in META-INF/resources/webjars/.