idea对spark程序进行远程提交和调试

  • Post author:
  • Post category:其他


第一部分 远程提交

本文以WordCount程序来实现idea对spark程序进行远程提交和调试

环境

  • 利用虚拟机搭建拥有3台主机的spark集群

    hadoop102

    hadoop103

    hadoop104

  • IntelliJ IDEA 2020.3.2 (Ultimate Edition)

背景知识

若要把 Spark SQL 连接到一个部署好的 Hive 上,你必须把 hive-site.xml 复制到 Spark的配置文件目录中($SPARK_HOME/conf)。即使没有部署好 Hive, Spark SQL 也可以运行。 需要注意的是,如果你没有部署好 Hive, Spark SQL 会在当前的工作目录中创建出自己的 Hive 元数据仓库,叫作 metastore_db。此外,如果你尝试使用 HiveQL 中的CREATE TABLE (并非 CREATE EXTERNAL TABLE)语句来创建表,这些表会被放在你默认的文件系统中的 /user/hive/warehouse 目录中(如果你的 classpath 中有配好的 hdfs_site.xml,默认的文件系统就是 HDFS,否则就是本地文件系统)。

步骤

步骤 1: 拷贝 hive-site.xml 到 resources 目录下

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
    <property>
      <name>javax.jdo.option.ConnectionURL</name>
      <value>jdbc:mysql://hadoop102:3306/metastore?createDatabaseIfNotExist=true</value>
      <description>JDBC connect string for a JDBC metastore</description>
    </property>
​
    <property>
      <name>javax.jdo.option.ConnectionDriverName</name>
      <value>com.mysql.jdbc.Driver</value>
      <description>Driver class name for a JDBC metastore</description>
    </property>
​
    <property>
            <name>hive.metastore.uris</name>
            <value>thrift://hadoop102:9083</value>
            <description>Thrift URI for the remote metastore. Used by metastore client to connect to remote metastore.</description>
    </property>
​
    <property>
      <name>javax.jdo.option.ConnectionUserName</name>
      <value>root</value>
      <description>username to use against metastore database</description>
    </property>
​
    <property>
      <name>javax.jdo.option.ConnectionPassword</name>
      <value>000000</value>
      <description>password to use against metastore database</description>
    </property>
    <property>
        <name>hive.cli.print.header</name>
        <value>true</value>
    </property>
    <property>
        <name>hive.cli.print.current.db</name>
        <value>true</value>
    </property>
</configuration>

步骤 2: 添加pom依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
​
    <groupId>org.example</groupId>
    <artifactId>HelloWord1</artifactId>
    <version>1.0-SNAPSHOT</version>
​
    <properties>
        <spark.version>2.1.0</spark.version>
        <scala.version>2.11</scala.version>
    </properties>
​
​
    <dependencies>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-core_${scala.version}</artifactId>
            <version>${spark.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-sql_${scala.version}</artifactId>
            <version>${spark.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-hive_${scala.version}</artifactId>
            <version>${spark.version}</version>
        </dependency>
    </dependencies>
</project>

步骤 3: 代码

在代码中指定 spark.sql.warehouse.dir 参数

.config(“spark.sql.warehouse.dir”, “hdfs://hadoop102:9000/user/hive/warehouse”)

package com.xdb.test
​
import org.apache.spark.sql.SparkSession
​
object HiveDemo {
  def main(args: Array[String]): Unit = {
    val master = "local[*]"
​
    val spark: SparkSession = SparkSession
      .builder()
      .master(master)
      .appName("Test")
      .enableHiveSupport()
      .config("spark.sql.warehouse.dir", "hdfs://hadoop102:9000/user/hive/warehouse")
      .getOrCreate()
    import spark.sql
​
    sql("show tables").show
    /*    +--------+--------------+-----------+
    |database|     tableName|isTemporary|
    +--------+--------------+-----------+
    | default|      business|      false|
      | default|          dept|      false|
      | default|dept_partition|      false|
      | default|           emp|      false|
      +--------+--------------+-----------+*/
  }
}
​

验证完毕。

第二部分 对程序进行远程调试

1.集群配置文件spark-env.sh

首先,在集群配置文件spark-env.sh中加入一下代码

export SPARK_SUBMIT_OPTS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005"

这里对上面的几个参数进行说明:

-Xdebug 启用调试特性-Xrunjdwp 启用JDWP实现,包含若干子选项:transport=dt_socket JPDA front-end和back-end之间的传输方法。dt_socket表示使用套接字传输。address=8888 JVM在8888端口上监听请求,这个设定为一个不冲突的端口即可。server=y y表示启动的JVM是被调试者。如果为n,则表示启动的JVM是调试器。suspend=y y表示启动的JVM会暂停等待,直到调试器连接上才继续执行。suspend=n,则JVM不会暂停等待。

2.idea的设置

对运行进行配置

配置完成后,设置断点,在scala程序右键debug即可



版权声明:本文为akenseren原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。