如何在分布式环境中处理文件路径

mli*_*ner 3 distributed-computing filepath celery

我正在设置一个分布式芹菜环境来对PDF文件进行OCR.我有大约3M PDF和OCR是CPU绑定的,所以我们的想法是创建一个服务器集群来处理OCR.

在我写任务的时候,我有这样的事情:

@app.task
def do_ocr(pk, file_path):
    content = run_tesseract_command(file_path)
    item = Document.objects.get(pk=pk)
    item.content = ocr_content
    item.save()
Run Code Online (Sandbox Code Playgroud)

问题是我最好的方法是file_path在分布式环境中完成工作.人们通常如何处理这个问题?现在我的所有文件都只是存放在我们的一台服务器上的一个简单目录中.

xec*_*cgr 5

如果您在linux环境中,最简单的方法是使用sshfs /mnt在群集中的foreach节点中挂载远程文件系统.然后您可以将节点名称传递给do_ocr函数并工作,因为所有数据都是当前节点的本地数据

例如,您的集群有N个节点名为:node1,...,nodeN
让我们配置node1,foreach节点安装远程文件系统.这是node1的/ etc/fstab文件的示例

sshfs#user@node2:/var/your/app/pdfs    /mnt/node2 fuse    port=<port>,defaults,user,noauto,uid=1000,gid=1000        0       0
....
sshfs#user@nodeN:/var/your/app/pdfs    /mnt/nodeN fuse    port=<port>,defaults,user,noauto,uid=1000,gid=1000        0       0
Run Code Online (Sandbox Code Playgroud)

在当前节点(node1)中,创建一个名为当前服务器的符号链接,指向pdf的路径

ln -s /var/your/app/pdfs node1
Run Code Online (Sandbox Code Playgroud)

你的mnt文件夹应该包含远程的文件系统和符号链接

user@node1:/mnt$ ls -lsa
0 lrwxrwxrwx  1 user user      16 apr 12  2016 node1 -> /var/your/app/pdfs
0 lrwxrwxrwx  1 user user      16 apr 12  2016 node2
...
0 lrwxrwxrwx  1 user user      16 apr 12  2016 nodeN
Run Code Online (Sandbox Code Playgroud)

然后你的函数应该是这样的:

import os
MOUNT_POINT = '/mtn'
@app.task
def do_ocr(pk, node_name, file_path):
    content = run_tesseract_command(os.path.join(MOUNT_POINT,node_name,file_path))
    item = Document.objects.get(pk=pk)
    item.content = ocr_content
    item.save()
Run Code Online (Sandbox Code Playgroud)

它的工作方式就像当前机器中的所有文件一样,但是远程逻辑可以透明地为您工作