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

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

背景

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

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

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

在这里插入图片描述

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

由于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
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/6670.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java进阶

注解 什么是注解 Java注解(Annotation)又称Java标注,是JDK5.0引入的一种注释机制。 Java语言中类、方法、变量、参数和包等都可以被标注。Java标注可以通过反射获取标注内容。在编译器生成类文件时,标注可以被嵌入到字节码中。Ja…

【Python实操】一行代码就可以自动画出这种艺术画?(详细教程)

文章目录前言一.准备阶段二、开始使用 Discoart1.引入库2.显示/保存/加载配置总结前言 DiscoArt 是一个很牛逼的开源模块,它能根据你给定的关键词自动绘画。 绘制过程是完全可见的,你可以在 jupyter 页面上看见这个绘制的过程: 一.准备阶段…

零拷贝内存 固定内存

一、总览 虚拟内存是一种计算机内存管理的技术,它让程序认为程序自身有一段完整的连续可用的内存(一个地址空间)。当程序运行时所占的内存空间大于物理空间容量,操作系统可以将暂时不用的数据放入到磁盘,用的时候再拿出…

Linux--高级IO--select--0326

目录 IO为什么低效? 1.快速理解五种IO模式 2.五种IO模型 3.非阻塞IO fcntl() 4.IO多路转接 select select fd_set类型 struct timeval*类型 5.Select的代码测试 5.1 问题一:一开始,我们只有一个listen套接字 5.2 问题二&#xff1…

《项目管理知识体系指南(PMBOK)》第7版之8大绩效域

项目绩效域被定义为一组对有效交付项目成果至关重要的相关活动。 《项目管理知识体系指南(PMBOK)》第7版将项目管理划分为干系人、团队、开发方法和生命周期、规划、项目工作、交付、测量、不确定性共8大绩效域。 一、干系人绩效域 解决与干系人相关的…

【对YOLOv8(ultralytics)打印测试结果的调整】(1)使得map值打印显示从0.551变为55.08 (2)打印出FPS

目录1. 最终打印效果2. 做两处更改2.1 修改map显示,在ultralytics-main/ultralytics/yolo/v8/detect/val.py中操作2.2 打印FPS,在ultralytics-main/ultralytics/yolo/engine/validator.py中操作❗❗❗ 兄弟姐妹们,如果看习惯了运行train.py时…

PMP应该如何备考?

PMP现在是新考纲,PMP新版大纲加入了 ACP 敏捷管理的内容,而且还不少,敏捷混合题型占到了 50%,前不久官方也发了通知 8月启用第七版《PMBOK》,大家都觉得考试难度提升了,我从新考纲考完下来,最开…

Moonbeam隆重推出您的个人开发小助手 — — Kapa.ai

Moonbeam为开发者提供内容详细的开发者文档和全天候的Discord支持。但假如:有人可以24/7查看Discord并在15秒之内就回复您的问题 — — 新推出的Kapa.ai机器人使这个假如成为现实。Kapa.ai是一款由ChatGPT支持的AI机器人,可以回答关于在Moonbeam上构建的…

【redis】单线程redis为什么这么快

本文以收录专栏 redis核心技术 前言 本专栏为了帮助大家更好的了解学习redis,同时也是自己记录学习redis的内容,包含了大部分的redis核心技术,分布式锁,主从复制等 目录 专题2-单线程redis为什么这么快 2.1redis只有单线程吗&a…

剑指offer-替换空格

替换空格一、解题思想二、代码的实现三、总结一、解题思想 题目:请实现一个函数 ,把字符串中的每个空格替换成”%20“。例如:输入”We are happy.“,则输出”We%20are%20happy.“。 看到这个题目,我第一想到的是&#…

博客1:YOLOv5车牌识别实战教程:引言与准备工作

摘要:本篇博客介绍了本教程的目标、适用人群、YOLOv5简介和车牌识别的意义和应用场景。为后续章节打下基础,帮助读者了解YOLOv5和车牌识别的相关背景知识。 正文: 车牌识别视频 引言 欢迎来到YOLOv5车牌识别实战教程!在这个教程中,我们将一步步教你如何使用YOLOv5进行车…

【Git Bash】项目开发过程中需要知道 git stash 的用法

目录1. git stash的应用场景2. 常用git stash命令2.1 git stash2.2 git stash save "message"2.3 git stash list2.4 git stash show2.5 git stash show -p2.6 git stash apply2.7 git stash pop2.8 git stash drop stash{num}2.9 git stash clear3. stash只会保存已…

简单记录一下软著申请流程

模板我就不放了,网上很多,随便下几个结合就行了 总体来说,我是2023.2.19号寄出,2023.4.6看到成功了,总共50天左右。 大家确实不需要网上买那种服务,我也是第一次申请,感觉还是挺简单的。只要按…

洛谷B2038奇偶ASCII值判断

洛谷B2038 题目描述 任意输入一个字符,判断其 ASCII 是否是奇数,若是,输出 YES,否则,输出 NO 。 例如,字符 A 的 ASCII 值是 65,则输出 YES,若输入字符 B(ASCII 值是 66)&#xff0…

从零开始学习Kotlin,带你快速掌握该编程语言

前言 Kotlin是一种跨平台的静态编程语言,它可以在JVM、Android、浏览器、iOS等多个平台上运行。Kotlin的语法简洁易懂,具有高度的可读性和可维护性,同时还具有Java所不具备的许多优点。 Kotlin是一种静态类型、面向对象、函数式编程语言&am…

iOS 项目嵌入Flutter 运行

一 创建Flutter 模块命令行flutter create --template module my_flutter创建完成后,该模块和普通的Flutter项目一直,可以通过Android Studio或VSCode打开、开发、运行;和之前项目不同的iOS和Android项目是一个隐藏文件,并且我们…

多模态 |COGMEN: COntextualized GNN based Multimodal Emotion recognitioN论文详解

论文:COGMEN: COntextualized GNN based Multimodal Emotion recognitioN COGMEN: 基于GNN的多模态情感识别技术 论文实现可参考另外一篇论文: 本文主要分为俩部分,一是对论文的简单概括,二是对论文的翻译。 论文总结 论文翻译…

【学习笔记】SpringAOP的用法全解

文章目录Spring的AOP一、 Spring对AOP的实现包括以下3种方式**什么是AspectJ?**二、使用Spring的AOP1、准备工作2、尝试写一个简单的AOP demo3、代码如下:spring.xml业务类切面类测试类4、复习切面表达式1)所有方法2)指定路径下某个包及其子…

开心档之C++ 运算符

目录 C 运算符 算术运算符 实例 实例 关系运算符 实例 实例 逻辑运算符 实例 实例 位运算符 实例 实例 赋值运算符 实例 实例 杂项运算符 C 中的运算符优先级 实例 实例 运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。C 内置了丰富的运算符&…

算法设计-二分

一、有序和单调 ​ 二分本质上是一种更加智能的搜索状态空间的方式,他需要状态空间的状态呈现一种“有序的一维数组”的形式,然后再进行搜索。所以一开始的排序是无法避免的。 ​ 因为二分的写法问题,所以应当怎样排序也是有一定讲究的&…