前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >利用IDEA查看和修改spark源码

利用IDEA查看和修改spark源码

作者头像
用户1148523
发布2018-01-09 10:33:42
2K0
发布2018-01-09 10:33:42
举报
文章被收录于专栏:FishFish

经过了两天的摸索,算是初步学会了如何查看和修改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
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)

代码语言:javascript
复制
/**
 * 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()
  }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年03月19日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 大坑
  • 查看源码
  • 修改源码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档