热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java调python管道堵塞_Java流式框架处理Python记录

因为部门里Storm使用的多了,即使要更换应该也会使用相近的框架,这里因为对Storm了解的多了,使用Storm作为java管理pytho

因为部门里Storm使用的多了,即使要更换应该也会使用相近的框架,这里因为对Storm了解的多了,使用Storm作为java管理python的框架。

Storm使用2.1.0版本

考虑了几个方法

1:Jython:对Python支持不完全,远远不如CPython的好用,如果是要做一些胶水语言的功能尚可,但是完全不能使用其他散发套件,且仅支持Python2。

2:自己起一个进程:不如Storm bolt管理的功能完整。

3. Storm多语言的支持,ShellBolt。

感谢Sugeesh Chandraweera的文章https://medium.com/@Sugeesh/connecting-python-bolt-for-apache-storm-topology-af6c2e3f2200,这边做了整理并修改。(国外的服务器,看不到不影响以下阅读)

这套框架管理的Python是进程而非线程,可以避开GIL的性能瓶颈,需注意Storm多语言的支持并没有成熟到开箱即用,开发者需要有修改源码的能力。

也可以使用我根据面向对象重构的代码

https://github.com/AlbertLiang1994/Storm-Modification/blob/master/Storm.py。

我加了一个套件,override,如果不想引用可以拿掉。

继承BasicBolt后就可以在process里实现业务逻辑了,也可以在initialize里初始化需要用到的对象,PythonBolt.py(命名习惯,实际上名字不一定要和类名一样,也不需要以Bolt结尾)。

import Storm

class PythonBolt(Storm.BasicBolt):

def initialize(self, conf, context):

self._conf = conf

self._context = context

def process(self, tuple):

word = tuple.values[0]

self.emit([word]) # return list object

PythonBolt().run()

然后在java里写一个对应的类。

public class PythonBolt extends ShellBolt implements IRichBolt {

public PythonBolt() {

super(System.getenv().get("PYTHON_EXECUTABLE"), System.getenv().get("STORM_BASE_DIR") + "/PythonBolt.py");

Map env = new HashMap();

env.put("PYTHONPATH", System.getenv().get("STORM_BASE_DIR"));

this.setEnv(env);

this.changeChildCWD(false);

}

}

PYTHON_EXECUTABLE是我在Storm目录下的conf/storm-env.sh里设定的环境变量,因为我不想更改服务器上的python版本,也不想使用python2,所以装了python3,并使用PYTHON_EXECUTABLE指向执行路径。

STORM_BASE_DIR是Storm的bin目录下storm启动脚本里设定的路径,获取后就不用在代码里写死成绝对路径。

changeChildCWD一定要设成false,否则会获取runtime路径。

如果要作为沙箱执行远端上传的代码,有以下注意事项:Storm的Python子进程使用匿名管道,也就是std in,std out,代码里如果有print会导致topology直接崩溃重启,在远端代码不可控的情况下,可以把sys.stdout指向别的对象,因为我们想提供user print内容展示的功能,把对象指向redis连接,然后在storm内部内获取展示。

如果要禁止user import os、sys 等有关操作系统的依赖,可以在执行远端上传代码前这样写:

sys.modules[mod] = None

指定的mod就无法import。

3. 如果要避免用户的method执行时间过长,超过Storm的心跳导致topology直接崩溃重启,可以使用pebble的ThreadPool,设定timeout。

4. 使用importlib import动态上传的python档,要记得del sys.modules[module_name],否则只要sys.modules有这个对象,多次上传并不会引发更新引用。

PS: 如果看完了相关源码,python调用java也可以游刃有余。



推荐阅读
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 标题: ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
author-avatar
安静的美男只
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有