Подтвердить что ты не робот

Python читает файл как поток из HDFS

Вот моя проблема: у меня есть файл в HDFS, который потенциально может быть огромным (= недостаточно, чтобы соответствовать всем в памяти)

Мне бы хотелось сделать это, чтобы не кэшировать этот файл в памяти и обрабатывать его только по строке, как если бы я делал это с обычным файлом:

for line in open("myfile", "r"):
    # do some processing

Я смотрю, есть ли простой способ сделать это правильно без использования внешних библиотек. Возможно, я смогу работать с libpyhdfs или python-hdfs, но я хотел бы, если возможно, избегать введения новых новых зависимостей и непроверенных библиотек в системе, тем более, что обе эти функции, по-видимому, не поддерживаются и не указывают, что их нельзя использовать в производстве.

Я думал сделать это, используя стандартные инструменты командной строки "hadoop", используя модуль Python subprocess, но я не могу быть в состоянии делать то, что мне нужно, поскольку нет инструментов командной строки, которые могли бы сделать моя обработка, и я хотел бы выполнить функцию Python для каждой строки в потоковом режиме.

Есть ли способ применить функции Python в качестве правильных операндов труб, используя модуль подпроцесса? Или даже лучше, откройте его как файл в качестве генератора, чтобы я мог легко обрабатывать каждую строку?

cat = subprocess.Popen(["hadoop", "fs", "-cat", "/path/to/myfile"], stdout=subprocess.PIPE)

Если есть другой способ добиться того, что я описал выше, не используя внешнюю библиотеку, я также довольно открыт.

Спасибо за любую помощь!

4b9b3361

Ответ 1

Вы хотите xreadlines, он читает строки из файла, не загружая весь файл в память.

Edit

Теперь я вижу ваш вопрос, вам просто нужно получить трубку stdout из вашего объекта Popen:

cat = subprocess.Popen(["hadoop", "fs", "-cat", "/path/to/myfile"], stdout=subprocess.PIPE)
for line in cat.stdout:
    print line

Ответ 2

Если вы хотите избежать любых внешних зависимостей любой ценой, ответ Кита - это путь. Pydoop, с другой стороны, может сделать вашу жизнь намного проще:

import pydoop.hdfs as hdfs
with hdfs.open('/user/myuser/filename') as f:
    for line in f:
        do_something(line)

Что касается ваших проблем, Pydoop активно развивается и уже несколько лет используется в производстве CRS4, в основном для приложений вычислительной биологии.

Симона