Description:
本篇博文主要介绍一下,如何使用 intellij IDEA 这款可视化集成编程工具来远程调试运行在 Spark 集群上面的 jar 文件。
在这里采用伪分布式单节点来部署 Spark 的运行环境,目的是为了防止分布式集群环境中(创建多个虚拟机在每台虚拟机上面部署 Spark 环境)一些不可控错误的发生。
环境搭建
实验环境准备
- 虚拟机 Oracle Virtual Box 版本:5.0.10
- 虚拟机中的 Linux 版本: 15.0.4
- Linux 中安装的 spark 版本: spark-1.5.2-bin-hadoop2.6.tgz
- Linux 中安装的 hadoop 版本: hadoop-2.6.3.tar.gz
- Linux 中安装的 JDK 版本: 1.7.0
- Linux 中安装的 scala 版本: 2.11.7
- 主机参数:
- CPU: i5-4460
- RAM: 8.00 GB
- 主机 Intellij 版本: Intellij-14.14 (正版破解版… =。=)
- 主机 JDK 版本: 1.8.0
- 主机 spark 软件发布包:spark-1.5.2-bin-hadoop2.6.tgz
在虚拟机上部署环境
- 首先更新 Ubuntu 的源,然后安装 Oracle 版本的 java7
- 安装过 spark 的同学告诉我,说是用 java8 来安装 spark 会抛出莫名异常,所以在 Linux 的上用的是就是 java7 版本,而在主机上 Intellij 的编译器使用的是 java8
单点部署安装 hadoop
- 将 hadoop 压缩包解压到指定目录下面
$ tar -xzf hadoop-2.6.3.tar.gz
$ mkdir /hadoop
$ mv hadoop-2.6.3 /hadoop/
- 为当前结点配置 ssh 的密钥对(即便是单点部署也需要实现 ssh 无密码登陆)
$ apt-get install openssh-server
* 如果系统中没有安装 ssh 软件的话使用 apt-get install 命令安装
$ apt-get install openssh-client
* 安装 ssh 的客户端
$ ssh-keygen -t rsa -P ""
* 生成无密码的公私密钥对
$ cd ~/.ssh/
* 生成的密钥对文件存放在 ~/.ssh/ 文件夹的下面
$ cat id_rsa.pub >> authorized_keys
* 将刚刚生成的公钥文件中的内容以追加的方式写入到 authorized_keys 文件中
$ chmod 600 authorized_keys
* 修改存放公钥文件的权限
$ ssh localhost
* 使用 ssh 来远程登录自身所在的主机
$ hostname
* 查看主机名称,我的是 aimer-v,存放主机名的配置文件(Ubuntu)是 /etc/hostname
$ ssh aimer-v
* 使用 ssh 登录名为 aimer-v 的主机,如果能够成功登录说明 ssh 正常工作
* 如果出现无法 ssh 正常访问登录的情况的话,首先使用 ping 命令来检查数据包是否可以正常收发
* 如果 ping 没有问题的话同时修改 ssh 对应路径下面的配置文件,并通过重启 ssh 服务来是配置文件生效
* 我的 ssh 配置文件所在路径是
$ /etc/ssh/ssh_config
* 修改过(注销注释)的字段是
PasswordAuthentication yes
CheckHostIP yes
IdentityFile ~/.ssh/id_rsa
Port 22
SendEnv LANG LC_*
HashKnownHosts yes
GSSAPIAuthentication yes
GSSAPIDelegateCredentials no
- 修改系统环境配置文件将 Hadoop 相关路径写入存放到其中,也就是将 Hadoop 安装包所在的文件夹路径添加到系统的搜索路径中,以便于用户无论在那个路径下面输入 Hadoop 相关命令都可以启动运行 Hadoop 文件夹下面的可执行脚本
$ vi /etc/profile
在文件的末尾追加
#set for hadoop
export HADOOP_HOME=/hadoop
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
export HADOOP_MAPRED_HOME=$HADOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib:$HADOOP_HOME/lib/native"
$ source /etc/profile # 让修改过的系统变量立即生效
- 修改 Hadoop 的相关配置文件
Hadoop 的一系列配置文件所在路径为 ${HADOOP_HOME}/etc/hadoop/ 的下面
- 首先修改的是名为 hadoop-env.sh 的配置文件
# hadoop-env.sh 文件中记录的是 hadoop 在启动的时候,到哪里去找 java 的编译器
# 和启动时内存空间大小的分配等,我只修改了下面这一个选项
export JAVA_HOME=/usr/lib/jvm/java-7-oracle
- 然后修改的是名为 core-site.xml 的配置文件
- 接下来修改的是 hdfs-site.xml
- 最后修改的是 yarn-site.xml
yarn 是 apache 的资源管理调度框架,和 yarn 等价的还有 mesos ,我没有在这里做过深入研究,感兴趣的同学可以进一步查阅相关资料。
- 根据配置文件中设置的文件夹和文件,并在当前系统中的对应路径下创建对应的文件夹和文件
$ mkdir /hadoop/tmp
$ mkdir /hadoop/dfs
$ mkdir /hadoop/dfs/name
$ mkdir /hadoop/dfs/data
- 格式化 hdfs
// 首先将路径切换到 ${HADOOP_HOME}/bin 的下面,然后执行下面的命令
$ ./hdfs namenode -format # 将 namenode 进行格式化操作
// 如果配置信息无误且正确运行的话,将会显示如下的输出信息
STARTUP_MSG: java = 1.7.0_80
************************************************************/
16/02/26 14:33:49 INFO namenode.NameNode: registered UNIX signal handlers for [TERM, HUP, INT]
16/02/26 14:33:49 INFO namenode.NameNode: createNameNode [-format]
Formatting using clusterid: CID-88b14724-7d23-46fd-a623-83029ad20c44
16/02/26 14:33:51 INFO namenode.FSNamesystem: No KeyProvider found.
16/02/26 14:33:51 INFO namenode.FSNamesystem: fsLock is fair:true
16/02/26 14:33:51 INFO blockmanagement.DatanodeManager: dfs.block.invalidate.limit=1000
16/02/26 14:33:51 INFO blockmanagement.DatanodeManager: dfs.namenode.datanode.registration.ip-hostname-check=true
16/02/26 14:33:51 INFO blockmanagement.BlockManager: dfs.namenode.startup.delay.block.deletion.sec is set to 000:00:00:00.000
16/02/26 14:33:51 INFO blockmanagement.BlockManager: The block deletion will start around 2016 Feb 26 14:33:51
16/02/26 14:33:51 INFO util.GSet: Computing capacity for map BlocksMap
16/02/26 14:33:51 INFO util.GSet: VM type = 64-bit
16/02/26 14:33:51 INFO util.GSet: 2.0% max memory 966.7 MB = 19.3 MB
16/02/26 14:33:51 INFO util.GSet: capacity = 2^21 = 2097152 entries
16/02/26 14:33:51 INFO blockmanagement.BlockManager: dfs.block.access.token.enable=false
16/02/26 14:33:51 INFO blockmanagement.BlockManager: defaultReplication = 1
16/02/26 14:33:51 INFO blockmanagement.BlockManager: maxReplication = 512
16/02/26 14:33:51 INFO blockmanagement.BlockManager: minReplication = 1
16/02/26 14:33:51 INFO blockmanagement.BlockManager: maxReplicationStreams = 2
16/02/26 14:33:51 INFO blockmanagement.BlockManager: replicationRecheckInterval = 3000
16/02/26 14:33:51 INFO blockmanagement.BlockManager: encryptDataTransfer = false
16/02/26 14:33:51 INFO blockmanagement.BlockManager: maxNumBlocksToLog = 1000
16/02/26 14:33:51 INFO namenode.FSNamesystem: fsOwner = root (auth:SIMPLE)
16/02/26 14:33:51 INFO namenode.FSNamesystem: supergroup = supergroup
16/02/26 14:33:51 INFO namenode.FSNamesystem: isPermissionEnabled = false
16/02/26 14:33:51 INFO namenode.FSNamesystem: HA Enabled: false
16/02/26 14:33:51 INFO namenode.FSNamesystem: Append Enabled: true
16/02/26 14:33:52 INFO util.GSet: Computing capacity for map INodeMap
16/02/26 14:33:52 INFO util.GSet: VM type = 64-bit
16/02/26 14:33:52 INFO util.GSet: 1.0% max memory 966.7 MB = 9.7 MB
16/02/26 14:33:52 INFO util.GSet: capacity = 2^20 = 1048576 entries
16/02/26 14:33:52 INFO namenode.NameNode: Caching file names occuring more than 10 times
16/02/26 14:33:52 INFO util.GSet: Computing capacity for map cachedBlocks
16/02/26 14:33:52 INFO util.GSet: VM type = 64-bit
16/02/26 14:33:52 INFO util.GSet: 0.25% max memory 966.7 MB = 2.4 MB
16/02/26 14:33:52 INFO util.GSet: capacity = 2^18 = 262144 entries
16/02/26 14:33:52 INFO namenode.FSNamesystem: dfs.namenode.safemode.threshold-pct = 0.9990000128746033
16/02/26 14:33:52 INFO namenode.FSNamesystem: dfs.namenode.safemode.min.datanodes = 0
16/02/26 14:33:52 INFO namenode.FSNamesystem: dfs.namenode.safemode.extension = 30000
16/02/26 14:33:52 INFO namenode.FSNamesystem: Retry cache on namenode is enabled
16/02/26 14:33:52 INFO namenode.FSNamesystem: Retry cache will use 0.03 of total heap and retry cache entry expiry time is 600000 millis
16/02/26 14:33:52 INFO util.GSet: Computing capacity for map NameNodeRetryCache
16/02/26 14:33:52 INFO util.GSet: VM type = 64-bit
16/02/26 14:33:52 INFO util.GSet: 0.029999999329447746% max memory 966.7 MB = 297.0 KB
16/02/26 14:33:52 INFO util.GSet: capacity = 2^15 = 32768 entries
16/02/26 14:33:52 INFO namenode.NNConf: ACLs enabled? false
16/02/26 14:33:52 INFO namenode.NNConf: XAttrs enabled? true
16/02/26 14:33:52 INFO namenode.NNConf: Maximum size of an xattr: 16384
Re-format filesystem in Storage Directory /hadoop/dfs/name ? (Y or N)
// 输入 'Y' 表示同意格式化 namenode
// 如果成功初始化的话,将会显示如下的信息
16/02/26 14:34:55 INFO namenode.FSImage: Allocated new BlockPoolId: BP-1525144641-127.0.0.1-1456468495698
16/02/26 14:34:56 INFO common.Storage: Storage directory /hadoop/dfs/name has been successfully formatted.
16/02/26 14:34:56 INFO namenode.NNStorageRetentionManager: Going to retain 1 images with txid >= 0
16/02/26 14:34:56 INFO util.ExitUtil: Exiting with status 0
16/02/26 14:34:56 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at aimer-v/127.0.0.1
************************************************************/
显示如上信息便说明 namenode 格式化成功
- 然后再将路径切换到 ${HADOOP_HOME}/sbin 的下面
$ ./start-dfs.sh # 启动 hdfs
- 如若成功启动显示日志信息如下
root@aimer-v:/hadoop/sbin# ./start-dfs.sh
Starting namenodes on [localhost]
localhost: starting namenode, logging to /hadoop/logs/hadoop-root-namenode-aimer-v.out
localhost: starting datanode, logging to /hadoop/logs/hadoop-root-datanode-aimer-v.out
Starting secondary namenodes [0.0.0.0]
0.0.0.0: starting secondarynamenode, logging to /hadoop/logs/hadoop-root-secondarynamenode-aimer-v.out
- 启动 yarn
$ ./start-yarn.sh
- 若 yarn 成功运行显示如下日志信息
root@aimer-v:/hadoop/sbin# ./start-yarn.sh &
[1] 5993
root@aimer-v:/hadoop/sbin# starting yarn daemons
starting resourcemanager, logging to /hadoop/logs/yarn-root-resourcemanager-aimer-v.out
localhost: starting nodemanager, logging to /hadoop/logs/yarn-root-nodemanager-aimer-v.out
[1]+ Done ./start-yarn.sh
- 通过输入 jps 命令来查看 Hadoop 相关进程是否处于正常工作的状态
$ jps
5602 NameNode
6137 NodeManager
5866 SecondaryNameNode
6031 ResourceManager
6445 Jps
安装 spark 之前先安装好和安装 spark 版本相匹配的 scala
- 首先写在系统中默认安装的 scala
$ apt-get remove scala
- 将下载到本地的 scala 压缩包进行解压
$ tar -xvf scala-2.11.7.tgz
- 修改系统配置文件,将 scala 所在路径追加到系统搜索路径中
$ vi /etc/profile
- 向文件中追加如下的信息
export SCALA_HOME=/scala
export PATH=$SCALA_HOME/bin:$PATH
在 hadoop 的基础上继续安装 spark
- 解压软件包
tar -xvf spark-1.5.2-bin-hadoop2.6.tgz
- 修改系统配置文件,将 spark 所在路径添加到系统搜索路径中
1 | $ vi /etc/profile |
- 最后通过该命令让修改的系统配置信息立即生效
1 | $ source /etc/profile |
- 修改 spark 的配置文件
$ cd ${SPARK_HOME}/conf
$ cp spark-env.sh.template spark-env.sh # 在这里建议将配置文件的文件模板进行保留,通过创建它的备份的方式来在备份文件上面进行修改
- 打开 spark-env.sh 文件,然后添加如下的信息
$ vi spark-env.sh
export JAVA_HOME=/usr/lib/jvm/java-7-oracle
export SCALA_HOME=/opt/scala
export HADOOP_CONF_DIR=/hadoop/etc/hadoop
* 通过脚本来启动 spark 相关的服务
$ cd ${SPARK_HOME}/sbin
$ ./start-all.sh
- 如果启动成功的话,将会显示出如下的信息
root@aimer-v:/spark/sbin# ./start-all.sh
rsync from localhost
rsync: change_dir "/spark/sbin//localhost" failed: No such file or directory (2)
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1183) [sender=3.1.1]
starting org.apache.spark.deploy.master.Master, logging to /spark/sbin/../logs/spark-root-org.apache.spark.deploy.master.Master-1-aimer-v.out
localhost: starting org.apache.spark.deploy.worker.Worker, logging to /spark/sbin/../logs/spark-root-org.apache.spark.deploy.worker.Worker-1-aimer-v.out
- 通过输入 jps 命令来查看系统中各个进程的运行状态信息
$ jps
root@aimer-v:/spark/sbin# jps
5470 SecondaryNameNode
5332 DataNode
6911 Worker
6690 Master
5776 NodeManager
5224 NameNode
5669 ResourceManager
6955 Jps
- 其中的 Master 和 Worker 便是我们刚才启动 Spark 所运行的相关进程
- 通过脚本来运行 spark-shell 通过脚本的方式来访问 spark
$ cd ${SPARK_HOME}/bin
$ ./spark-shell
// 如果正常启动的话,将会显示如下日志信息
自此,虚拟机上面 hadoop & spark 的单节点运行环境部署结束
在主机上部署环境
搭建 WordCounter 的编程环境
在这里我们使用的是 scala 编程语言来进行编写 wordcounter 程序
step 1. 在 Intellij 中创建一个新的 scala 项目
step 2. 打开 File -> Project Structure -> 点击最左栏中的 Libraries 选项 –> 绿色的 ‘+’ 按钮
step 3. 将刚刚下载的 spark-1.5.2-bin-hadoop2.6 文件下 spark-1.5.2-bin-hadoop2.6\spark-1.5.2-bin-hadoop2.6\lib\spark-assembly-1.5.2-hadoop2.6.0.jar 文件加载到当前编程环境中
- step 4. 设置编译代码生成的 .jar 文件所在的路径, 打开 File -> Project Structure -> 点击最左栏中的 Artifacts 选项 –> 绿色的 ‘+’ 按钮 Jar -> From modules with dependencies ,然后在弹出的 ‘Create JAR from Modules’ 中的 ‘Main Class’ 选中对应的函数入口类文件,在这里我们选的是 SparkWordCount 这个文件
- step 5. 为 META-INF/MAINFEST.MF 这个将要生成的配置文件设置路径
- step 6. 在 Name 栏中设置将要生成的 .jar 文件的名称, 在 Output directory 一栏中设置 .jar 文件将会输出的路径
- step 7. 同时不要忘了将 Build on make 设置有效,最后点击 ok 按钮
- step 8. 编写代码 SparkWordCount.scala 代码如下所示
import org.apache.spark.{SparkConf, SparkContext}
object SparkWordCount {
def main(args: Array[String]) {
val conf = new SparkConf().setAppName("SparkWordCount").setMaster("localhost")
val sc = new SparkContext(conf)
val count=sc.textFile(args(0)).filter(line => line.contains("Spark")).count()
println("count="+count)
sc.stop()
}
}
- 在再次运行代码的过程中出了一点问题: IDE 报错了显示缺少 scala (SDK) 相关的 jar 文件
- 引发报错的原因是: 之前引用到当前系统中的 SDK 索引没有更新,重新导入一次即可,如下图所示, IDE 重新创建一下索引即可征程编译
- step 9. 编译刚刚编写的代码 Build -> Make Project , 然后到对应的路径下面找 jar 文件
将生成的 jar 文件上传至安装有 spark 的虚拟机上
- 在对应的路径下创建文件夹,然后将生成的 .jar 文件上传到该文件夹下面
开始远程调试
首先在虚拟机(Linux)的命令行中输入命令让 spark 来以调试的方式执行上传 jar 文件
$ cd ${SPARK_HOME}/bin
- 然后查看虚拟机的 IP 地址信息,我的是
root@aimer-v:/home/aimer/spark_remote# ifconfig
eth0 Link encap:Ethernet HWaddr 08:00:27:f5:3e:29
inet addr:10.0.2.15 Bcast:10.0.2.255 Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:fef5:3e29/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:169490 errors:0 dropped:0 overruns:0 frame:0
TX packets:50036 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:208071948 (208.0 MB) TX bytes:3995229 (3.9 MB)
eth1 Link encap:Ethernet HWaddr 08:00:27:e5:6b:20
inet addr:192.168.56.113 Bcast:192.168.56.255 Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:fee5:6b20/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:934783 errors:0 dropped:0 overruns:0 frame:0
TX packets:458868 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:987944856 (987.9 MB) TX bytes:42138914 (42.1 MB)
eth2 Link encap:Ethernet HWaddr 08:00:27:15:4d:1b
inet addr:192.168.56.112 Bcast:192.168.56.255 Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:fe15:4d1b/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:390 errors:0 dropped:0 overruns:0 frame:0
TX packets:840 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:45543 (45.5 KB) TX bytes:103389 (103.3 KB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:965869 errors:0 dropped:0 overruns:0 frame:0
TX packets:965869 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:497637820 (497.6 MB) TX bytes:497637820 (497.6 MB)
在上述的 IP 地址中
- 第一个是我用来在虚拟机上面以 NAT 的方式登录互联网的 IP
- 第二个 IP 地址是多结点分布式部署 spark 集群设定的 IP
- 第三个 IP 地址是用来进行主机到虚拟机二者之间进行 ssh 远程连接的 IP 地址
第四个 主机自循环 IP 地址
因为我们在进行远程调试的时候,是想把虚拟机中的调试信息数据通过端口号传到主机(windows)的上面,
所以选用的输出调试信息的 IP 地址与 ssh 所使用的相同,只不过端口号不同一个是 8888 另一个是 22 罢了
接下来,不要着急运行 jar ,在这里由于 word-counter 这个程序是从 hdfs 上面来读取文本文件的,
所以还需要将输入文本文件上传到 hdfs 的上
首先将本地的文本文件 README.md(我用的是 spark 的 README 文件,随便什么 ASCII 编码的文本文件都可以) 上传到 hdfs 的上面
$ hdfs dfs -put REAEME.md /
- 查看文件是否被正确的上传,以及对应的结果路径是否正确的被创建 (在此期间,发现 datanode 没有启动,所以 README.md 这个本地文件并没有正确上传,所以先停掉了 spark ,hadoop , 然后重启 hadoop ,在 hadoop 启动之后又将 spark 进行启动)
$ hdfs dfs -ls /
root@aimer-v:/home/aimer/spark_remote# hdfs dfs -ls /
Found 5 items
-rw-r--r-- 1 root supergroup 3593 2016-02-26 16:34 /README.md
drwx-wx-wx - root supergroup 0 2016-01-01 23:31 /tmp
drwxr-xr-x - root supergroup 0 2016-01-01 23:53 /user
- 在输入文件上传,输出数据文件路径分别在 hdfs 上创建好之后便可以输入如下命令
$ ./spark-submit --master spark://aimer-v:7077 --name SparkWordCount --class SparkWordCount --driver-java-options "-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8888" --executor-memory 1G /home/aimer/spark_remote/spark_learning.jar hdfs://aimer-v:9000/README.md
上述的 –driver-java-options 后面所跟随的命令参数是是这样的:
- -Xdebug
这个参数是通知 JVM 工作在 DEBUG 的模式下面
-Xrunjdwp 这个参数是用来通知 JVM 使用 (java debug wire protocol) 来运行调试环境
-Xrunjdwp:transport=dt_socket 这个参数用来指定的是调试期间生成的数据传输的方式,
如果后跟 dt_shmem 这个参数的话表示的是以共享内存的方式来传递调试产生的数据,不过
dt_shmem
仅在 Windows 平台下适用。server 该参数指的是是否支持在 server 模式的 VM 中
suspend 参数是用来设定是否等到用于调试的客户端成功创建连接之后,再来执行 JVM
address 参数用来指定的是调试信息发送的端口号
- 如果正确运行的话,命令行中会显示如下的信息
Listening for transport dt_socket at address: 8888
然后在本地的 Intellij 中通过如下的配置来接收远程发来的调试信息,实现远程调试功能
- step 1 Run -> Edit Configurations 配置如下图所示的远程调试配置信息,为这个创建的远程调试设定一个名称 “remote-spark”
- step 2 Run -> Debug ‘remote-spark’
如果成功连接的话,将会在下面显示如下的信息(不要忘了在本地的代码上打上端点)
- 同时如果将窗口切换到远程访问界面的话,也会看到对应输出的日志信息(直接截图)
- step 3 继续调试,直到程序结束,最终结果既不会显示在 IDE 的控制台输出信息中,而是会显示在 linux 的命令提示行中
关于结束收尾工作
首先结束 spark
- 将路径切换到 ${SPARK_HOME}/sbin
- 然后运行如下命令停止 spark 相关进程
root@aimer-v:/spark/sbin# ./stop-all.sh
localhost: stopping org.apache.spark.deploy.worker.Worker
stopping org.apache.spark.deploy.master.Master
然后结束 hadoop
- 将路径切换到 ${HADOOP_HOME}/sbin 下面
- 然后运行如下的命令来停止 hadoop 相关的进程
root@aimer-v:/hadoop/sbin# ./stop-all.sh
This script is Deprecated. Instead use stop-dfs.sh and stop-yarn.sh
Stopping namenodes on [localhost]
localhost: stopping namenode
localhost: stopping datanode
Stopping secondary namenodes [0.0.0.0]
0.0.0.0: stopping secondarynamenode
stopping yarn daemons
stopping resourcemanager
localhost: stopping nodemanager
no proxyserver to stop
最后输入 jps 命令来检查是否相关进程均停止
root@aimer-v:/spark/bin# jps
7305 SparkSubmit
10003 Jps
是的,本篇博客最大的败笔除了截图截得参差不齐之外,就是最后这个运行的 SparkSubmit 进程我不知道如何停止它;
直接 kill 没有生效,就当做是挖个坑好了,解决之后再来写上 (= . =)||
end