Datahub上的读取文件运算符不会将消息传递给Docker容器中的python脚本

2020-09-03 07:32发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


嗨,

在WASB连接上对大文件(15 MB)使用读取文件运算符,将消息发送到终端输出。 但是,当使用与在docker中运行的python运算符相同的消息作为输入时(不确定在不使用docker运行时是否会有所不同),该消息永远不会到达python def on_input:函数。

任何帮助表示赞赏。

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


嗨,

在WASB连接上对大文件(15 MB)使用读取文件运算符,将消息发送到终端输出。 但是,当使用与在docker中运行的python运算符相同的消息作为输入时(不确定在不使用docker运行时是否会有所不同),该消息永远不会到达python def on_input:函数。

任何帮助表示赞赏。

付费偷看设置
发送
6条回答
Haoba3210
1楼-- · 2020-09-03 08:03

您可以发布图形json吗?

xfwsx85
2楼-- · 2020-09-03 07:51

嗨,

这是JSON:

它永远不会将"测试"发送到

也不会引发任何错误。

要读取的文件约为11,2 MB

 {
 "属性":{},
 " description":" test2",
 "流程":{
 " python3operator1":{
 " component":" com.sap.system.python3Operator",
 "元数据":{
 " label":" Python3运算符",
 " x":277.99999809265137,
 " y":40,
 "身高":82,
 "宽度":120,
 "可扩展":是的,
 " config":{
 " script":" \ ndef on_message(data):\ n \ n result = \" test \" \ n \ n api.send(\" res \",result)\ napi.set_port_callback(\" message \",  on_message)\ n \ n"
 },
 "其他进口":[
 {
 " name":"消息",
 " type":"消息"
 }
 ],
 "其他输出":[
 {
 " name":" out",
 " type":"字符串"
 },
 {
 " name":" image",
 " type":" blob"
 },
 {
 " name":" imageout",
 " type":" blob"
 },
 {
 " name":" res",
 " type":"字符串"
 }
 ]
 }
 },
 " readfile1":{
 " component":" com.sap.storage.read",
 "元数据":{
 " label":"读取文件",
 " x":17
 " y":49.49999976158142,
 "身高":80,
 "宽度":120,
 " config":{
 " service":" wasb",
 " wasbConnection":{
 " connectionProperties":{
 " accountKey":"",
 " accountName":" myaccount",
 " endpointSuffix":" core.windows.net",
 " protocol":" HTTPS",
 " rootPath":""
 },
 " configurationType":"配置管理器",
 " connectionID":" WASB"
 },
 " wasbContainerName":" evonik1",
 " path":"/cells/video/test_Trim.mp4",
 "递归":false
 }
 }
 },
 " terminal2":{
 " component":" com.sap.util.terminal",
 "元数据":{
 " label":" Terminal",
 " x":587.9999961853027,
 " y":19.49999976158142,
 "身高":80,
 "宽度":120,
 " ui":" dynpath",
 " config":{}
 }
 }
 },
 "组":[
 {
 " name":" group1",
 "节点":[
 " python3operator1"
 ],
 "元数据":{
 " description":"组"
 },
 "标签":{
 " tesseract":"",
 " python36":"",
 "龙卷风":" 5.0.2"
 }
 }
 ],
 "连接":[
 {
 "元数据":{
 "点":" 141,98.49999976158142 168.99999952316284,98.49999976158142 168.99999952316284,97.49999976158142 244.99999856948853,97.49999976158142 244.99999856948853,81 272.99999809265137,81"
 },
 " src":{
 " port":" outFile",
 " process":" readfile1"
 },
 " tgt":{
 " port":"消息",
 " process":" python3operator1"
 }
 },
 {
 "元数据":{
 "点":" 382.99999809265137,113 490,113 490,59.5 582.9999961853027,59.49999976158142"
 },
 " src":{
 " port":" res",
 " process":" python3operator1"
 },
 " tgt":{
 " port":" in1",
 " process":" terminal2"
 }
 }
 ],
 "进口":{},
 "输出":{}
 }

 
bbpeas
3楼-- · 2020-09-03 07:57

嗨,马库斯,

我们需要在这里改进一些错误处理。 抱歉。 在管道的日志中,您会发现一个错误"无法发布消息...已超过最大有效负载"。

目前,跨管道的不同容器进行数据交换的最大大小为10 MB。 那是一个限制。 将来我们可能会增加该限制,但目前是这样。

我将尝试解释一些情况:

  • 在运行管道时,这种简单的说法会导致Kubernetes上出现N个pod。
  • 如果您的管道很简单,那就是一个吊舱。 如果您在管道中使用组,则每个组都是一个Pod,其余的运算符(组之外的那些运算符)也都是一个Pod。
  • 如果您有一个具有多个M的组, 然后导致该组的M个广告连播。
  • 我们试图优化不同操作员之间的通信,以避免仅仅因为价格昂贵而就将数据复制到内存中。 假设您链接了三个运算符,我们将尝试确保这三个运算符都可以访问"相同"数据(我简化了一点……对不起)。
  • 现在让我们回顾一下我说的内容 关于团体。 不同的组是不同的豆荚。 并且不同的Pod可能在不同的群集节点上运行。 因此,当三个操作员各自具有自己的组时,我们需要以不同的方式进行通信。 我们要做的是:发送操作员将数据放入消息传递系统中(当前我们使用NATS),接收操作员从消息传递系统中提取数据。

上述不同Pod和介于两者之间的消息传递系统的机制也是优化数据处理,以不同方式缩放管道的不同部分等的好方法。

同时,这也意味着:尽量避免在不必要的组/对数据处理没有价值的组,因为(不考虑当前的限制)通过消息传递系统发送数据会对性能产生负面影响,而不是 正在做。 当您通过消息传递时,两个运营商之间的数据交换越大,获取的成本就越高。

这一切都与操作员的端口是"消息"类型还是其他类型无关。 所有端口类型的机制都相同。

我希望能有所帮助。 如果有理由将Python运算符放在一个组中,那么让我们检查一下原因或考虑将读取文件运算符与Python运算符放在同一个组中。

干杯
Thorsten

hongfeng1314
4楼-- · 2020-09-03 07:53

嗨Thorsten,

感谢您的解释。

python运算符与docker容器一起运行。 消息限制似乎合理,但适用于例如 我猜想,具有大量数据或视频分析的ML场景会留下问题。 (也许DH在这里不是正确的工具)因此有一个限制,一个可能会被强制存储/从本地文件系统中读取,而您在另一个答案中指出的其他限制也将被提供。

暮风yp
5楼-- · 2020-09-03 07:53
< p>您好Marcus,

请尝试以下操作:增加分组,不仅包括python运算符,还包括所有运算符。
一个pod可以运行多个容器,这是一个逻辑工作单元,可以 包括单个任务/活动所需的所有容器。 当您将所有运算符放在同一个组中时,它会尝试在同一吊舱中执行所有运算符。
您能试试吗?

问候,
Henrique。

SAP砖家
6楼-- · 2020-09-03 08:12

另一种可能性是在操作员/容器之间流式传输数据,而不是一次发送整个文件。 另一个容器可以累积数据,直到达到EOF为止,然后继续操作。

一周热门 更多>