1. 程式人生 > >利用IDEA檢視和修改spark原始碼

利用IDEA檢視和修改spark原始碼

經過了兩天的摸索,算是初步學會了如何檢視和修改spark原始碼。

大坑

對,這個要寫在最前面,那就是注意你的scalaSDK版本!!!!不同的Spark版本支援的scala從2.10到2.12不同,一定要注意!!!

檢視原始碼

這裡主要講的是利用idea在執行的時候除錯spark應用能看看原始碼的。
首先,注意大坑~下圖是我的配置spark1.6配scala2.10
配置
下載地址如下:
spark & scala 包
然後你可以新建一個SparkPi的Object,這個就不贅述了。然後你想在執行的時候看看spark到底搞了毛,但是你會發現,你只能看到方法名,看不到方法的具體內容,那是因為你沒有給你的jar包關聯原始碼,如何關聯原始碼呢,就是從

spark官網下載source-code那個,解壓到隨便某個資料夾後,在IDEA裡,File->Project Structure最右邊那一欄,上邊的綠加號
source-code
點了之後,找到你那個原始碼的檔案,確定,等一等,就可以點ctrl的時候看到原始碼了。

修改原始碼

老規矩先上教程:戳這裡

現在使用教程中的方法下載原始碼然後利用下載原始碼裡的maven工具進行編譯。教程裡有個坑就是在編譯完成之後並沒有找到所說的spark-assembly-1.4.0-SNAPSHOT-hadoop2.6.0.jar這個jar包,而是找到了一大堆零零散散的包,不過也沒問題,你可以在idea裡把整個jars資料夾加入到你的Libraries裡也不影響執行。這裡最影響執行的,就是scala的版本問題,如果你的jars資料夾是在scala2.11這個資料夾下的,那你的scalaSDK如果不是2.11那你無論如何是編譯不成功的,所以這一點巨坑。

另外,思路很重要,其實最後編輯原始碼的方法非常簡單,步驟也很容易,但是,重點是得找對這條路。我就經歷了直接用jar包關聯原始碼修改,瞎J8編譯之後找不到jar包不會匯入等等一系列彎路。
最後,這只是第一步,修改了原始碼之後只能變成jar在idea裡用,但是沒辦法在spark-shell裡用,這樣的不知道怎麼在叢集裡執行。慢慢研究吧~

最後附上SparkPi的程式碼(來自github)

/**
 * Copyright (C) 2015 Baifendian Corporation
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.spark.examples import org.apache.spark._ import scala.math.random /** Computes an approximation to pi * * 這裡我們說一下如何求 Pi,其實就是一個抽樣的過程,假想有一個 2 * 2 的正方形,我要在裡面畫一個圓(r = 1), * 假想有一個點隨機扔到正方形中(假設有 N 次),那麼恰好也在圓中的次數為(C),如果 N 足夠大,那麼 C/N 逼近於 * 圓的面積/正方形面積,也就是說 pi/4,那麼 pi/4 = C/N, pi = 4*C/N. * * */ object SparkPi { def main(args: Array[String]) { val conf = new SparkConf().setAppName("Spark Pi") val spark = new SparkContext(conf) val slices = if (args.length > 0) args(0).toInt else 2 // slices 對應於 partition 個數,平均每個 partition 有 100000L 個元素 val n = math.min(100000L * slices, Int.MaxValue).toInt // avoid overflow // 這裡可以理解為一個迴圈,每個 partition 上迴圈次數為 100000L val count = spark.parallelize(1 until n, slices).map { i => val x = random * 2 - 1 // random return double value between [0.0, 1.0], so random * 2 - 1 return value between [-1.0, 1.0] val y = random * 2 - 1 if (x * x + y * y < 1) 1 else 0 }.reduce(_ + _) println("Pi is roughly " + 4.0 * count / n) spark.stop() } }