IT科技类资讯

Spark Submit的ClassPath问题

字号+作者:益华科技来源:IT科技类资讯2025-11-05 08:24:54我要评论(0)

需求场景:我们的产品需要与客户的权限系统对接,即在登录时使用客户的认证系统进行认证。集成认证的方式是调用客户提供的jar包,调用userService的authenticate方法。同时,还需要在cl

需求场景:

我们的产品需要与客户的权限系统对接,即在登录时使用客户的认证系统进行认证。集成认证的方式是调用客户提供的jar包,调用userService的authenticate方法。同时,还需要在classpath中提供密钥的key文件。

从需求看,这个集成并不复杂,且客户也提供了较翔实的接口文档与示例案例,开发工作量非常小。***的阻碍是客户有安全要求,内部的Jar包及其他文件都不能拷贝出来,而我们的开发环境是不能连接客户内网的。客户提供的Jar包并没有通过Maven来管理,我们只能采用直接导入的方式。在我们的Scala项目中,IT技术网可以直接将要依赖的jar包放在module的lib文件夹下,在使用sbt执行编译和打包任务时,会自动将lib下的jar包放入classpath中。

那么,需要解决的***个问题是:由于客户的jar包不能拷贝到我的开发环境中,该如何处理该依赖?

既然在开发环境下拿不到这个jar包,那就做一个mock包吧。幸而需要编写的代码仅仅牵涉到ServiceConfig、ServiceManager与UserService三个类以及这些类的少数方法。其中ServiceConfig提供了认证需要的属性值,并通过set方法进行设置。因为最终需要调用的其实是UserService的authenticate方法,只需要为其提供一个简单的实现,并定义好其他相关的类型与方法,保证编译能够通过即可。

***个问题轻松解决。

由于我们使用了sbt assembly,并编写了对应的b2b供应网脚本来支持整个产品的打包工作,最终打包的结果是一个完整的mort.jar包。换言之,我们要依赖的外部Jar包也将被打包到最终的jar文件中。故而,第二个问题接踵而来:既然程序代码与外部jar包都被打包到最终的部署包中,当我们将该包拷贝到客户的部署环境中后,该如何将之前的mock包替换为真正的实现呢?

实际上,sbt assembly并不会将所有依赖的外部包都装配到最终的部署包中,只要在sbt的依赖中添加provided,就能保证第三方依赖包不被包含进部署包中。因此,我们可以改写sbt脚本,当执行assembly时,排除这个mock包,这是首要解决的方案。方法是在build.sbt中添加如下脚本:

excludedJars in assembly := {   val cp = (fullClasspath in assembly).value   cp filter {_.data.getName == "customer_provided_mock.jar" } } 

部署包确实不再包含这个外部依赖包了,网站模板但是在部署时,我们还得将真实的jar包放入到部署环境的classpath中。然而事与愿违,当我们将真正的jar包放在本地的classpath中时,运行时却找不到这个jar包。问题出现在哪里?

原因在于我们的程序并非一个普通的java程序,而是一个spark application,部署环境则为集群环境,运行该程序是通过spark submit的方式,将部署包提交到spark的cluster manager。这就需要分析spark submit的工作原理,如下图所示:

在集群部署模式下,Driver端通过spark-submit将spark application提交到集群,然后分发到Job到Worker节点。我们系统的主程序入口为com.bigeyedata.mort.Main,程序的运行是通过spark-submit去调用部署包的Main,即在spark driver下运行,而非在本地通过java启动虚拟机执行mort.jar。

这就是在本地设置classpath不生效的根本原因。

我注意到spark-submit提供了--jar参数,除了spark application这个jar包之外的其他jar包,都可以通过这个参数指定包,从而将其自动传送给集群。注意,若--jar指定了多个jar包,则通过分隔符,分隔,这与--driver-class-path的分隔符不同,后者使用:。因此,我修改了启动程序的脚本,将其设置为:

