我正在设置一个数据流作业,为此作业,工作人员需要访问私有的bitbucket存储库以安装库来处理数据。为了授予对数据流工作者的访问权限,我设置了一对SSH密钥(公共和私有)。我设法将私钥添加到我的数据流工作者上。当尝试通过git + ssh pip安装软件包时,出现错误Host key verification failed。
我试图.ssh/known_hosts在dataflow worker上查找文件,但是在普通VM上并不那么简单。
另外,我可以通过以下命令自行设置它,但效果不佳:
mkdir -p ~/.ssh
chmod 0700 ~/.ssh
ssh-keyscan bitbucket.org > ~/.ssh/known_hosts
Run Code Online (Sandbox Code Playgroud)
我仍然收到Host key verification failed错误。
建议的替代解决方案是运行此问题,ssh-keygen -R bitbucket.org但随后出现以下错误:
mkstemp: No such file or directory
对于Dataflow Python SDK,您需要使用来打包代码setup.py。工人启动时要执行的所有命令都用编写subprocess.Popen。命令列表如下:
CUSTOM_COMMANDS = [
# decrypt key encrypted key in repository via gcloud kms
['gcloud', '-v'],
['gcloud', 'kms', 'decrypt', '--location', 'global', '--keyring',
'bitbucketpackages', '--key', 'package', '--plaintext-file',
'bb_package_key_decrypted', '--ciphertext-file', 'bb_package_key'],
['chmod', '700', 'bb_package_key_decrypted'],
# …Run Code Online (Sandbox Code Playgroud) 我们目前正在使用 DataflowRunner 在 Apache Beam 上开发流式管道。我们正在从 Pub/Sub 读取消息并对它们进行一些处理,然后我们在滑动窗口中将它们窗口化(当前窗口大小为 3 秒,间隔也是 3 秒)。一旦窗口被触发,我们对窗口内的元素进行一些后处理。这个后处理步骤明显大于窗口大小,大约需要 15 秒。
管道的apache梁代码:
input = ( pipeline | beam.io.ReadFromPubSub(subscription=<subscription_path>)
| beam.Map(process_fn))
windows = input | beam.WindowInto(beam.window.SlidingWindows(3, 3),
trigger=AfterCount(30),
accumulation_mode = AccumulationModel.DISCARDING)
group = windows | beam.GroupByKey()
group | beam.Map(post_processing_fn)
Run Code Online (Sandbox Code Playgroud)
如您所知,Dataflow 会尝试对您的管道步骤执行一些优化。在我们的例子中,它从窗口开始(集群操作:1/处理 2/窗口+后处理)将所有内容融合在一起,这导致只有 1 个工作人员对所有窗口进行缓慢的顺序后处理。我们每 15 秒看到一次管道正在处理下一个窗口的日志。但是,我们希望让多个工作人员选择单独的窗口,而不是将工作量交给单个工作人员。
因此,我们正在寻找防止这种融合发生的方法,因此 Dataflow 将窗口与窗口的后处理分开。通过这种方式,我们希望 Dataflow 能够再次将多个工作人员分配给触发窗口的后处理。
到目前为止我们尝试过的:
最后两个动作确实创建了第三个集群操作(1/ processing 2/ windowing 3/ post-processing ),但我们注意到在窗口化之后仍然是同一个worker在执行所有操作。
是否有任何解决方案可以解决此问题陈述?
我们现在正在考虑的当前解决方法是构建另一个接收窗口的流管道,以便这些工作人员可以并行处理窗口,但它很麻烦。