利用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最右边那一栏,上边的绿加号

点了之后,找到你那个源码的文件,确定,等一等,就可以点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()
  }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏腾讯云实验室

玩转 Jupyter Notebook

腾讯云提供了开发者实验室教你玩转 Jupyter Notebook,教程内容如下,用户可以点击开发者实验室快速上机完成实验。

1.5K3
来自专栏Seebug漏洞平台

Exim Off-by-one(CVE-2018-6789)漏洞复现分析

前段时间meh又挖了一个Exim的RCE漏洞[1],而且这次RCE的漏洞的约束更少了,就算开启了PIE仍然能被利用。虽然去年我研究过Exim,但是时间过去这么久...

1192
来自专栏我和PYTHON有个约会

Django来敲门~第一部分【5.1.项目配置settings.py详解】

我们创建好了一个Python项目(mysite/)之后,需要在项目中添加模块应用(polls/),在模块应用中添加处理功能逻辑,如添加模块中的视图处理函数(po...

1063
来自专栏知识分享

1-STM32嵌入LUA开发(控制小灯闪耀)

今天因为想让STM32完美的处理字符串,所以就想着让STM32嵌入lua,本来想用f103c8t6,但是一编译就提示内存不足......

1202
来自专栏Objective-C

Swift-MVVM 简单演练(二)

3944
来自专栏岑玉海

Spark源码系列(七)Spark on yarn具体实现

本来不打算写的了,但是真的是闲来无事,整天看美剧也没啥意思。这一章打算讲一下Spark on yarn的实现,1.0.0里面已经是一个stable的版本了,可是...

5755
来自专栏前端黑板报

HTTP2基础教程-读书笔记(四)

? 记录一下HTTP/2的底层原理,帮助理解协议实现细节。 连接 每个端点都需要发送一个连接作为最终确认使用的协议,并建立http/2连接的初始设置。客户端和...

3536
来自专栏IT笔记

JAVAWEB开发的微信公众号H5支付

一切需求都是来源于业务需要,前一阵子做了微信扫码支付,的确相对PC用户来说方便了很多。但是如果手机下单,你总不能让用户自己扫自己吧?查看了一下文档,微信还是支持...

1.7K5
来自专栏信安之路

HCTF2017的三个WriteUp

解决方法就是先 undefine 掉函数,再右键选择 Code,最后 Create function 就可以正常反编译了。

1170
来自专栏学习力

《Java从入门到放弃》框架入门篇:hibernate中的多表对应关系

2317

扫码关注云+社区

领取腾讯云代金券