访问存储在 HDFS 分布式缓存中的 python 脚本中的文件

Posted

技术标签:

【中文标题】访问存储在 HDFS 分布式缓存中的 python 脚本中的文件【英文标题】:Access a file in a python script that is stored in HDFS distributed cache 【发布时间】:2015-06-26 16:24:54 【问题描述】:

我有一个 python 脚本需要访问和查询 MaxMind (.mmdb) 文件类型。我目前的想法是将 MaxMind 文件加载到 HDFS 的分布式缓存中,然后通过 Pig 将其传递给我的 Python 脚本。我目前的猪脚本是:

SET mapred.cache.file /path/filelocation/;
SET mapred.createsymlink YES;
SET mapred.cache.file hdfs://localserver:8020/pathtofile#filename;
REGISTER 'pythonscript' USING jython AS myudf;
logfile= LOAD 'filename' USING PigStorage(',') AS (x:int);
RESULT = FOREACH logfile GENERATE myudf.pyFunc(x,"how to pass in MaxMind file");

关于如何在将文件加载到 python 脚本内的分发缓存后访问该文件有什么想法吗?

谢谢

【问题讨论】:

【参考方案1】:

我认为你可以这样做:

set mapred.cache.files hdfs:///user/cody.stevens/testdat//list.txt#filename;
SET mapred.createsymlink YES; 
REGISTER 'my.py' USING jython AS myudf;
a = LOAD 'hdfs:///user/cody.stevens/pig.txt' as (x:chararray);
RESULT = FOREACH a GENERATE myudf.list_files(x,'filename');
STORE RESULT into '$OUTPUT';

这里是我在这个例子中使用的对应的 my.py

#/usr/bin/env python 
import os 

@outputSchema("ls:chararray")
def list_files(x,f):
    #ls =  os.listdir('.')
    fin = open(f,'rb')
    return [x,fin.readlines()]


if __name__ == '__main__':
    print "ok" 

差点忘了..我是这样称呼的。

pig -param OUTPUT=/user/cody.stevens/pigout -f dist.pig

它应该在您的本地目录中,因此 python 应该能够访问它。在该示例中,“文件名”是符号链接的名称,您必须相应地进行更新。在您的情况下,您将希望您的“文件名”成为您的 maxmind 文件,并且根据您在“a”中的值,您可能需要将其更改回“as (x:int)”。

祝你好运!

【讨论】:

我收到错误“在输入 '&' 处语法错误没有可行的替代方案”。我添加的行是: var = os.listdir("datafiles") 我在上面更新了更多细节。这适用于我的集群,您可能需要更改一些内容以使其在您的集群中运行(文件路径显然不会是 /user/cody.stevens 等) 这似乎有效。我对 Python 有疑问 - SyntaxError 'with' 将成为 Python 2.6 中的保留关键字。但我认为这是一个单独的问题。非常感谢。 是的......我也遇到了这个问题,因为我正在使用 open(f 'rb') as fn:为了简单起见和概念证明,我只是用老式方式打开文件fin = open(f,'rb') 我认为这是 jython 版本的抱怨。您可以尝试添加 from future import with_statement

以上是关于访问存储在 HDFS 分布式缓存中的 python 脚本中的文件的主要内容,如果未能解决你的问题,请参考以下文章

Hadoop DistributedCache分布式缓存的使用

hadoop hdfs学习

从 Pig UDF Java 类、Amazon EMR 中的分布式缓存访问文件

对象存储BOS发布全新工具,加速自建HDFS到云端的访问速度

HDFS简介及基本概念

HDFS的实现思想