谈谈 数据挖掘 的程序 提交打包 调试问题

我们的hadoop 集群 白手起家的时候,基本上是相当于裸奔着,外网开着,只要你想 登录集群 ,通过外网 用户密码就可以操作集群了,相当危险,后来我们又分两次重新搭了hadoop集群,一次比一次严格,最后这次 我们的hadoop 集群只有内网,暴露的端口也是有限的,并且只能通过 pem文件登录。当然 这种只有阿里云内网的,想直接调试基本是不可能的,但是 可以通过 nginx 搭配 rpc 远程调用,但是这个还是有点 繁琐,我现在重点不在这里

最主要是当时 可以在本地直接调试内网外的 远端 hadoop集群,我们知道 只要可以debug 的程序,其实 是可以非常节省 开发时间的,如果不能调试的程序,不然你遇到意外输出 只能通过 print 或者 logger 讲 你期待的变量 结果 打印到console 中。

hadoop 其实还是 一个系统,如果你连接不上他,搞一些边缘数据挖掘,还是非常愁人的, 程序在 debug 时如果在连接不到 远端集群时,一个折中的方法就是在自己本地搭建一个hadoop单机版的,尝试debug,好像如果hadoop 没有运行,只要在程序运行的参数指定 hadoop的配置文件目录和 hadoop 运行lib库 也是可以做到的

我们这集群 中间虽然没有跳板机,但是还是有一个带外网的任务提交机器 A 一个 不带外网的任务数据中转机器 B ,我们的 mapReduce 程序提交 现在是这样的, 在本地打jar包 一般是scala ,并包含所有依赖的第三方 jar包,然后scp 到A 机器上 ,A 机器的外网带宽只有1m ,所以 一个90m的jar包, 以128kb/s的实际速度上传,需要十几分钟,挺浪费时间,然后再把jar 包从 A 机器 scp 到 B 机器 ,内网很快,两三秒搞定,然后在B 机器 hadoop jar scala.jar main class input output。 所以大家可以看到 假如你想debug 四次 ,一个小时就没有了,这还不算你 修改代码的功夫,一天调试40次就过去了

所以不能这样,我们 看到假如把 从本地到A 机器的传输时间剩下来,那么就会有质的提高,怎么做到呢,一开始我想 要不把依赖的第三方jar包 先上传到A 机器上的某个文件目录中,到时候 运行的时候指定第三方jar包路径,这个其实也是可以的。但是吧有点繁琐,需要找更简单的,我们是在本地打包的,没有打包的程序 代码其实只有几百kb 而已,那我们可以把 打包放在 A 机器上这样 就节省了外网带宽,本地到A 就急速加快了, 要想把打包放在 A 机器上 ,第一 scala 要支持 fat jar ,我使用的sbt 打包工具 ,单纯的 sbt package 是 不会把第三方jar包达到 程序jar 中,不过 sbt 有个插件 sbt assembly,这个非常完美实现了,这个插件安装还是蛮折腾的,也赶巧了,新版的IDEA,刚刚支持 sbt 1.0.X 系列的版本。 其他的 0.13.X 版本我一直没有整明白,另外需要在 A 机器上 安装 scala 2.12.1 sbt 1.0.4 ,在本地 写好代码后,剔除无关的内容,按程序结构对代码 打一个zip包,然后上传到 A 机器上,10秒ok ,然后在A 机器上解压 ,然后使用 sbt assembly 开始打fat jar ,打完包的在A 上运行,或者内网传到B 机器上,这样妥协后的调试,非常完美。单次节省 十分钟,还是非常可观的。

另外不得不提 emacs ,在A 机器上安装 emacs ,在本地可以直接调试A 机器上的emacs 也是非常方便,这样在A 机器上直接修改部分代码,节省从本地上传代码到 A 机器上的时间,如果省去打包时间就更妙了,我们只在正式提交任务时做打包,打包单次消耗时间是30s 到两分钟。

另外 如果我们可以打通 本地机器通过A 机器到集群的RPC 反向代理,那么就本地调试就可以了。

其实吧,种种不方便的【逆境】,反而倒逼你使出浑身解数,去寻找更好的方法来解决它,凡是人为设置的障碍,只要你有脑子,想办法,基本上都是可以逾越的

看朋友圈 多了,其实到底谁才是生活在社会的底层,真不好说,十年河东 十年河西,十年前错过 买房 ,三年前错过 买比特币 以太坊的
两年前躲过股灾的,哎 人类通向财富自由的道路 布满荆棘,向下的漏斗一直敞开的,向上爬的枝干一直人山人海,能一直笑着的少之寥寥,哭的最少带进棺材的 莫非就是人生赢家

你可能感兴趣的:(谈谈 数据挖掘 的程序 提交打包 调试问题)