大数据新手必看!一文详尽Spark机器学习库的安装与入门

全套代码仓库:https://github.com/igeng/Awesome_SparkMLlib
包括可运行代码以及电子版文档。

众所周知,大数据组件之多,安装之繁琐,配置之复杂,往往成为阻拦新手入门的一道关卡。本文详尽安装Spark机器学习库的安装过程,并用精简的语言和例子带你快速上手Spark机器学习开发,写出SparkML中的“HelloWorld!“。

1.SparkMLlib基础

1.1 Spark的安装

1.1.1 Spark的安装

Spark的机器学习库MLlib组件属于Spark生态的一部分,MLlib提供了常用机器学习算法的实现,包括聚类、分类、回归、协同过滤等,降低了机器学习的门槛,开发人员只要具备一定的理论知识就能进行机器学习的工作。学习SparkMLlib就要先安装Spark。
为了方便Spark使用Hadoop的HDFS存取数据,可以采用和Hadoop一起安装的方法。当安装好Spark后,自带有scala环境。本教程使用的具体环境如下:
CentOS 7 64位
Hadoop2.7.6
Java JDK 1.8
Spark2.1.0
推荐上述环境的配置在VMWare虚拟机中完成,虚拟机和CentOs7系统的安装不再赘述。

(1)Hadoop的安装

创建hadoop用户,shell命令如下:

$ su              # 以 root 用户登录
$ useradd -m hadoop -s /bin/bash   # 创建新用户hadoop
$ passwd hadoop			#修改密码,按提示输入两次密码

为hadoop用户增加权限,shell命令如下:

$ visudo

找到 root ALL=(ALL) ALL一行,按i键,输入箭头所示一行内容:
在这里插入图片描述
完成后,按下ESC键,输入:wq保存退出。最后注销当前用户,重新以hadoop用户身份登陆。

(2)安装Java环境

Java选择OpenJDK,系统自带Java JRE,需要通过yum安装JDK,安装过程输入y即可。输入以下命令安装OpenJDK,注意版本要与系统自带java版本对应

$ sudo yum install java-1.8.0-openjdk java-1.8.0-openjdk-devel

通过执行 rpm -ql java-1.8.0-openjdk-devel | grep '/bin/javac' 命令确定默认安装路径,执行后会输出一个路径,除去路径末尾的 “/bin/javac”,剩下的就是正确的路径了。输入以下命令配置JAVA_HOME环境变量:

$ vim ~/.bashrc

在最后一行添加如下代码指向JDK安装位置:

export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk

如图所示:
在这里插入图片描述
输入以下命令使该环境生效并检验设置是否正确:

$ source ~/.bashrc    # 使变量设置生效
$ echo $JAVA_HOME     # 检验变量值
$ java -version
$ JAVA_HOME/bin/java -version  # 与直接执行 java -version 一样
(3)安装Hadoop 2

Hadoop 2 可以通过
Hadoop下载地址1
或者 Hadoop下载地址2 下载,本教程选择的是 2.7.6 版本,下载时请下载 hadoop-2.x.y.tar.gz 这个格式的文件,这是编译好的,另一个包含 src 的则是 Hadoop 源代码,需要进行编译才可使用。输入以下命令将Hadoop安装至/usr/local中,解压即可,并检查是否可用,成功会显示Hadoop的版本信息:

$ sudo tar –zxf ~/下载/hadoop-2.7.6.tar.gz –C /usr/local    # 解压到/usr/local中
$ cd /usr/local/
$ sudo mv ./hadoop-2.7.6/ ./hadoop            # 将文件夹名改为hadoop
$ sudo chown –R hadoop:hadoop ./hadoop        # 修改文件权限
$ cd /usr/local/hadoop
$ ./bin/hadoop version						显示版本信息
(4)安装Spark

在CentOS中打开Spark官网Spark官网,按下图所示结合自己Hadoop版本选择,点击箭头所指安装包下载即可,也可以在页面最下方选择以前版本的下载。
在这里插入图片描述
这里使用Local模式即单机模式进行安装,在shell中输入以下命令:

$ sudo tar -zxf ~/下载/spark-2.1.0-bin-without-hadoop.tgz -C /usr/local/		#此处路径为读者下载的实际路径
$ cd /usr/local
$ sudo mv ./spark-2.1.0-bin-without-hadoop/ ./spark
$ sudo chown -R hadoop:hadoop ./spark    #此处的 hadoop 为用户名

输入以下命令修改Spark的配置文件spark-env.sh

$ cd /usr/local/spark
$ cp ./conf/spark-env.sh.template ./conf/spark-env.sh

输入命令vim ./conf/spark-env.sh编辑spark-env.sh文件,在第一行添加以下配置信息:

export SPARK_DIST_CLASSPATH=$(/usr/local/hadoop/bin/hadoop classpath)

配置完成后,Spark就可以用Hadoop的HDFS分布式文件系统读取存储数据了,否则只能在本地读写数据。
最后输入以下命令,运行Spark自带例子,检验安装是否成功:

$ cd /usr/local/spark
$ bin/run-example SparkPi
$ bin/run-example SparkPi 2>&1 | grep "Pi is"

结果可以得到圆周率的近似值,如下图所示:
在这里插入图片描述

1.1.2 使用Spark编写简单的应用程序

我们首先使用spark shell进行开发,这是一种交互式执行环境。输入语句立即执行并返回结果,可以实时查看中间结果,并进行修改。对初学者很友好。本教程使用scala进行讲解。
spark-shell命令及其常用的参数如下:

./bin/spark-shell --master <master-url>

