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)
Если есть другой способ добиться того, что я описал выше, не используя внешнюю библиотеку, я также довольно открыт.
Спасибо за любую помощь!
Ответы
Ответ 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, в основном для приложений вычислительной биологии.
Симона
Ответ 3
За последние два года на Hadoop-Streaming было много движений. Это довольно быстро в соответствии с Cloudera: http://blog.cloudera.com/blog/2013/01/a-guide-to-python-frameworks-for-hadoop/ У меня был хороший успех.