spark 应用调试(idea 环境)

spark应用调试(idea 环境)

spark shell可以比较方便的分步执行调试spark应用程序,但有时候不是很方便。下面介绍一种直接在idea中调试spark程序的方法。

maven 新建工程

​ 这个不多赘述,注意一点是pom文件中把依赖的spark的scope的provided去掉,因为我们要在idea中直接运行,不会用spark-submit。

<dependencies>
    <dependency>
        <groupId>org.scala-lang</groupId>
        <artifactId>scala-library</artifactId>
        <version>${scala.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-core_2.11</artifactId>
        <version>${spark.version}</version>
        <!--<scope>provided</scope>-->
    </dependency>
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-sql_2.11</artifactId>
        <version>${spark.version}</version>
        <!--<scope>provided</scope>-->
    </dependency>
</dependencies>
<properties>
    <scala.version>2.11.2</scala.version>
    <spark.version>2.3.1</spark.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
</properties>
编写应用
package neal.spark

import org.apache.spark.sql.SparkSession

import scala.math.random

/** Computes an approximation to pi */
object SparkPi {
  def main(args: Array[String]) {
    val spark = SparkSession
      .builder
      .appName("Spark Pi")
      .master("local")
      .getOrCreate()
    val slices = if (args.length > 0) args(0).toInt else 2
    val n = math.min(100000L * slices, Int.MaxValue).toInt // avoid overflow
    val count = spark.sparkContext.parallelize(1 until n, slices).map { i =>
      val x = random * 2 - 1
      val y = random * 2 - 1
      if (x*x + y*y <= 1) 1 else 0
    }.reduce(_ + _)
    println(s"Pi is roughly ${4.0 * count / (n - 1)}")
    spark.stop()
  }
}

以spark pi为例,这里注意要加上.master(“local”),在local模式运行

运行调试

配置一个run configure 就可以运行调试了,简单快捷。

idea会自动帮你下载source,自己标记断点即可。

如下图所示,在spark.sparkContext.parallelize处添加断点:

屏幕快照 2018-07-15 下午5.41.41

小技巧
  1. 将log4j.propertities设置为trace level,spark会打印更多的调试信息
#配置根Logger 后面是若干个Appender
#log4j.rootLogger=DEBUG,A1,R,E

log4j.rootLogger=TRACE,A1

# ConsoleAppender 输出
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n
  1. 调试 spark sql程序,打印 tree 信息

    println(spark.sql("select * from a").queryExecution.analyzed.treeString)

+- LocalLimit 21`
+- AnalysisBarrier
+- Project [cast(age#6L as string) AS age#12, cast(name#7 as string) AS name#13]
+- Relation[age#6L,name#7] json

### 在 IntelliJ IDEA 中配置和调试 Spark 应用程序的详细说明 在 IntelliJ IDEA 中配置和调试 Spark 应用程序需要正确设置开发环境、项目依赖以及运行配置。以下是具体的操作方法: #### 配置开发环境 确保 IntelliJ IDEA 已安装 Scala 插件,并正确配置 JDK 和 Scala SDK[^2]。 - 打开 IDEA,依次选择 `File -> Settings -> Plugins`,搜索并安装 Scala 插件。 - 确保系统已安装 JDK 并将其添加到项目中:`File -> Project Structure -> SDKs`。 - 配置 Scala SDK:选择已安装的 Scala 版本,并勾选 `Copy to Project Libraries`。 #### 配置项目依赖 在 Maven 项目中,确保 `pom.xml` 文件中包含 Spark 的相关依赖项。例如: ```xml <dependencies> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-core_2.12</artifactId> <version>3.3.0</version> </dependency> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-sql_2.12</artifactId> <version>3.3.0</version> </dependency> </dependencies> ``` 确保 Spark 版本与 Scala 版本兼容[^4]。 #### 创建运行配置 为了调试 Spark 应用程序,需要创建一个运行配置以指定主类和 JVM 参数: - 打开 `Run -> Edit Configurations`。 - 点击左上角的 `+` 号,选择 `Application`。 - 设置以下参数: - **Main Class**: 指定 Spark 程序的主类。 - **VM Options**: 添加调试选项 `-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005`。 - **Program Arguments**: 根据需要传递命令行参数。 - **Environment Variables**: 如果需要,可以设置 `SPARK_HOME` 和其他环境变量。 #### 调试模式启动 通过以下方式启动调试会话: - 在代码中设置断点。 - 选择之前创建的运行配置,点击 `Debug` 按钮。 - IDEA 将自动启动 Spark 应用程序并在遇到断点时暂停执行。 #### 示例代码 以下是一个简单的 Spark 程序示例,展示如何在本地模式下运行和调试: ```scala import org.apache.spark.sql.SparkSession object DebuggingSparkApp { def main(args: Array[String]): Unit = { val spark = SparkSession.builder() .appName("Debugging Spark App") .master("local[*]") // 使用本地模式 .getOrCreate() import spark.implicits._ val data = Seq(("Alice", 1), ("Bob", 2), ("Charlie", 3)) val df = data.toDF("name", "id") // 设置断点在此处 df.show() spark.stop() } } ``` #### 注意事项 - 确保 Spark 的运行模式设置为 `local[*]`,以便在本地线程中运行应用程序而无需 Hadoop 集群支持[^3]。 - 如果使用外部数据源(如 HDFS 或数据库),需确保本地环境中能够访问这些资源。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值