發表文章

[SPARK] MLlib 的使用 (2)

圖片
在使用MLlib的Linear Regression程式中, 我們大概可以簡單地分成以下三部分:  資料讀取  Regression模型的建立  顯示計算結果 在資料讀取部分, 對應於以下程式碼: // Load training data val training = spark.read.format( " libsvm " ) .load( " data/mllib/sample_linear_regression_data.txt " ) 其目標是從 檔案 中, 取得數值並創立一個RDD, 此檔案依循libsvm的格式 (也就是key-value pair), 詳細的資料格式可以參考林智仁老師的網頁 (libsvm) 介紹: https://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/

[SPARK] MLlib 的使用 (1)

圖片
Spark 相較其他平台有一個好處就是對Machine Learning的支援, 相同的, 為了利用此支援性, 我們也找其中一個範例程式來編譯使用, 在這一系列文章中, 我們將以Linear Regression為範例, 其參考的網頁為: https://spark.apache.org/docs/2.2.0/ml-classification-regression.html#linear-regression 而整份參考的程式位址如下: https://github.com/apache/spark/blob/master/examples/src/main/scala/org/apache/spark/examples/ml/LinearRegressionWithElasticNetExample.scala 在閱讀程式以前, 我們先建立Spark MLlib的編譯環境, 大致上, 流程和之前 這一篇文章 一樣, 建立專案 => 複製程式碼 => build => 執行

[SPARK] RDD, Action 和 Transformation (2)

圖片
在Spark中, 資料的基本架構為 RDD (Resilient Distributed Dataset), RDDs 可以使用 Hadoop InputFormats (例如 HDFS 文件) 創建, 也可以從其他的 RDDs 轉換. 我們可以簡單的從一個文字檔建立 RDD, 例如: scala> val textFile = sc.textFile("README.md") 基本上, 就是從文字檔中建立一個 RDD 物件, 此時, 該 RDD 物件已經轉換成 string array 的格式, 可以透過: scala> textFile.collect() 查看, RDD 仍保有HDFS的特性, 也就是 key-value 的格式, 在 textFile 這個 RDD 中, key 就是第幾行, value 則是每行的數值, 對於所有的 RDD, 我們都有兩種操作: action 和 transformation, RDD 的 actions 從 RDD 中返回值, transformations 可以轉換成一個新 RDD 並返回它的引用. 如下圖表示: https://stackoverflow.com/questions/39311616/transformation-process-in-apache-spark

[SPARK] RDD, Action 和 Transformation (1)

圖片
在之前介紹 SparkPi 程式時, 我們看到兩個特殊的指令: map, reduce. 我們先列出 官方指南 中的介紹: map (func): Return a new distributed dataset formed by passing each element of the source through a function func. reduce (func): Aggregate the elements of the dataset using a function func (which takes two arguments and returns one). The function should be commutative and associative so that it can be computed correctly in parallel. 簡單來說, map 就是對數據進行運算, 得到一組轉換的結果, 在 SparkPi 中, 所做的對應是藉由 Monte Carlo 方式, 取得 0 或 1的數值, 而 reduce 則是聚集數據集中的所有元素, 定義為: 對兩個參數運算, 回報一個結果, 在 SparkPi 中, 把兩個數值相加, 回報相加結果. 特別的是, 在 Spark 中, map, reduce 分屬不同類別, map 是 transformations, 而 reduce 是 actions, 定義如下: transformations, which create a new dataset from an existing one actions, which return a value to the driver program after running a computation on the dataset.

[SPARK] Spark基本介紹

圖片
寫了一些Spark的文章, 才發現自己還沒介紹過Spark, 於是, 就把之前自己整理的一些資料放上來, 當作Spark的介紹, 在介紹中, 我將著重在Stream和ML部分的比較, 這也是未來在研究Spark時會比較重視的部分, Apache Spark 是由UC Berkeley AMP 實驗室所開發的雲端運算框架, 用來構建大型的, 低延遲的資料分析系統. 比較起其他雲端運算架構, 像是IBM的InfoSphere, 或是Strom的流計算, Spark繼承了MapReduce中根據資料位置移動計算的精神 (moves compute processes to the data), 並在此架構上, 引進了記憶體層 (in-memory) 計算的概念, 提供使用者對於暫存資料的控管, 減低在迭代時所需要的資料存取時間. 來自:  https://ogirardot.wordpress.com/2015/05/29/rdds-are-the-new-bytecode-of-apache-spark/

[SPARK] Spark範例: 以SparkPi為例

圖片
Spark提供以下三種程式寫作方式: python, scala, 以及java 其中, scala是其原生支援的程式語言, 理論上來說, 應該有最簡潔的架構與語法, 於是, 我們就從scala出發, 來看看SparkPi是如何撰寫, 以下是SparkPi的程式, 來自: spark/examples/src/main/scala/org/apache/spark/examples/SparkPi.scala

[SPARK] Spark的編譯環境: 以SparkPi為例

在 上一篇文章 中, 我們介紹了如何安裝單機版的Spark, 接下來, 為了要撰寫Spark程式, 我們要先建立Spark的編譯環境, 此時, 就要用到SBT這個套件, SBT (Simple Build Tool) 是Scala的編譯器, 有興趣可以參考:  https://www.scala-sbt.org/ 接下來, 我們就要重新創一個專案, 重新執行之前範例中的SparkPi, 我們主要參考以下連結: https://console.bluemix.net/docs/services/AnalyticsforApacheSpark/spark_app_example.html 因為有一些修改, 就把指令紀錄如下: 一開始, 先建立專案的資料夾, 把SparkPi移入, mkdir -p ~/spark-submit/project mkdir -p ~/spark-submit/src/main/scal cp /usr/lib/spark/examples/src/main/scala/org/apache/spark/examples/SparkPi.scala ~/spark-submit/src/main/scala/SparkPi.scala 接著, 設定SBT的環境: vim ~/spark-submit-example/build.sbt 貼上以下內容 (空行必須保留, Scala的版本號記得修改): name := "SparkPi" version := "1.0" scalaVersion := " 2.11.6 " libraryDependencies += "org.apache.spark" %% "spark-core" % "2.1.2" libraryDependencies += "org.apache.spark" %% "spark-sql" % "2.1.2" resolvers += "Akka Repository" at "http://repo.akka.io/...