大数据平台开发——使用Java和Python调用Shell脚本

这篇具有很好参考价值的文章主要介绍了大数据平台开发——使用Java和Python调用Shell脚本。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

大数据平台开发——使用Java和Python调用Shell脚本

背景

在大数据平台开发中,经常会遇到需要调用Shell脚本的场景,倒不是说只能用Shell,毕竟大数据开发到头来一定是个语言无关的事情:

从Hive源码解读大数据开发为什么可以脱离SQL、Java、Scala:https://lizhiyong.blog.csdn.net/article/details/129742904

Shell能干的事情,Java和Python当然是一定可以干。但是可以不代表是最优的方式。

大数据平台开发——使用Java和Python调用Shell脚本

例如这种常见的情况,看起来就很紊乱。

由于Java微服务集群和大数据集群不太可能部署在相同的node上,也就导致了环境其实有很大的差异。

多数情况下,隔离的好处是利大于弊。比如大数据集群除了Flink,其它组件大多是用JDK1.8。而Flink为了使用ZGC这种更先进的GC,可能要用JDK11或者JDK17。Java后端微服务正在向JDK11平稳过渡,还有少一半JDK1.8,以及部分实在太过古老以至于无人敢动的JDK1.7应用。。。有的机器可能为了用上Free IPA、Ranger,有的机器可能要跑PySpark或者PyTorch,Python版本大概率也不同。大数据的集群一般还是多个。。。这种情况下,物理隔离后各种组件和应用大多都可以比较和谐融洽。

但是这么多机器,如果人员分工是按照大数据组/后端组这么分的,那就很容易出现甩锅的问题了。。。很可能大数据组的运维给机器配置的host和后端组的运维配置的host文件不一样。。。

还有一种情况就是Jar包的依赖冲突,例如我们的Tomcat和HBase还有Log4j出现过严重的冲突【没错,就是那个RSGroup硬件级资源隔离技术调研时遇到的】,光是排除依赖就折腾了有一两周。。。那么这种情况下,写能跑起来的Shell要比写能跑起来的Java容易很大,显然调用Shell就是个比排除依赖冲突再去调用API更好的主意。。。

有时候是成本问题。。。为了让Java后端服务器也可以调用命令去操作大数据集群而部署一套Cloudera Manager和Client显然是不划算的,一个node大概1w美刀/年的租金也不便宜,但是手动安装Client运维也大抵是不愿意这么做的。部署的服务变多后node宕掉了锅也不容易甩。。。

所以做大数据平台开发,也就躲不开调用Shell脚本,Shell脚本再去调用别的机器的Shell脚本这种事情了。。。

案例

Java

package com.zhiyong;

/**
 * @program: zhiyong_study
 * @description: 测试远程调用Shell
 * @author: zhiyong
 * @create: 2023-04-02 22:26
 **/
public class TestShellDemo {
    public static void main(String[] args) {
        TestShellDemo demo = new TestShellDemo();

        String cmd = "";
        cmd = args[0];
        int exeShResult = demo.exeSh(cmd);
        System.out.println("exeShResult = " + exeShResult);
        
    }

    private int exeSh(String shellCommand) {
        int Result = 0;
        Process pid = null;
        System.out.println("执行Shell:" + shellCommand);
        try {
            String[] cmd = {"bin/sh", "-c", shellCommand};

            pid = Runtime.getRuntime().exec(cmd);
            int exitValue = 0;
            System.out.println("pid的信息:" + pid.toString());
            if (null!=pid){
                System.out.println("等待shell执行完毕");
                pid.waitFor();
                System.out.println("shell执行完毕");
                exitValue = pid.exitValue();
                System.out.println("shell返回值:" + exitValue);
            }
            return exitValue;
        } catch (Exception e) {
            e.printStackTrace();
        }

        return -1;

    }
}

可以使用这种比较简单的方式。把脚本放在本地服务器即可调用。我们使用这种方式去调用HBase shell,将输出重定向到log文件后再将log文件scp回来解析,从而获取到结果,和调用HBase的API效果是一致的。在Java后端组排除依赖的一两周时间里,让租户们提前体验了新功能。

Python

#!/usr/bin/env python

import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname='192.168.88.100',port=22,username="root",password="123456")
stdin,stdout,stderr = ssh.exec_command('echo "sh /root/shell/xxx.sh" | ssh -Tq root@192.168.88.50')

print(stdout.read().decode(encoding="utf-8"))

ssh.close()

可以调用paramiko这个Python包,它可以远程调用别的机器的Shell。

这种方式我们最早用于集群任务迁移过程中的数据迁移及数据比对。由于领导阶级是Oracle数据库开发出身,对大数据一知半解,致使新老多套集群都叫nameservice1,这么搞无论如何:

USDP使用笔记(四)打通双集群HDFS实现跨nameservice访问:https://lizhiyong.blog.csdn.net/article/details/123436503

都是没办法打通跨nameservice域了。只能通过namenode的IP和8020端口来互相访问。但是HA模式下Active的master又是会变化的。。。

当然还有Kerberos认证的天坑一时半会儿也不太容易填。。。

