大數據新手必看!一文詳盡Spark機器學習庫的安裝與入門

衆所周知,大數據組件之多,安裝之繁瑣,配置之複雜,往往成爲阻攔新手入門的一道關卡。本文詳盡安裝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:矩陣乘法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章