在CPython中如何逐行处理HDFS文件数据(不使用stdin)?
我想在一个Hadoop流处理任务中使用CPython,这个任务需要访问一个存放在Hadoop文件系统中的行式文件,里面有一些补充信息。这里的“补充”是指这个文件是除了通过标准输入(stdin)传递的信息之外的额外内容。这个补充文件比较大,我不能把它全部加载到内存中然后逐行解析。有没有什么特别优雅的方法(或者库)可以一行一行地处理这个文件呢?
谢谢,
SetJmp
2 个回答
1
你是在找这个吗?
http://pydoop.sourceforge.net/docs/api_docs/hdfs_api.html#module-pydoop.hdfs
with pydoop.hdfs.open( "supplementary", "r" ) as supplementary:
for line in supplementary:
# process line
3
查看一下这个关于流处理的文档,了解如何在Hadoop流处理任务中使用Hadoop分布式缓存。首先,你需要把文件上传到hdfs,然后告诉Hadoop在运行任务之前把这个文件复制到每个地方,接着它会在任务的工作目录里放一个快捷方式。这样,你就可以用Python的open()
来读取这个文件,比如用for line in f
这样的方式。
分布式缓存是最有效的文件传输方式,可以让任务利用这些文件作为资源。你不想直接从你的进程中打开hdfs的文件,因为每个任务都会试图通过网络来传输这个文件……而使用分布式缓存的话,即使在同一个节点上运行多个任务,也只会下载一份文件。
首先,在你运行任务时,把-files hdfs://NN:9000/user/sup.txt#sup.txt
加到命令行参数里。
然后:
for line in open('sup.txt'):
# do stuff