于是我们的Shell脚本就可以放置在边缘节点,先从CDH5.16的老集群get需要的parquet文件到老集群某机器的本地,然后scp的方式传输到边缘节点,再从边缘节点scp给CDP7.1.5集群的某个节点,再执行put操作上传到指定的路径。虽然这是一种笨办法,但是在保障进度的特殊历史时期发挥了巨大作用。

总结

,然后scp的方式从边缘节点传输到边缘节点,再从边缘节点scp给CDP7.1.5集群的某个节点,再执行put操作上传到指定的路径。虽然这是一种笨办法,但是在保障进度的特殊历史时期发挥了巨大作用。

总结

大数据平台开发,由于跨服务器、多环境等问题,直接API调用的理想方式有时候是行不通的或者代价很大,这种情况就不一定要死磕API,可以考虑shell的方式去吊起别的集群的shell来执行所需的事项。。。

转载请注明出处:https://lizhiyong.blog.csdn.net/article/details/129919408
大数据平台开发——使用Java和Python调用Shell脚本文章来源地址https://www.toymoban.com/news/detail-406266.html

到了这里,关于大数据平台开发——使用Java和Python调用Shell脚本的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 在java中调用python脚本

    推荐使用第三种方法,因为只有第三种方法使用 Runtime.getRuntime() 才能执行含有第三方库(numpy,matlab,pandas等库)的python脚本。 1.首先在maven中添加依赖 2.使用Jpython中的PythonInterpreter执行Python语句 1.首先在maven中添加依赖(也是依赖Jpython包) 2.创建一个Python脚本 3.在java中执行p

    2024年02月15日
    浏览(35)
  • 在 SHELL 脚本中调用另一个 SHELL 脚本(报错: go: not found)

    在Linux平台上开发,经常会在console(控制台)上执行另外一个脚本文件,经常用的方法有:./my.sh 或 source my.sh 或 . my.sh;这三种方法有什么不同呢? 问题: A 脚本调 B脚本,如下:sudo ./build.sh 报错 B脚本中的 ./build.sh: 5: go: not found。 但是单独运行B脚本没有问题。 问题分析: 这

    2024年02月13日
    浏览(51)
  • Java:Java程序通过执行系统命令调用Python脚本

    本文实现功能:Java程序调用Python脚本 直接执行 参考视频 JAVA开发必会小技巧8——用代码调用系统指令

    2024年02月14日
    浏览(62)
  • DevOps系列文章之 java调用python脚本

    在java类中直接执行python语句 在java类中直接调用本地python脚本 使用Runtime.getRuntime()执行python脚本文件(推荐) 调用python脚本中的函数 官网地址 首页 | (jython.org) Jython项目提供了Java中的Python实现, 为Python提供了在JVM上运行的好处,并可以访问用Java编写的类。 当前版本(Jyt

    2024年02月14日
    浏览(45)
  • Java:使用java调用shell命令并获取返回结果的代码

           如下提供一段简单的使用java调用shell命令并获取返回结果的代码,其中有获取正常返回结果和异常返回结果的处理方法,在实际使用时可根据实际情况进行调整。 调用此方法时传入实际执行的shell命令即可:

    2024年02月12日
    浏览(34)
  • jenkins使用shell脚本自动部署java项目,nohup启动不成功

    百度搜索了很长时间,很多种说法,但是都没说太明白,整合了很长时间,测出来了解决方法,仅测试了自由风格项目和流水线项目,其他的选项未测试,jenkins版本2.400。   以下为正文: 执行脚本时,因为jenkins会在构建结束时,将shell运行期间产生的进程全部关闭,所以n

    2024年02月08日
    浏览(38)
  • 运维Shell脚本小试牛刀(七):在函数文脚本件中调用另外一个脚本文件中函数|函数递归调用|函数后台执行

    运维Shell脚本小试牛刀(一) 运维Shell脚本小试牛刀(二) 运维Shell脚本小试牛刀(三)::$(cd $(dirname $0); pwd)命令详解 运维Shell脚本小试牛刀(四): 多层嵌套if...elif...elif....else fi_蜗牛杨哥的博客-CSDN博客 Cenos7安装小火车程序动画 运维Shell脚本小试牛刀(五):until循环 运维Shell脚本小试牛刀

    2024年02月09日
    浏览(56)
  • 如何在Spark Scala/Java应用中调用Python脚本

    本文将介绍如何在 Spark scala 程序中调用 Python 脚本,Spark java程序调用的过程也大体相同 1.PythonRunner 对于运行与 JVM 上的程序(即Scala、Java程序),Spark 提供了 PythonRunner 类。只需要调用PythonRunner 的main方法,就可以在Scala或Java程序中调用Python脚本。在实现上,PythonRunner 基于

    2023年04月24日
    浏览(51)
  • shell命令或脚本 调用远程jenkins并运行job

            可以使用job中的token,shell命令调用执行。   shell调用jenkins进行构建时,报错: Error 403 No valid crumb was included in the request HTTP Status 403 – Forbidden The server understood the request but refuses to authorize it 解决办法: 在Jenkins启动命令中,添加crsf关闭配置。 添加启动参数:-Dh

    2024年02月14日
    浏览(43)
  • C#使用IronPython调用Python脚本实例

    本文 详细讲解在C#中调用Python脚本的 实例 。 首先 本文假设您已经安装好了Python环境和对应的库。 目录 一、IronPython简述

    2024年02月10日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包