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)MLlib向量
封装了Breeze向量方法,实现了Vector类,包含ToBreeze方法,可将Vector类转换为Breeze向量。org.apache.spark.mllib.linalg.Vectors定义了Vector接口,伴生对象,实现了DenseVector、SparseVector类。Vector接口最终由DenseVector、SparseVector实现稀疏向量和密集向量,主要方法有:
toArray:向量转数组;
toBreeze:向量转Breeze向量;
toSparse:转稀疏向量;
toDense:转密集向量;
copy:向量复制。
(2)MLlib矩阵
封装了Breeze矩阵方法实现了自己的Matrix类,与Vector类相似,也定义了接口:Matrix,静态对象Matrixs,实现了DenseVector、SparseVector类。主要方法有:
toArray:矩阵转密集数组;
toBreeze:向量转Breeze矩阵;
transpose:矩阵转置;
multiply:矩阵乘法。
转载:https://blog.csdn.net/bazhaheigang/article/details/105986702