环境:CentOS 6.4, Hadoop 1.1.2, JDK 1.7, Spark 0.7.2, Scala 2.9.3

折腾了几天,终于把Spark 集群安装成功了,其实比hadoop要简单很多,由于网上搜索到的博客大部分都还停留在需要依赖mesos的版本,走了不少弯路。

1. 安装 JDK 1.7

yum search openjdk-devel
sudo yum install java-1.7.0-openjdk-devel.x86_64
/usr/sbin/alternatives --config java
/usr/sbin/alternatives --config javac
sudo vim /etc/profile
# add the following lines at the end
export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.19.x86_64
export JRE_HOME=$JAVA_HOME/jre
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
# save and exit vim
# make environment variables take effect immediately
$ source /etc/profile
# test
$ java -version

参考我的另一篇博客,安装和配置CentOS服务器的详细步骤

2. 安装 Scala 2.9.3

Spark 0.7.2 依赖 Scala 2.9.3, 我们必须要安装Scala 2.9.3.

下载 scala-2.9.3.tgz 并 保存到home目录.

$ tar -zxf scala-2.9.3.tgz
$ sudo mv scala-2.9.3 /usr/lib
$ sudo vim /etc/profile
# add the following lines at the end
export SCALA_HOME=/usr/lib/scala-2.9.3
export PATH=$PATH:$SCALA_HOME/bin
# save and exit vim
# make environment variables take effect immediately
source /etc/profile
# test
$ scala -version

3. 下载预编译好的Spark

下载预编译好的Spark, spark-0.7.2-prebuilt-hadoop1.tgz.

如果你想从零开始编译,则下载源码包,但是我不建议你这么做,因为有一个Maven仓库,twitter4j.org, 被墙了,导致编译时需要翻墙,非常麻烦。如果你有DIY精神,并能顺利翻墙,则可以试试这种方式。

4. 本地模式

4.1 解压

$ tar -zxf spark-0.7.2-prebuilt-hadoop1.tgz

4.2 设置SPARK_EXAMPLES_JAR 环境变量

$ vim ~/.bash_profile
# add the following lines at the end
export SPARK_EXAMPLES_JAR=$SPARK_HOME/examples/target/scala-2.9.3/spark-examples_2.9.3-0.7.2.jar
# save and exit vim
# make environment variables take effect immediately
$ source /etc/profile

这一步其实最关键,很不幸的是,官方文档和网上的博客,都没有提及这一点。我是偶然看到了这两篇帖子,Running SparkPi, Null pointer exception when running ./run spark.examples.SparkPi local,才补上了这一步,之前死活都无法运行SparkPi。

4.3 (可选)设置 SPARK_HOME环境变量,并将SPARK_HOME/bin加入PATH

$ vim ~/.bash_profile
# add the following lines at the end
export SPARK_HOME=$HOME/spark-0.7.2
export PATH=$PATH:$SPARK_HOME/bin
# save and exit vim
# make environment variables take effect immediately
$ source /etc/profile

4.4 现在可以运行SparkPi了

$ cd ~/spark-0.7.2
$ ./run spark.examples.SparkPi local 

5. 集群模式

Environment:CentOS 6.4, Hadoop 1.1.2, JDK 1.7, Spark 0.7.2, Scala 2.9.3

After a few days hacking , I have found that installing a Spark cluster is exteremely easy :)

1. Install JDK 1.7

yum search openjdk-devel
sudo yum install java-1.7.0-openjdk-devel.x86_64
/usr/sbin/alternatives --config java
/usr/sbin/alternatives --config javac
sudo vim /etc/profile
# add the following lines at the end
export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.19.x86_64
export JRE_HOME=$JAVA_HOME/jre
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
# save and exit vim
# make environment variables take effect immediately
$ source /etc/profile
# test
$ java -version

2. Install Scala 2.9.3

Spark 0.7.2 depends on Scala 2.9.3, So we must install Scala of version 2.9.3.

Download scala-2.9.3.tgz and save it to home directory.

$ tar -zxf scala-2.9.3.tgz
$ sudo mv scala-2.9.3 /usr/lib
$ sudo vim /etc/profile
# add the following lines at the end
export SCALA_HOME=/usr/lib/scala-2.9.3
export PATH=$PATH:$SCALA_HOME/bin
# save and exit vim
# make environment variables take effect immediately
source /etc/profile
# test
$ scala -version

3. Download prebuilt packages

Download prebuilt packages, spark-0.7.2-prebuilt-hadoop1.tgz.

