spark JAVA 开发环境搭建及远程调试

Posted hapjin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spark JAVA 开发环境搭建及远程调试相关的知识,希望对你有一定的参考价值。

spark JAVA 开发环境搭建及远程调试

以后要在项目中使用Spark 用户昵称文本做一下聚类分析,找出一些违规的昵称信息。以前折腾过Hadoop,于是看了下Spark官网的文档以及 github 上 官方提供的examples,看完了之后决定动手跑一个文本聚类的demo,于是有了下文。

1. 环境介绍

本地开发环境是:IDEA2018、JDK8、windows 10。远程服务器 Ubuntu 16.04.3 LTS上安装了spark-2.3.1-bin-hadoop2.7

看spark官网介绍,有两种形式(不是Spark Application Execution Mode)来启动spark

  1. Running the Examples and Shell

    比如说./bin/pyspark --master local[2]启动的是一个交互式的命令行界面,可以在4040端口查看作业。

  2. Launching on a Cluster

    spark 集群,有多种部署选项:Standalone。另外还有:YARN,Mesos(将集群中的资源将由资源管理器来管理)。

    对于Standalone,./sbin/start-master.sh 启动Master,通过8080端口就能看到:集群的情况。

再通过./sbin/start-slave.sh spark://panda-e550:7077 启动slave:Alive Workers 就是启动的slave。

执行jps:看到Master和Worker:

~/spark-2.3.1-bin-hadoop2.7$ jps
45437 Master
50429 Worker

下面介绍一下在本地windows10 环境下写Spark程序,然后连接到远程的这台Ubuntu机器上的Spark上进行调试。

2. 一个简单的开发环境

创建Maven工程,根据官网提供的Spark Examples 来演示聚类算法(JavaBisectingKMeansExample )的运行过程,并介绍如何配置Spark调试环境。

2.1添加maven 依赖:

<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-sql_2.11</artifactId>
    <version>2.3.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.spark/spark-mllib -->
<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-mllib_2.11</artifactId>
    <version>2.3.1</version>
    <!--<scope>runtime</scope>-->
</dependency>

2.2 编写代码:

package net.hapjin.spark;

import org.apache.spark.ml.clustering.BisectingKMeans;
import org.apache.spark.ml.clustering.BisectingKMeansModel;
import org.apache.spark.ml.linalg.Vector;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SparkSession;

public class JavaBisectingKMeansExample {
    public static void main(String[] args) {
//        SparkSession spark = SparkSession.builder().appName("JavaBisectingKMeansExample").getOrCreate();
        SparkSession spark = SparkSession.builder().appName("JavaBisectingKMeansExample").master("spark://xx.xx.129.170:7077").getOrCreate();
//        Dataset<Row> dataset = spark.read().format("libsvm").load(".\\\\data\\\\sample_kmeans_data.txt");
        Dataset<Row> dataset =     spark.read().format("libsvm").load("hdfs://172.25.129.170:9000/user/panda/sample_kmeans_data.txt");
//        Dataset<Row> dataset = spark.read().format("libsvm").load("file:///E:/git/myown/test/spark/example/data/sample_kmeans_data.txt");
        // Trains a bisecting k-means model.
        BisectingKMeans bkm = new BisectingKMeans().setK(2).setSeed(1);
        BisectingKMeansModel model = bkm.fit(dataset);

        // Evaluate clustering.
        double cost = model.computeCost(dataset);
        System.out.println("Within Set Sum of Squared Errors = " + cost);
        // Shows the result.
        System.out.println("Cluster Centers: ");
        Vector[] centers = model.clusterCenters();
        for (Vector center : centers) {
            System.out.println(center);
        }
        // $example off$
        spark.stop();
    }
}

2.3 配置远程调试环境

在IDEA中,"Run"-->"Edit Configurations"-->"Template"--->"Remote",点击 "+"号:

报错:

Could not locate executable null\\bin\\winutils.exe

去这个github下载对应的Hadoop版本的winutils.exe。

配置windows10环境变量:HADOOP_HOME,并将该环境变量添加到 Path 环境变量下%HADOOP_HOME%\\bin

再次Debug调试,成功进入断点:(如果报拒绝连接的错误,修改一下 conf/spark-env.sh 指定SPARK_LOCAL_IP为机器的IP地址,然后再 修改 /etc/hosts 文件 将主机名与机器IP地址相对应即可)

其实,在本地开发环境(Windows10)连不上远程的服务器时,先在Windows下telnet 一下看一下能不能通。如果不能通,那肯定连不上了。另外,可以在远程服务器上看下相应的端口绑定在哪个IP地址上,是不是绑定到了环回地址上了。比如下面这个spark master默认端口绑定在127.0.1.1上,那你本地的开发环境肯定连不上这个端口了:

~/spark-2.3.1-bin-hadoop2.7$ netstat -anp | grep 7077
tcp6 0 0 127.0.1.1:7077 ::

以上是关于spark JAVA 开发环境搭建及远程调试的主要内容,如果未能解决你的问题,请参考以下文章

搭建Spark源码研读和代码调试的开发环境

Spark入门实战系列--3.Spark编程模型(下)--IDEA搭建及实战

HBase二次开发之搭建HBase调试环境,如何远程debug HBase源代码

Spark远程调试+页面监控--用最熟悉的方式开发Spark应用

Spark远程调试+页面监控--用最熟悉的方式开发Spark应用

如何使用 Idea 远程调试 Java 代码