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包:

# 得益于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

3.环境变量配置

最后再持久化一些环境变量:

# 编辑环境变量相关脚本:
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

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进行打包并提交到集群上。

# 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

以上便是Spark起步的一些内容,sbt的普及度还是没有maven高,用maven替代sbt来打包应该也是可以Google到到,这个遇到具体项目再考虑吧。

接下来该去好好翻一翻官网上的Programming Guide(基础知识),Spark SQL, DataFrames and Datasets Guide(数据输入与输出),以及最需要的Machine Learning Library (MLlib) Guide(机器学习库)了。

发表评论

电子邮件地址不会被公开。 必填项已用*标注