If you want to compile it from scratch, download the source package, but I don’t recommend this way, because in Chinese Mainland the GFW has blocked one of maven repositories, twitter4j.org, which makes the compilation an impossible mission unless you can conquer GFW.

4. Local Mode

4.1 Untar the tarball

$ tar -zxf spark-0.7.2-prebuilt-hadoop1.tgz

4.2 Set the SPARK_EXAMPLES_JAR environment variable

$ vim ~/.bash_profile
# add the following lines at the end
export SPARK_EXAMPLES_JAR=$SPARK_HOME/examples/target/scala-2.9.3/spark-examples_2.9.3-0.7.2.jar
# save and exit vim
# make environment variables take effect immediately
$ source /etc/profile

This is the most important step that must be done , but unfortunately the official docs and most web blogs haven’t mentioned this. I found this step when I bumped into these posts, Running SparkPi, Null pointer exception when running ./run spark.examples.SparkPi local.

4.3 (Optional)Set SPARK_HOME and add SPARK_HOME/bin to PATH

$ vim ~/.bash_profile
# add the following lines at the end
export SPARK_HOME=$HOME/spark-0.7.2
export PATH=$PATH:$SPARK_HOME/bin
# save and exit vim
# make environment variables take effect immediately
$ source /etc/profile

4.4 Now you can run SparkPi.

$ cd ~/spark-0.7.2
$ ./run spark.examples.SparkPi local 

5. Cluster Mode

Ubuntu上安装,请参考我的另一篇博客,在Ubuntu上安装Hadoop

环境:CentOS 6.4, JDK 1.7, Hadoop 1.1.2

1. 用vmware workstation 创建三台虚拟机

首先用vmware workstation 新建一台CentOS 6.4,装好操作系统,选择 Basic Server,安装JDK,参考我的另一篇博客,安装和配置CentOS服务器的详细步骤。安装好后然后用浅拷贝Create a linked clone 克隆出两台作为slave,这样有了三台虚拟机。启动三台机器,假设IP分别为192.168.1.131, 192.168.1.132, 192.168.1.133, 131做为master 和 SecondaryNameNode, 身兼两职, 132和133为 slaves。

2 关闭防火墙

临时关闭防火墙

$ sudo service iptables stop 下次开机后,防火墙还是会启动。

永久关闭防火墙

$ sudo chkconfig iptables off 由于这几台虚拟机是开发机,不是生产环境,因此不必考虑安全性,可以永久关闭防火墙,还能给开发阶段带来很多便利。

3. 修改hostname

这一步看起来貌似不必要,其实是必须的,否则最后运行wordcount等例子时,会出现“Too many fetch-failures”。因为HDFS用hostname而不是IP,来相互之间进行通信(见后面的注意1)。

在CentOS上修改hostname,包含两个步骤(假设将hostname1改为hostname2,参考这里,但不需要第一步):

  1. /etc/sysconfig/network 內的 HOSTNAME 改成 hostname2
  2. hostname命令,临时修改机器名, sudo hostname hostname2

exit命令退出shell,再次登录,命令提示字符串就会变成[dev@hostname2 ~]$

用上述方法,将131改名为master,132改名为slave01,133改名为slave02。

在三台机器的/etc/hosts文件中,添加以下三行内容

192.168.1.131 master
192.168.1.132 slave01
192.168.1.133 slave02

4. 本地模式和伪分布式模式

为了能顺利安装成功,我们先练习在单台机器上安装Hadoop。在单台机器上,可以配置成本地模式(local mode)和伪分布式模式(Pseudo-Distributed Mode),参考官方文档Single Node Setup

将 hadoop-1.1.2-bin.tar.gz 上传到三台机器的 home目录下,然后解压。注意,三台机器hadoop所在目录必须一致,因为master会登陆到slave上执行命令,master认为slave的hadoop路径与自己一样。

4.1 编辑 conf/hadoop-env.sh,设置 JAVA_HOME

cd hadoop-1.1.2
vim conf/hadoop-env.sh

注释掉第8行的JAVA_HOME,设置正确的JDK位置

export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.19.x86_64

4.2 测试本地模式是否正常

默认情况下,Hadoop就被配置为本地模式,现在就可以开始测试一下。

