之前在用Hadoop写ML算法的时候就隐约感觉Hadoop实在是不适合ML这些比较复杂的算法。记得当时写完kmeans后,发现每个job完成后都需要将结果放在HDFS中,然后下次迭代的时候再从文件中读取,对于kmeans这种高迭代的算法,感觉Hadoop的瓶颈会出现在IO上,后来又写了个Naive bayes,这种非常简单的算法,用Hadoop写,由于只有一种mapreduce范式,完全感觉到力不从心,为了处理这些简单的格式,总共用了4个mapreduce才完成,哭了。后面的logistics Regress等等只会让Hadoop更加难堪。
之前一直听spark如何虐Hadoop,但是舍友说spark只是因为在内存上跑,必然玩爆Hadoop,所以当时潜意识认为spark是内存版的Hadoop,昨天无意中看到关于spark的RDD的论文,感觉spark很适合写ML,并且性能比Hadoop好也并不全是因为在内存上跑,他所解决的问题刚好也是我在写Hadoop时候不想遇到的问题。同时spark最近这段时间这么火爆,没有理由不尝试下。
总的来说安装spark是比较简单的,可能是因为之前已经装了Hadoop。
由于我已经装了Hadoop2.4了,所以下了spark-1.3.0-bin-hadoop2.4。安装spark还需要有jdk,python,scala。因为装Hadoop的时候已经装了jdk和python了,所以只介绍下安装scala和spark
1 安装scala
下载scala-2.10.5
将其放置你的某个目录下,我这里是/home/Scala
接着解压缩
tar -xvzf scala-2.10.5.tgz
接着就是添加路径名
vi /etc/profile
增加两行
export SCALA_HOME=/home/Scala/scala-2.10.5
export PATH=$PATH:$SCALA_HOME/bin
接着便是立即生效
source /etc/profile
验证方式和java很像
scala -version
如果正确安装了,就会出现
Scala code runner version 2.10.5 --Copyright 2002-2013等信息
接着就可以将scala拷贝到另外几个节点上,我这里是两个节点,并且记得修改对应节点的profile文件
安装spark
同理,下载spark-1.3.0-bin-hadoop2.4。这里的Hadoop是根据你机子上的Hadoop版本来的,目前最新的spark版本是1.4,相比1.3最明显的就是增加了对R语言的支持,由于目前还用不到R,加之实验室机房不让用外网,安装R语言又比较麻烦,所以下载1.3.0了。
将spark-1.3.0-bin-hadoop2.4放置到你的某个目录下。例如我这里是/home/Spark/
解压缩
tar -xvzf spark-1.3.0-bin-hadoop2.4.tgz
接着是增加路径
vi /etc/profile
export SPARK_HOME=/home/Spark/spark-1.3.0-bin-hadoop2.4
export PATH=$PATH:$SPARK_HOME/bin
然后令其生效
source /etc/profile
接着是修改配置文件
1 添加从节点IP
vi slaves
我这里添加了两个节点
10.107.8.110
10.107.8.120
2
修改spark的环境,主要是jdk,scala以及Hadoop的路径,master的IP
添加:
export JAVA_HOME=(你自己的jdk路径,如果不清楚可以在shell中打$JAVA_HOME)
export SCALA_HOME=(你的scala路径)
export SPARK_MASTER_IP=(master的hostname)
export SPARK_WORKER_MEMORY=4g(这个具体看你节点的配置了)
export HADOOP_CONF_DIR=(如果不清楚可以在shell打$HADOOP_CONF_DIR)
接着就是将spark复制到另外的节点上就好了。
如果一切顺利,spark就算是安装完了。
简要验证
1 在浏览器上输入masterIP:8080例如我这里是http://10.107.8.110:8080/
会出现各个worker的节点状况
输入http://10.107.8.110:4040则会出现spark的jobs
2 进入到spark下的bin目录运行spark-shell
运行论文上的例子
我们先把一段文件放到HDFS中
hadoop fs -copyFromLocal /home/sunrye/words.txt hdfs://10.107.8.110:9000/spark_test/
接着运行
var lines=sv.textFile(“hdfs://10.107.8.110:9000/sprak_test/words.txt”)
此时相当于生成了一个RDD,接着就可以在RDD上实现各自action了,例如我们统计他的字数就可以
lines.count()
当然可也可查询某个关键字的字数,例如
lines.filter(_.contains(“the”)).count()