Master –url决定了Spark的运行模式,在此处我们使用本地模式local运行。参数说明如下:
–master:这个参数表示当前的Spark Shell要连接到哪个master,如果是local[*],就是使用本地模式启动spark-shell,其中,中括号内的星号表示需要使用几个CPU核心(core)。当然在此处,我们可以直接用如下的命令启动:

$ bin/spark-shell

此命令相当于bin/spark-shell –master local[*],使用本地所有CPU核心运行。启动以后,进入scala命令提示符状态,如图所示:
在这里插入图片描述
接下来就如同最初学习C语言,java一样,可以试着用scala编写一些简单的程序。示例如下,最后使用:quit退出Spark shell。
在这里插入图片描述

1.2 Spark编程基础与数据操作

1.2.1 RDD操作

Spark核心编程基础就是统一的抽象RDD,基于此Spark的所有组件可以很好的集成在一起,用户可以在一个应用程序中进行大数据计算。本教程所述的机器学习算法多属于迭代式算法,在一个运行过程中的输出需要作为下一过程的输入。传统的做法是存入HDFS中,有大量不必要的数据复制等存储的开销。RDD提供了通用的数据抽象,用户只需将具体的应用逻辑表示成转换处理,不同RDD之间形成互相依赖的关系,即可实现管道化。接下来简单介绍RDD的实现与操作。
Spark基于Scala语言实现了RDD的应用程序接口API,用户可以直接调用API实现操作RDD。执行过程如下:
(1)RDD读取数据并创建;
(2)RDD进行“转换”操作,每次转换产生不同的RDD,留给下一次“转换”使用;
(3)最后一个RDD进行“行动”操作,输出结果,一般为数据或Scala集合或标量。
如下ex1为基于RDD进行一系列计算操作的Spark程序,计算“Hello Spark”中的个数:

//创建SparkContext对象
val sc= new SparkContext(“spark://localhost:7077,”Hello World”, 
“YOUR_SPARK_HOME”,”YOUR_APP_JAR”)
//从HDFS文件读取数据创建RDD
val fileRDD = sc.textFile(“hdfs://192.168.0.103:9000/examplefile”)
//对上一行产生的对象进行转换操作得到新RDD
val filterRDD = fileRDD.filter(_.contains(“Hello World”))
//对新产生的RDD持久化
filterRDD.cache()
//进行行动操作,根据之前的转换形成的依赖关系进行计算,输出元素个数
filterRDD.count()

1.2.2 数据处理

Spark支持对多种常见类型的文件进行读写,除了本地文件系统,还有文本文件、JSON、SequenceFile等,以及HDFS、Amazon S3等文件系统和MySQL、HBase、Hive等数据库。以下对数据处理部分进行简单的介绍,只涉及本地文件的读取。
在CenrOs中打开终端,输入以下指令打开Spark-shell:

$ cd /usr/local/spark
$ ./bin/spark-shell
$ ....#中间为输出的信息
$ scala>

另打开一个终端进行文件编辑和查看。并输入以下命令,完成数据准备:

#进入对应目录,没有则用`mkdir`创建
cd /usr/local/spark/mycode 
#创建文件夹
mkdir wordcount 
echo "hadoop hello spark hello world" >> word.txt #把自己创建的数据存入txt文件

数据准备完毕。

回到第一个终端,在spark-shell中输入如下指令,完成数据加载:

val textFile = sc.textFile("file:///usr/local/spark/mycode/wordcount/word.txt")

执行行动操作,即可看到输出:

#first()是一个Action类型操作,开始计算,输出加载的数据
textFile.first() 

接下来是把变量中的数据写入文件,代码如下:

#saveAsTextFile()是一个Action类型的操作,把变量中数据写入文件
textFile.saveAsTextFile("file:///usr/local/spark/mycode/wordcount/writeback.txt") 

查看writeback.txt文件

cd /usr/local/spark/mycode/wordcount/writeback.txt/
ls

可以看到三个文件如图所示:

cat命令查看,与word.txt内容一样
然后用如下代码可以将数据再次加载回RDD:

val textFile = sc.textFile("file:///usr/local/spark/mycode/wordcount
/writeback.txt")

1.3 SparkMLib矩阵基础

Spark中向量矩阵运算基础简介,MLlib底层的向量矩阵运算使用了Breeze库,提供了Vector/Matrix的实现与计算接口。但是MLlib函数的参数传递使用自己的Vector,在函数内的矩阵计算又使用ToBreeze.ToDenseVector变成Breeze形式计算,以此达到保证函数接口稳定性的目的。而BLAS(基础线性代数程序集)是API标准,规范基础线代操作的数值库,分为向量-向量运算,矩阵-向量运算,矩阵-矩阵运算。
在SparkMLlib中均封装上述库,实现了自己的矩阵相关的类,以下做出介绍。

1.3.1 MLlib向量

封装了Breeze向量方法,实现了Vector类,包含ToBreeze方法,可将Vector类转换为Breeze向量。org.apache.spark.mllib.linalg.Vectors定义了Vector接口,伴生对象,实现了DenseVector、SparseVector类。Vector接口最终由DenseVector、SparseVector实现稀疏向量和密集向量,主要方法有:
toArray:向量转数组;
toBreeze:向量转Breeze向量;
toSparse:转稀疏向量;
toDense:转密集向量;
copy:向量复制。

1.3.2 MLlib矩阵

封装了Breeze矩阵方法实现了自己的Matrix类,与Vector类相似,也定义了接口:Matrix,静态对象Matrixs,实现了DenseVector、SparseVector类。主要方法有:
toArray:矩阵转密集数组;
toBreeze:向量转Breeze矩阵;
transpose:矩阵转置;
multiply:矩阵乘法。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值