$ mkdir input 
$ cp conf/*.xml input 
$ bin/hadoop jar hadoop-examples-*.jar grep input output 'dfs[a-z.]+' 
$ cat output/*

可以看到正常的结果,说明本地模式运行成功了,下面开始配置伪分布式模式。

阅读Spark源代码,最简单的方式是下载源码包,解压后用纯文本方式来阅读源码。这样效率不高,可以用sbteclipse这个插件,将sbt项目文件转化为eclipse项目文件,然后导入到Scala IDE,用eclipse来阅读源码,效率大大提高。

环境:Windows 7, JDK 1.6

  1. 安装 scala。去官网 http://www.scala-lang.org/ ,下载MSI,安装,按默认设置即可。
  2. 安装 sbt。去官网 http://www.scala-sbt.org/ , 下载MSI,安装,按默认设置即可。 Linux下可以省略以上两步,spark源码自带了一个sbt,且启动sbt时它会自动下载对应的scala编译器。

  3. 安装 Scala IDE。 去官网 http://scala-ide.org/,点击”Get the SDK”绿色按钮,下载。这个IDE的好处是,自带了scala编译器,解压即可使用。

  4. 下载spark源码。 去官网 http://spark-project.org/ 下载源码,当前版本是 0.7.2, source package 大约4M左右。解压源码,例如 解压到 d:spark-0.7.0\

  5. 添加 sbteclipse 插件依赖。spark已经添加了依赖,这一步什么也不需要做。

    这个插件的作用,就是能够读取sbt的配置文件,生成一个eclipse的工程文件。有了eclipse工程文件,就可以导入到eclipse了。

    spark已经添加了依赖,见 d:\spark-0.7.2\project\plugins.sbt,有一行

    addSbtPlugin(“com.typesafe.sbteclipse” % “sbteclipse-plugin” % “2.1.1”)

  6. 启动cmd,启动sbt。

    cd d:\spark-0.7.0
    sbt

    Linux下则是

    cd d:\spark-0.7.0
    sbt/sbt

    开始下载各种依赖包,需要等待很长时间。

  7. 翻@_@墙。见本文最后一段。

发行版(distribution)

TeX类似于Linux,有很多不同的发行版(distribution)。

先看看各个发行版的流行程度。

名字 官网 PR Alexa 最后更新 weibo quora
TeX Live http://www.tug.org/texlive/ 7 N/A 2012-07-01 43 N/A
MiKTeX http://miktex.org/ 7 188,485 1.3.2 2012-09-24 54 N/A
CTeX http://www.ctex.org/ 6 252,657 2.9.2 2012-03-30 344 N/A
proTeXt http://www.tug.org/protext/ 7 N/A 3.1.1 2012-07-23 10 N/A

其中CTeX和proTeXt都是基于MiKTeX的,再次进行了打包。国内估计用CTeX比较多。

编辑器(editor)

编辑器大概分为两种,一种为WYSIWYG,所见即所得,实时预览,类似于Word,另一种是纯文本编辑器,有语法高亮,没有预览功能,需要另外安装一个发行版,编译成PDF后才能预览。

先看看各个编辑器的流行程度。

名字 官网 PR Alexa 预览类型 最后更新 weibo quora
TeXmaker http://www.xm1math.net/texmaker/ 6 289,311 无预览 4.0.1 2013-03-16 60 N/A
TeXworks http://www.tug.org/texworks/ 5 90,230 无预览 0.4.4 2012-04 23 N/A
TeXstudio http://texstudio.sourceforge.net/ 6 N/A 无预览 2.5.2 2013-01-08 15 N/A
TeXnicCenter http://www.texniccenter.org/ 7 884,570 无预览 v2.0 beta1 2012-11-03 10 N/A
Lyx http://www.lyx.org/ 6 261,649 实时预览 2.0.5.1 2013-01-08 56 42
Bakoma http://www.bakoma-tex.com/ 5 1,327,901 实时预览 10.10 2013-01-13 3 N/A
TeXmacs http://www.texmacs.org 6 1,525,373 实时预览 1.0.7.19 2013-03-27 27 N/A
LEd http://www.latexeditor.org/ 6 624,564 实时预览 0.53 2009-10-09 0 N/A

实时预览

使用如下命令可以实现实时预览:

1
rake preview

rake preview 会自动监视文件的变化,重新生成静态页面。因此修改markdown文件后,只需要在浏览器里刷新一下页面,就立刻可以看到效果。不过如果修改了_config.yml的话,则需要Ctrl+C终止,用rake generate重新生成,才能看到效果。

嵌入代码块

见官方文档Sharing Code Snippets

Octopress是一款为hacker量身定制的博客系统,当然内置了代码高亮的功能!它的代码高亮功能是通过Pygments实现的,配色方案用的是Solarized,堪称完美。

Octopress支持多种方式嵌入代码,可以直接嵌入代码,也可以引用github上的gist 。

我喜欢用三个反引号直接嵌入代码,比 codeblock要简洁。

启用MathJax

source/_includes/custom/footer.html的第一行加入如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!-- mathjax config similar to math.stackexchange -->
<script type="text/x-mathjax-config">
MathJax.Hub.Config({
  jax: ["input/TeX", "output/HTML-CSS"],
  tex2jax: {
    inlineMath: [ ['$', '$'] ],
    displayMath: [ ['$$', '$$']],
    processEscapes: true,
    skipTags: ['script', 'noscript', 'style', 'textarea', 'pre', 'code']
  },
  messageStyle: "none",
  "HTML-CSS": { preferredFont: "TeX", availableFonts: ["STIX","TeX"] }
});
</script>
<script src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_HTML" type="text/javascript"></script>

这样就引入了MathJax的JS包,可以直接在markdown文件里直接写公式了,例如 $\dfrac {\pi}{2}$。

上面的代码也可以在source/_includes/custom/header.html里添加,不过这样会使得页面的加载速度变慢。还可以在source/_layouts/default.html里添加。

前提条件

注册一个github账号。

任何资料,都不如OctopressGithub Pages的官方文档,建议首先阅读官方文档。

GitHub Pages快速体验

在GitHub网站上,点击右上角的+号图标,创建一个新的Repo,Repository 的名字必须为 username.github.com。然后点击Settings进入该Repo的设置页面。看到”Automatic Page Generator”,说明这个Repo已经启用了GitHub Page。点击按钮进入设置。

在”Create a GitHub User Page”填写一些基本信息,点击右下角的”Continue to Layout”。布局就用默认的,点击绿色的”Publish”按钮。

大功告成,输入”username.github.com”,看到一个页面没?这就是你刚刚创建的一个页面。

以下记录了我的学习历程,按我的阅读顺序排序。

距离和相似度度量

距离和相似度度量 » webdataanalysis.net

欧氏距离和余弦相似度的区别是什么? – 知乎

KNN(K Nearest Neighbor)

K Nearest Neighbor 算法 _ 酷壳 – CoolShell

K-nearest neighbors algorithm – Wikipedia

K-Means

K-Means 算法 _ 酷壳 – CoolShell

k-means clustering – Wikipedia

K-Means++ _ 愈宅屋

算法杂货铺——k均值聚类(K-means) – T2噬菌体 – 博客园

漫谈 Clustering (1)_ k-means « Free Mind

Text Documents Clustering using K-Means Algorithm – CodeProject

今天把各个主流的编程网站仔细对比了一下,下面从各个角度对比一下这些编程竞赛网站。

分类和排名

网站地址

类别

PR

ATR

QF

主办方

备注

TopCoder

综合

6

33,586

4167

TopCoder公司

 

CodeChef

综合

6

41,217

5758

Directi公司

 

CodeForces

综合

5

73,012

599

CodeForces公司

 

SPOJ

ACM

3

75,653

1520

Sphere Research Labs

 

POJ

ACM

7

364,925

N/A

北京大学

 

ZOJ

ACM

6

N/A

N/A

浙江大学

 

UVA OJ

ACM

6

166,991

N/A

University of Virginia

 

SGU OJ

ACM

5

194,881

N/A

Saratov State University

 

HackerRank

综合

5

126,192

56

InterviewStreet公司

 

Project Euler

数学

6

53,854

428

Project Euler公司

 

CareerUp

面试

4

51,089

654

CareerUp公司

 

LeetCode

面试

4

188,196

N/A

LeetCode公司

 

说明:PR是Google PageRank的缩写;ATR是Alexa Trafic Rank的缩写,即Alexa排名;QF是Quora Followers的缩写,具体含义是在Quora上关于某Topic的follower数量,例如CodeChef的topic 有5758个followers。

BLAS 接口

BLAS, LAPACK, ATLAS 这些数值计算库的名字很类似,他们之间有什么关系呢?BLAS是一组线性代数运算接口,目前是事实上的标准,很多数值计算/科学计算都实现了这套接口。

BLAS定义了那些函数呢?可以查看官方文档

LAPACK是BLAS的第一个实现,是最老牌的数值计算库,用FORTRAN 77语言写的。LAPACK实现了BLAS接口,并扩充了一些功能。很多数值计算库/科学计算库底层调用了LAPACK。

很多硬件厂商都实现BLAS接口,例如Intel MKL(Math Kernel Library), AMCL(AMD Math Core Library)等。很多开源库也支持,例如ATLAS。

还有非常多的库实现了BLAS接口,见Wikipedia BLAS 的Implementations小节。

下面介绍一些各种语言常用的数值计算/科学计算库。