之前在用HadoopML算法的时候就隐约感觉Hadoop实在是不适合ML这些比较复杂的算法。记得当时写完kmeans后,发现每个job完成后都需要将结果放在HDFS中,然后下次迭代的时候再从文件中读取,对于kmeans这种高迭代的算法,感觉Hadoop的瓶颈会出现在IO上,后来又写了个Naive bayes,这种非常简单的算法,用Hadoop写,由于只有一种mapreduce范式,完全感觉到力不从心,为了处理这些简单的格式,总共用了4mapreduce才完成,哭了。后面的logistics Regress等等只会让Hadoop更加难堪。

之前一直听spark如何虐Hadoop,但是舍友说spark只是因为在内存上跑,必然玩爆Hadoop,所以当时潜意识认为spark是内存版的Hadoop,昨天无意中看到关于sparkRDD的论文,感觉spark很适合写ML,并且性能比Hadoop好也并不全是因为在内存上跑,他所解决的问题刚好也是我在写Hadoop时候不想遇到的问题。同时spark最近这段时间这么火爆,没有理由不尝试下。

总的来说安装spark是比较简单的,可能是因为之前已经装了Hadoop

由于我已经装了Hadoop2.4了,所以下了spark-1.3.0-bin-hadoop2.4。安装spark还需要有jdkpythonscala。因为装Hadoop的时候已经装了jdkpython了,所以只介绍下安装scalaspark

安装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

接着是修改配置文件

添加从节点IP

vi slaves

我这里添加了两个节点

10.107.8.110

10.107.8.120

2

修改spark的环境,主要是jdkscala以及Hadoop的路径,masterIP

添加:

export JAVA_HOME=(你自己的jdk路径,如果不清楚可以在shell中打$JAVA_HOME

export SCALA_HOME=(你的scala路径)

export SPARK_MASTER_IP=(masterhostname)

export SPARK_WORKER_MEMORY=4g(这个具体看你节点的配置了)

export HADOOP_CONF_DIR=(如果不清楚可以在shell$HADOOP_CONF_DIR)

接着就是将spark复制到另外的节点上就好了。

如果一切顺利,spark就算是安装完了。

简要验证

在浏览器上输入masterIP:8080例如我这里是http://10.107.8.110:8080/

会出现各个worker的节点状况

 

输入http://10.107.8.110:4040则会出现sparkjobs

 

进入到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()

 

posted on 2015-06-18 16:54  sunrye  阅读(775)  评论(2编辑  收藏  举报