【问题标题】:Python: how to know if file is finished uploading into hdfsPython:如何知道文件是否已完成上传到 hdfs
【发布时间】:2022-01-26 05:21:48
【问题描述】:

所以我有 2 个脚本: 用于将文件上传到 hdfs 的 script1 script2 将访问该文件夹并每隔 n 秒读取一次文件

我的上传脚本是这样的

from hdfs import InsecureClient
from requests import Session
from requests.auth import HTTPBasicAuth

session = Session()
session.auth = HTTPBasicAuth('hadoop', 'password')
client_hdfs = InsecureClient('http://hadoop.domain.com:50070', user='hadoop', session=session)
client_hdfs.upload(hdfsPath,filePath,overwrite=True)

当我读到https://martin.atlassian.net/wiki/spaces/lestermartin/blog/2019/03/21/1172373509/are+partially-written+hdfs+files+accessible+not+exactly+but+much+more+yes+than+I+previously+thought 或在stackoverflow中Accessing a file that is being written

似乎当我使用 hadoop dfs -put 命令(或 -copyFromLocal 或 -cp)上传时,如果文件尚未完成,它将创建 [文件名]。正在复制。但在 python 脚本中,它似乎会创建具有相同名称的文件,但大小会随着时间的推移而增加,直到它完成(我们可以在它完成之前下载它并得到损坏的文件)。

我想问有没有办法使用python上传文件,以便我们知道文件是否已完成上传。

实际上我还有另一个解决方法可以将它们上传到临时文件夹并在完成后将它们移动到正确的文件夹(我仍在尝试这样做),但如果有其他想法将不胜感激

【问题讨论】:

    标签: python hadoop file-upload hdfs


    【解决方案1】:

    你可以使用和hDFS一样的策略

    1. 创建[文件名].COPYING
    2. 上传数据时重命名为 [文件名]

    我觉得您对临时文件提出了相同的建议,而不是更改名称,但这相当于相同的想法。只是为了让您知道重命名文件非常便宜且快速,所以无论如何这是一个好策略。

    【讨论】:

    • 不存在同样的问题吗?您怎么知道复制文件已完全上传?我觉得您需要在重命名之前验证内容长度
    • 我确实做了两个可能不正确的假设。 1)这些步骤可以按顺序运行。 (单线程)[上传然后重命名]。 2)问题是程序外部的,而不是python内部的。在程序的外部,当“.COPYING”被删除时,你知道你是好的。重命名不需要重写文件,这就是 HDFS 使用这种策略的原因。
    • 谢谢,我想我喜欢你的建议。这样,我不需要更改读取文件的其他程序(它总是会忽略 COPYING 文件,因为默认情况下 hdfs 命令使用它)。我发现只有 python 使用 hdfscli lib 的那个,我不知道另一种编程语言 lib,它可能有类似的问题,只要我保持一切工作与 hdfs 命令应该正常的一样
    • 如果你启用了它,你可以考虑使用 webHDFS。我不记得文件大小的限制。 hadoop.apache.org/docs/r1.0.4/webhdfs.html
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-01
    • 2020-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-05
    相关资源
    最近更新 更多