exec $SPARK_HOME/bin/spark-submit \ --class com.bigeyedata.mort.Main \ --driver-class-path $MORT_HOME/libs/*.jar \ --master yarn-client \ --deploy-mode cluster \ --jars /appcom/mort/thirdparty_jars/customer_provided.jar \ --queue queue_0100_01 \ $MORT_HOME/mort.jar > $MORT_HOME/mort.log 2>&1 

还有一个问题需要解决:如何放置用户认证需要的密钥key文件?

该文件仍然不能作为内嵌的资源文件打包到部署包中。因为这个文件的内容需要区分测试环境和生产环境。在部署到生产环境中时,需要替换为另一个key文件。客户的文档说明,需要将该文件(不是jar文件)放到运行的classpath中。

解决办法如前,仍然不能直接将key文件放入到本地的classpath中,而是利用spark-submit的--files参数。故而需要在前面的脚本中,为spark-submit添加如下内容:

--files /appcom/mort/thirdparty_jars/clientKey.pk \ 

三个问题给我制造了一定的麻烦,尤其是第二个问题的解决,又让我温习了spark submit的工作原理,了解相关参数的作用。虽然花费了一些时间,但问题的解决还是颇有价值的。

【本文为专栏作者“张逸”原创稿件,转载请联系原作者】

戳这里,看该作者更多好文

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • 如何强制解除BitLocker加密?(教你有效解锁BitLocker加密的方法和步骤)

    如何强制解除BitLocker加密?(教你有效解锁BitLocker加密的方法和步骤)

    2025-11-05 08:21

  • OpenOffice 是除 LibreOffice 以外能够替代微软 Office 的另一个非常强大的办公套件,也有许多的 Linux 发行版默认集成的是 OpenOffice,我个人也非常喜欢。所以本教程中我们将向大家介绍如何在 Ubuntu 及 Linux Mint  中安装 OpenOffice,当然本文步骤也适合在 Ubuntu 衍生 Linux 发行版中安装 OpenOffice。卸载LibreOffice由于 Ubuntu 默认集成了 LibreOffice,在正式安装 OpenOffice 之前建议大家先将其卸载掉。要卸载 LibreOffice 可以使用如下命令:复制代码代码如下:sudo apt-get remove --purge libreoffice*sudo apt-get cleansudo apt-get autoremoveOpenOffice 32 位版本安装步骤1.先切换到tmp临时文件夹复制代码代码如下:cd /tmp/2.下载OpenOffice 32位版安装程序复制代码代码如下:wget http://sourceforge.net/projects/openofficeorg.mirror/files/4.1.1/binaries/zh-CN/Apache_OpenOffice_4.1.1_Linux_x86_install-deb_zh-CN.tar.gz3.解压安装程序并进行安装复制代码代码如下:tar -xzvf Apache_OpenOffice_4.1.1_Linux_x86_install-deb_zh-CN.tar.gzcd zh-CN/DEBSsudo dpkg -i *.debcd desktop-integrationsudo dpkg -i *.debOpenOffice 64 位版本安装步骤1.先切换到tmp临时文件夹复制代码代码如下:cd /tmp/2.下载OpenOffice 32位版安装程序复制代码代码如下:wget http://sourceforge.net/projects/openofficeorg.mirror/files/4.1.1/binaries/zh-CN/Apache_OpenOffice_4.1.1_Linux_x86-64_install-deb_zh-CN.tar.gz3.解压安装程序并进行安装复制代码代码如下:tar -xzvf Apache_OpenOffice_4.1.1_Linux_x86-64_install-deb_zh-CN.tar.gzcd zh-CN/DEBSsudo dpkg -i *.debcd desktop-integrationsudo dpkg -i *.deb

    OpenOffice 是除 LibreOffice 以外能够替代微软 Office 的另一个非常强大的办公套件,也有许多的 Linux 发行版默认集成的是 OpenOffice,我个人也非常喜欢。所以本教程中我们将向大家介绍如何在 Ubuntu 及 Linux Mint  中安装 OpenOffice,当然本文步骤也适合在 Ubuntu 衍生 Linux 发行版中安装 OpenOffice。卸载LibreOffice由于 Ubuntu 默认集成了 LibreOffice,在正式安装 OpenOffice 之前建议大家先将其卸载掉。要卸载 LibreOffice 可以使用如下命令:复制代码代码如下:sudo apt-get remove --purge libreoffice*sudo apt-get cleansudo apt-get autoremoveOpenOffice 32 位版本安装步骤1.先切换到tmp临时文件夹复制代码代码如下:cd /tmp/2.下载OpenOffice 32位版安装程序复制代码代码如下:wget http://sourceforge.net/projects/openofficeorg.mirror/files/4.1.1/binaries/zh-CN/Apache_OpenOffice_4.1.1_Linux_x86_install-deb_zh-CN.tar.gz3.解压安装程序并进行安装复制代码代码如下:tar -xzvf Apache_OpenOffice_4.1.1_Linux_x86_install-deb_zh-CN.tar.gzcd zh-CN/DEBSsudo dpkg -i *.debcd desktop-integrationsudo dpkg -i *.debOpenOffice 64 位版本安装步骤1.先切换到tmp临时文件夹复制代码代码如下:cd /tmp/2.下载OpenOffice 32位版安装程序复制代码代码如下:wget http://sourceforge.net/projects/openofficeorg.mirror/files/4.1.1/binaries/zh-CN/Apache_OpenOffice_4.1.1_Linux_x86-64_install-deb_zh-CN.tar.gz3.解压安装程序并进行安装复制代码代码如下:tar -xzvf Apache_OpenOffice_4.1.1_Linux_x86-64_install-deb_zh-CN.tar.gzcd zh-CN/DEBSsudo dpkg -i *.debcd desktop-integrationsudo dpkg -i *.deb

    2025-11-05 07:55

  • ubuntu gedit中文乱码看起来很烦人,本文提供两种解决途径,终端命令行途径或者图形界面操作途径,其实原理都是增加编码类型,问题显示如下图,查看文档内容,发现乱码方法一:终端途径1、打开终端2、在终端中输入下面的内容,回车 复制内容到剪贴板    gconftool-2 --set --type=list --list-type=string /apps/gedit-2/preferences/encodings/auto_detected [UTF-8,CURRENT,GB18030,BIG5-HKSCS,UTF-16]   方法二:图形界面途径1、同时按住 Alt-F2,打开“Run Application”窗口2、输入gconf-editor,点击“Run“,进入Configuration Editor界面3、点击左边的”+“号找到 /apps/gedit-2/preferences/encodings,并单击4、右键auto_detected,点击“Edit Key”5、点击“Add”,在New list value处输入GB18030,点击OK6、选中列表最下面的“GB18030”,点击右边的“Up”,直到“GB18030”移动到列表的最上方7、点击OK关闭Configuration Editor8、再次查看文档内容,乱码消失注意事项:命令行的命令不要输入错误。

    ubuntu gedit中文乱码看起来很烦人,本文提供两种解决途径,终端命令行途径或者图形界面操作途径,其实原理都是增加编码类型,问题显示如下图,查看文档内容,发现乱码方法一:终端途径1、打开终端2、在终端中输入下面的内容,回车 复制内容到剪贴板 gconftool-2 --set --type=list --list-type=string /apps/gedit-2/preferences/encodings/auto_detected [UTF-8,CURRENT,GB18030,BIG5-HKSCS,UTF-16]   方法二:图形界面途径1、同时按住 Alt-F2,打开“Run Application”窗口2、输入gconf-editor,点击“Run“,进入Configuration Editor界面3、点击左边的”+“号找到 /apps/gedit-2/preferences/encodings,并单击4、右键auto_detected,点击“Edit Key”5、点击“Add”,在New list value处输入GB18030,点击OK6、选中列表最下面的“GB18030”,点击右边的“Up”,直到“GB18030”移动到列表的最上方7、点击OK关闭Configuration Editor8、再次查看文档内容,乱码消失注意事项:命令行的命令不要输入错误。

    2025-11-05 07:54

  • 小心谨慎或灾难体验会让每一个系统管理都认识到频繁的系统备份的重要性。你可以通过编写管用的旧式 shell 脚本,或使用一个(或几个)适合这项工作的备份工具来完成备份任务。因此,当你要实施一个备份解决方案时,你了解的备份工具越多,你做出的决策就会越明智。在该文中,我们将为你介绍 backupninja ,这是一个轻量且易于配置的系统备份工具。在诸如 rdiff-backup, duplicity, mysqlhotcopy 和 mysqldump 等程序的帮助下, Backupninja 可以提供常用的备份功能,如执行远程的、安全的和增量式的文件系统备份,加密备份以及 MySQL/MariaDB 数据库备份。你可以选择性地开启使用 Email 状态报告功能,也可以对一般的硬件和系统的信息进行备份。 backupninja 的一个关键功能是它拥有一个内建的基于控制台的向导程序(被称为 ninjahelper),而后者允许你为不同的备份情景轻松地创建配置文件。假如非要说的话,backupninja 的缺点是:为了充分使用其所有的功能,它要求安装一些其他“助手”程序。尽管 backupninja 有针对基于 Red Hat(红帽)的发行版本的 RPM 安装包,但 backupninja 针对 Debian 及其衍生发行版本的依赖进行了优化。所以不建议在基于 Red Hat 的系统上尝试 backupninja 。在这篇教程中,我们将介绍如何在基于 Debian 的发行版本上安装 backupninja 。安装 Backupninja以 root 账户来运行下面的命令:复制代码代码如下: # aptitude install backupninja 在安装的过程中,有几个文件和目录将被创建:        /usr/sbin/backupninja 是个 bash shell 的主脚本; /etc/cron.d/backupninja, 默认情况下,设置 cron 任务来每隔一个小时运行上面的主脚本; /etc/logrotate.d/backupninja 截断由 backupninja 程序产生的日志; /etc/backup.d/ 是备份操作的配置文件驻留的目录; /etc/backupninja.conf 是包含一般选项的主配置文件。这个文件带有良好的注释且详细解释了每个选项的含义; /usr/share/backupninja 是那些 backupninja 所使用的脚本所处的目录。这些脚本文件负责执行实际的工作。在这个目录中,你还可以找到 .helper 文件,它们可以被用来配置和设定 ninjahelper 的菜单; /usr/share/doc/backupninja/examples 含有操作配置文件(即通过 ninjahelper 产生的文件)的模板。首次运行 Ninjahelper当我们尝试启动 ninjahelper 时,我们可以看到可能需要一个内部依赖程序。假如系统进行了提示,请输入 “yes” 并敲下回车键来安装 dialog(一个用于从 shell 脚本中显示友好对话框的工具)。当你在键入 yes 后再敲回车键时,backupninja 将会安装 dialog,一旦安装完成,将呈现出下面的截屏:案例 1: 备份硬件和系统信息在启动了 ninjahelper 之后,我们将创建一个新的备份操作:假如必要的助手程序没有被安装,下面的截屏将会呈现在我们眼前。假如这些软件包已经在你的系统上安装了,请跳过这一步。接下来的一步需要你选取相关条目来作为此次备份任务的一部分。前四个条目已经默认被选上了,但你可以通过在条目上按空格键来撤消选择。一旦你完成了上面的步骤,按 OK 选项来继续。接着你将能够选择是愿意使用默认的配置文件(/etc/backup.d/10.sys)来完成这次备份操作,还是创建一个新的配置文件。若为后者,一个含有与默认配置文件内容相同的文件将会在相同的目录下被创建,但它被命名为 11.sys,后续的备份操作将会创建类似的文件(注:只不过命名的序号不同)。需要说明的是一旦这个新的配置文件被创建,你便可以使用你喜爱的文本编辑器来编辑该文件。案例 2: 一个远程目录的增量式 Rsync 拉取备份正如你最有可能知道的那样, rsync 被广泛地用于通过网络同步文件或文件夹。在接下来的例子中,我们将讨论一个使用硬链接来为一个远程目录做增量式拉取备份的方法,它被用来保存历史数据以及在我们本地的文件服务器中恢复这些历史数据。这个方法将帮助我们节省空间并增强位于服务器端的安全性。步骤 1:编写一个带有如下内容的自定义脚本,放在 /etc/backup.d,并将它的权限设置为 600 。需要说明的是,除了一般的配置文件,这个目录可能还包含当 backupninja 执行时你想运行的一些脚本文件,它们可以发挥出位于主配置文件中的变量的优势。复制代码代码如下:# REMOTE USER    user=root    # REMOTE HOST    host=dev1    # REMOTE DIRECTORY    remotedir=/home/gacanepa/    # LOCAL DIRECTORY    localdir=/home/gacanepa/backup.0    # LOCAL DIRECTORY WHERE PREVIOUS BACKUP WAS STORED    localdirold=/home/gacanepa/backup.1    mv $localdir $localdirold    # RSYNC    rsync -av --delete --recursive --link-dest=$localdirold $user@$host:$remotedir $localdir在上面的配置中, rsync 的 ‘--link-dest’ 选项的作用是为位于 $localdir-old 目录中那些没有改变的文件(包含所有属性) 硬链接到目标目录($localdir)。步骤 2:在 backupninja 第一次运行之前,上层目录(这个例子中指的是 /home/gacanepa) 是空的。第一次我们执行下面的命令:复制代码代码如下:# backupninja -nbackup.0 目录就被创建了,并在接下来的过程中,它的名称将会被更改为 backup.1。当我们第二次运行 backupninja 时, backup.0 将会被重新创建,而 backup.1 保持不动。步骤 3: 确保 backup.1 里面的文件硬链接到 backup.0 里的文件,我们可以通过比较文件的 inode(i 节点)数和目录的大小来达到此目的。总结Backupninja 不仅是一个经典的备份工具,它也是一个易于配置的实用程序。你可以通过编写你自己的控制脚本,用放在 /etc.backup.d 中的不同的配置文件来运行 backupninja 。甚至你还可以为 ninjahelper 编写助手程序,并将其包括在 ninjahelper 的主界面上。例如,假如你在 /usr/share/backupninja目录中创建了一个名为 xmodulo 的控制脚本,它将自动运行那些位于 /etc/backup.d 目录中以 .xmodulo 为后缀的每个文件。假如你决定添加你的 xmodulo 控制脚本到 ninjahelper 中, 你可以编写相应的助手程序,即 xmodulo.helper 。另外,假如你想 让 backupninja 运行其它的脚本,只需把它添加到 /etc/backup.d 目录中就可以了。

    小心谨慎或灾难体验会让每一个系统管理都认识到频繁的系统备份的重要性。你可以通过编写管用的旧式 shell 脚本,或使用一个(或几个)适合这项工作的备份工具来完成备份任务。因此,当你要实施一个备份解决方案时,你了解的备份工具越多,你做出的决策就会越明智。在该文中,我们将为你介绍 backupninja ,这是一个轻量且易于配置的系统备份工具。在诸如 rdiff-backup, duplicity, mysqlhotcopy 和 mysqldump 等程序的帮助下, Backupninja 可以提供常用的备份功能,如执行远程的、安全的和增量式的文件系统备份,加密备份以及 MySQL/MariaDB 数据库备份。你可以选择性地开启使用 Email 状态报告功能,也可以对一般的硬件和系统的信息进行备份。 backupninja 的一个关键功能是它拥有一个内建的基于控制台的向导程序(被称为 ninjahelper),而后者允许你为不同的备份情景轻松地创建配置文件。假如非要说的话,backupninja 的缺点是:为了充分使用其所有的功能,它要求安装一些其他“助手”程序。尽管 backupninja 有针对基于 Red Hat(红帽)的发行版本的 RPM 安装包,但 backupninja 针对 Debian 及其衍生发行版本的依赖进行了优化。所以不建议在基于 Red Hat 的系统上尝试 backupninja 。在这篇教程中,我们将介绍如何在基于 Debian 的发行版本上安装 backupninja 。安装 Backupninja以 root 账户来运行下面的命令:复制代码代码如下: # aptitude install backupninja 在安装的过程中,有几个文件和目录将被创建:     /usr/sbin/backupninja 是个 bash shell 的主脚本; /etc/cron.d/backupninja, 默认情况下,设置 cron 任务来每隔一个小时运行上面的主脚本; /etc/logrotate.d/backupninja 截断由 backupninja 程序产生的日志; /etc/backup.d/ 是备份操作的配置文件驻留的目录; /etc/backupninja.conf 是包含一般选项的主配置文件。这个文件带有良好的注释且详细解释了每个选项的含义; /usr/share/backupninja 是那些 backupninja 所使用的脚本所处的目录。这些脚本文件负责执行实际的工作。在这个目录中,你还可以找到 .helper 文件,它们可以被用来配置和设定 ninjahelper 的菜单; /usr/share/doc/backupninja/examples 含有操作配置文件(即通过 ninjahelper 产生的文件)的模板。首次运行 Ninjahelper当我们尝试启动 ninjahelper 时,我们可以看到可能需要一个内部依赖程序。假如系统进行了提示,请输入 “yes” 并敲下回车键来安装 dialog(一个用于从 shell 脚本中显示友好对话框的工具)。当你在键入 yes 后再敲回车键时,backupninja 将会安装 dialog,一旦安装完成,将呈现出下面的截屏:案例 1: 备份硬件和系统信息在启动了 ninjahelper 之后,我们将创建一个新的备份操作:假如必要的助手程序没有被安装,下面的截屏将会呈现在我们眼前。假如这些软件包已经在你的系统上安装了,请跳过这一步。接下来的一步需要你选取相关条目来作为此次备份任务的一部分。前四个条目已经默认被选上了,但你可以通过在条目上按空格键来撤消选择。一旦你完成了上面的步骤,按 OK 选项来继续。接着你将能够选择是愿意使用默认的配置文件(/etc/backup.d/10.sys)来完成这次备份操作,还是创建一个新的配置文件。若为后者,一个含有与默认配置文件内容相同的文件将会在相同的目录下被创建,但它被命名为 11.sys,后续的备份操作将会创建类似的文件(注:只不过命名的序号不同)。需要说明的是一旦这个新的配置文件被创建,你便可以使用你喜爱的文本编辑器来编辑该文件。案例 2: 一个远程目录的增量式 Rsync 拉取备份正如你最有可能知道的那样, rsync 被广泛地用于通过网络同步文件或文件夹。在接下来的例子中,我们将讨论一个使用硬链接来为一个远程目录做增量式拉取备份的方法,它被用来保存历史数据以及在我们本地的文件服务器中恢复这些历史数据。这个方法将帮助我们节省空间并增强位于服务器端的安全性。步骤 1:编写一个带有如下内容的自定义脚本,放在 /etc/backup.d,并将它的权限设置为 600 。需要说明的是,除了一般的配置文件,这个目录可能还包含当 backupninja 执行时你想运行的一些脚本文件,它们可以发挥出位于主配置文件中的变量的优势。复制代码代码如下:# REMOTE USER user=root # REMOTE HOST host=dev1 # REMOTE DIRECTORY remotedir=/home/gacanepa/ # LOCAL DIRECTORY localdir=/home/gacanepa/backup.0 # LOCAL DIRECTORY WHERE PREVIOUS BACKUP WAS STORED localdirold=/home/gacanepa/backup.1 mv $localdir $localdirold # RSYNC rsync -av --delete --recursive --link-dest=$localdirold $user@$host:$remotedir $localdir在上面的配置中, rsync 的 ‘--link-dest’ 选项的作用是为位于 $localdir-old 目录中那些没有改变的文件(包含所有属性) 硬链接到目标目录($localdir)。步骤 2:在 backupninja 第一次运行之前,上层目录(这个例子中指的是 /home/gacanepa) 是空的。第一次我们执行下面的命令:复制代码代码如下:# backupninja -nbackup.0 目录就被创建了,并在接下来的过程中,它的名称将会被更改为 backup.1。当我们第二次运行 backupninja 时, backup.0 将会被重新创建,而 backup.1 保持不动。步骤 3: 确保 backup.1 里面的文件硬链接到 backup.0 里的文件,我们可以通过比较文件的 inode(i 节点)数和目录的大小来达到此目的。总结Backupninja 不仅是一个经典的备份工具,它也是一个易于配置的实用程序。你可以通过编写你自己的控制脚本,用放在 /etc.backup.d 中的不同的配置文件来运行 backupninja 。甚至你还可以为 ninjahelper 编写助手程序,并将其包括在 ninjahelper 的主界面上。例如,假如你在 /usr/share/backupninja目录中创建了一个名为 xmodulo 的控制脚本,它将自动运行那些位于 /etc/backup.d 目录中以 .xmodulo 为后缀的每个文件。假如你决定添加你的 xmodulo 控制脚本到 ninjahelper 中, 你可以编写相应的助手程序,即 xmodulo.helper 。另外,假如你想 让 backupninja 运行其它的脚本,只需把它添加到 /etc/backup.d 目录中就可以了。

    2025-11-05 06:53

网友点评
精彩导读
热门资讯