CentOS 6.7 hadoop free版本Spark 1.6安装与使用

最近的工作主要围绕文本分类,当前的解决方案是用R语言清洗数据,用tm包生成bag of words,用libsvm与liblinear训练模型。这个方案可以hold住6/70万的训练集:

LIBLINEAR is efficient for large-scale document classification. Let us consider a large set rcv1 test.binary with 677,399 instances. $ time liblinear-1.21/train -c 0.25 -v 5 rcv1_test.binary Cross Validation Accuracy = 97.8538% 68.84s Note that reading the data takes most of the time. The training of each training/validation split is less than four seconds

当前我们用3万的训练集已经得到不错的分类结果,所以这个方案应该是足够用的;但是,在特征构造上R存在比较严重的性能缺陷,一方面暂时没有看到tm包与word2vec的结合方案,另一方面用R做PCA就是一个灾难(非常吃内存,也进一步导致计算很慢)。这时,碰巧看到spark mlib的文档里有一堆文本挖掘相关的工具,如:word2vec以及pca等等,因此下定决心把spark用起来。

spark安装

1.需要提前安装的软件:Java 7+, Scala 2.10, Hadoop

CentOS上Java的安装可以参考之前的文章CentOS 6安装Java 1.8; Scala最新的版本已经2.11但是spark官方提供的预编译下载包是基于Scala 2.10,并且自己编译Spark源码挺麻烦的所以还是建议使用2.10版本的Scala; 自己尝试过按照官方文档手动安装社区版的hadoop和hive,真是有非常多的坑。目前公司线上与线下环境使用的都是Cloudera发布的Hadoop即CDH,先安装cloudera manager,然后再通过cloudera manager的web版管理界面安装需要的服务,如:Hadoop,Hbase,Hive等等,Cloudera会帮忙配置好基本的环境变量,为非专职运维人员上手Hadoop平台提供了大大大便利。由于公司线上线下集群都已安装了cloudera manager,等以后有新集群再体验一遍安装流程吧。

2.spark下载

我选择了不依赖于特定Hadoop版本的二进制包进行下载:spark-1.6.1-bin-without-hadoop,这里官方文档有提示:

Users can also download a “Hadoop free” binary and run Spark with any Hadoop version by augmenting Spark’s classpath.

为了使用HDFS和YARN,Spark需要使用Hadoop的client libraryies,为此我们需要让环境变量SPARK_DIST_CLASSPATH包含Hadoop的jar包: [bash] # 得益于Cloudera安装Hadoop时会自动做一些配置操作,Hadoop相关的二进制文件可以用以下命令快速找到 echo $(hadoop classpath) # 在Spark目录下./conf/spark-env.sh里进行配置: export SPARK_DIST_CLASSPATH=$(hadoop classpath) # 再添加一下SPARK_HOME方便以后操作: export SPARK_HOME=/usr/share/spark-1.6.1-bin-without-hadoop [/bash]

3.环境变量配置

最后再持久化一些环境变量: [bash] # 编辑环境变量相关脚本: vim /etc/profile.d/spark.sh #!/bin/bash SPARK_DIST_CLASSPATH=$(hadoop classpath) SPARK_HOME=/usr/share/spark-1.6.1-bin-without-hadoop PATH=$SPARK_HOME/bin:$PATH HADOOP_CONF_DIR=/etc/hive/conf export SPARK_DIST_CLASSPATH SPARK_HOME HADOOP_CONF_DIR # 使脚本生效 source /etc/profile.d/spark.sh [/bash]

4.解决"Unable to load native-hadoop library for your platform"

Spark与HDFS以及YARN经常要配合使用,使用hadoop命令的时候有些同学会遇到"Unable to load native-hadoop library for your platform"警告,虽然不影响正常使用,但是总是提示挺烦人的。一番Google之后了解到hadoop自带的本地库版本是基于32位机器编译到,所以在64位的机子上面会出问题。自己编译64位的本地库太麻烦,可以从http://dl.bintray.com/sequenceiq/sequenceiq-bin/下载编译好的本地库,覆盖掉$HADOOP_HOME/lib/native/下的文件。

Spark开发

尝试过在IntelliJ里通过run直接运行Spark代码一直没成功,不过Spark要提交到集群上运行还是需要打成jar包的,因此决定能够在IDE里使用代码补全功能即可,之后用bash进行打包并提交到集群上。 [scala] # 1.用IntelliJ新建sbt项目 # 2.编辑项目的build.sbt文件(类似于maven的.pom): name := "SparkTest" version := "1.0" scalaVersion := "2.10.6" libraryDependencies += "org.apache.spark" %% "spark-core" % "1.6.1" # 3.在项目的./src/main/scala/下新建Scala类,SimpleApp: /* SimpleApp.scala */ import org.apache.spark.SparkContext import org.apache.spark.SparkContext._ import org.apache.spark.SparkConf object SimpleApp { def main(args: Array[String]) { val logFile = "file:///Users/xiexiaowen/spark-1.6.1-bin-without-hadoop/README.md" // Should be some file on your system val conf = new SparkConf().setAppName("Simple Application") val sc = new SparkContext(conf) val logData = sc.textFile(logFile, 2).cache() val numAs = logData.filter(line => line.contains("a")).count() val numBs = logData.filter(line => line.contains("b")).count() println("Lines with a: %s, Lines with b: %s".format(numAs, numBs)) } } # 4.将spark依赖hadoop的包添加到项目的libraries里 # (这样就有代码补全了,且不会报错找不到依赖包了): $SPARK_HOME/lib/spark-assembly-1.6.1-hadoop2.2.0.jar # 5.打包:进入项目目录,运行sbt package # 打好的包在./target/scala-2.10/sparktest_2.10-1.0.jar # 6.将jar包提交到集群上运行 $SPARK_HOME/bin/spark-submit --class "SimpleApp" --master yarn sparktest_2.10-1.0.jar # 7.需要注意的是,standalone与Mesos的集群模式, # --master参数上指定的是集群地址, # 在YARN模式上ResourceManager的地址将从Hadoop配置中获得, # --master参数是yarn。 # 因此也需要确保环境变量HADOOP_CONF_DIR指定为$HADOOP_HOME/etc/hadoop [/scala] 以上便是Spark起步的一些内容,sbt的普及度还是没有maven高,用maven替代sbt来打包应该也是可以Google到到,这个遇到具体项目再考虑吧。 接下来该去好好翻一翻官网上的Programming Guide(基础知识),Spark SQL, DataFrames and Datasets Guide(数据输入与输出),以及最需要的Machine Learning Library (MLlib) Guide(机器学习库)了。

原文地址:https://www.cnblogs.com/logosxxw/p/14400425.html