sparkJAVA开发环境搭建及远程调试
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⼯程,根据官⽹提供的来演⽰聚类算法(JavaBictingKMeansExample )的运⾏过程,并介绍如何配置Spark调试环境。
2.1添加maven 依赖:
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.11</artifactId>
<version>2.3.1</version>
</dependency>
<!-- /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;
an什么意思
import org.apache.spark.ml.clustering.BictingKMeans;
import org.apache.spark.ml.clustering.BictingKMeansModel;
import org.apache.spark.ml.linalg.Vector;
import org.apache.spark.sql.Datat;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SparkSession;
public class JavaBictingKMeansExample {
public static void main(String[] args) {
// SparkSession spark = SparkSession.builder().appName("JavaBictingKMeansExample").getOrCreate();
llina
SparkSession spark = SparkSession.builder().appName("JavaBictingKMeansExample").master("spark://xx.xx.129.170:7077").getOrCreate();
// Datat<Row> datat = ad().format("libsvm").load(".\\data\\sample_");
Datat<Row> datat = ad().format("libsvm").load("hdfs://172.25.129.170:9000/ur/panda/sample_");
bombardment
// Datat<Row> datat = ad().format("libsvm").load("file:///E:/git/myown/test/spark/example/data/sample_");
// Trains a bicting k-means model.
BictingKMeans bkm = new BictingKMeans().tK(2).tSeed(1);
BictingKMeansModel model = bkm.fit(datat);
// Evaluate clustering.
double cost = puteCost(datat);
System.out.println("Within Set Sum of Squared Errors = " + cost);
// Shows the result.
System.out.println("Cluster Centers: ");
Vector[] centers = model.clusterCenters();
not at all
for (Vector center : centers) {
System.out.println(center);
}
// $example off$
spark.stop();
}
}
clot是什么意思
2.3 配置远程调试环境
在IDEA中,"Run"-->"Edit Configurations"-->"Template"--->"Remote",点击 "+"号:
报错:
Could not locate executable null\
去这个下载对应的Hadoop版本的。
配置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 :: LISTEN 18406/java
tcp6 0 0 127.0.0.1:29599 127.0.1.1:7077 ESTABLISHED 18605/java
tcp6 0 0 127.0.1.1:7077 127.0.0.1:29599 ESTABLISHED 18406/java
接下来,执⾏读取⽂件,明明⽂件就在windows的该路径下,但是就是报错:
Caud by: java.io.FileNotFoundException: File file:/E:/git/myown/test/spark/example/data/sample_ does not exist
尝试了好⼏个路径写法,⽐如这篇,都未果。
// Datat<Row> datat = ad().format("libsvm").load(".\\data\\sample_");
Datat<Row> datat = ad().format("libsvm").load("file:///E:\\git\\myown\\test\\spark\\example\\data\\sample_");
// Datat<Row> datat = ad().format("libsvm").load("file:///E:/git/myown/test/spark/example/data/sample_");
看⾥⾯的解释:猕猴桃的英文
usually t as "hdfs://..."; otherwi "file://".
因为我本地Windows10没有安装Hadoop,只是上⾯提到的下载时,简单地配置了个HADOOP_HOME环境变量。所以我也不知道这种远程调试中读取本地windows系统上的⽂件是否可⾏了。
看来,我只能在远程服务器上再安装个Hadoop了,然后把⽂件上传到HDFS上。于是,下载Hadoop-2.7.7,解压安装(按照官⽹伪分布式模式配置安装),并启动HDFS:
$ sbin/start-dfs.sh
jps查看当前服务器上的进程:
panda@panda-e550:~/data/spark$ jps
2435 Master
10181 SecondaryNameNode
11543 Jps
9849 NameNode什么是townhou
3321 Worker
9997 DataNode
其中Master是Spark master;Worker是spark worker;NameNode、DataNode、SecondaryNameNode是Hadoop HDFS的相关进程。把⽂件上传到HDFS 上:
panda@panda-e550:~/software/hadoop-2.7.7$ ./bin/hdfs dfs -ls /ur/panda
Found 2 items
-rw-r--r-- 1 panda supergroup 70 2018-10-30 17:54 /ur/panda/people.json
-rw-r--r-- 1 panda supergroup 120 2018-10-30 18:09 /ur/panda/sample_
修改⼀下代码中⽂件的路径:(还是隐藏⼀下具体的ip吧)
Datat<Row> datat = ad().format("libsvm").load("hdfs://xx.xx.129.170:9000/ur/panda/sample_");
继续右击debug,⼜报错:
failed on connection exception: ConnectException: Connection refud: no further information; For more details e:
按照提⽰的链接看:应该是下⾯这个问题。
1. If the error message says the remote rvice is on "127.0.0.1" or "localhost" that means the configuration file is telling the client that the
rvice is on the local rver. If your client is trying to talk to a remote system, then your configuration is broken.
2. Check that there isn't an entry for your hostname mapped to 127.0.0.1 or 127.0.1.1 in /etc/hosts (Ubuntu is notorious for this)
cat /etc/hosts部分内容如下:
127.0.0.1 localhost
172.25.129.170 panda-e550
再看看 hdfs上的配置⽂件:cat etc/l
<configuration>
<property>
<name>fs.defaultFS</name>
记忆能力<value>hdfs://localhost:9000</value>
</property>
</configuration>
在远程服务器上:
panda@panda-e550:~/software/hadoop-2.7.7$ netstat -anp | grep 9000
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 9849/java
tcp 0 0 127.0.0.1:43162 127.0.0.1:9000 ESTABLISHED 9997/java
tcp 0 0 127.0.0.1:43360 127.0.0.1:9000 TIME_WAIT -
tcp 0 0 127.0.0.1:9000 127.0.0.1:43162 ESTABLISHED 9849/java
因此,出现ConnectException的原因就很明显了。因此,服务器Hadoop HDFS 9000端⼝绑定在到环回地址上。那我在windows10上的机器上的IDEA的代码程序⾥⾯指定:hdfs://172.25.129.170:9000/ur/panda/sample_肯定是不⾏的了。毕竟windows10开发环境机器的ip地址,肯定和安装Hadoop的远程服
务器的ip地址是不同的。
由于l配置的是hdfs://localhost:9000,按理说,把 localhost 改成 ip 地址应该是可以的。但是我采⽤另⼀种⽅案,修改 /etc/hosts中的⽂件:把原来的127.0.0.1对应的localhost注释掉,修改成机器的ip地址,如下:
panda@panda-e550:~/software/hadoop-2.7.7$ cat /etc/hosts
# comment this line and add new line for hadoop hdfs
#127.0.0.1 localhost
172.25.129.170 localhost
然后再重启⼀下 HDFS进程。此时:
panda@panda-e550:~/software/hadoop-2.7.7$ netstat -anp | grep 9000
tcp 0 0 172.25.129.170:9000 0.0.0.0:* LISTEN 13126/java
销售具备的素质tcp 0 0 172.25.129.170:50522 172.25.129.170:9000 ESTABLISHED 13276/java
tcp 0 0 172.25.129.170:50616 172.25.129.170:9000 TIME_WAIT -
tcp 0 0 172.25.129.170:9000 172.25.129.170:50522 ESTABLISHED 13126/java
在windows10 机器的cmd命令⾏上telnet ⼀下:发现能成功连接上。因此可以放⼼debug了。
C:\Urs\Administrator.000>telnet 172.25.129.170 9000
最终,整个远程调试完整跑通:
程序输出:
Within Set Sum of Squared Errors = 0.11999999999994547
Cluster Centers:
[0.1,0.1,0.1]
汇总⼀下:启动spark master 和 slave命令。
./sbin/start-master.sh
./sbin/start-slave.sh spark://panda-e550:7077
曝光时间
查看spark管理界⾯
启动hdfs命令(伪分布式)
./sbin/start-dfs.sh
在知乎上看到⼀个问题:,放到这⾥供⼤家参考⼀下。
原⽂: