在Pig StoreFunc中访问分布式缓存

时间:2014-08-28 18:08:26

标签: hadoop apache-pig distributed-cache

我已经查看过这个主题的所有其他主题,但仍然没有找到答案......

简单地说,我想从Pig StoreFunc访问hadoop分布式缓存,而不是直接从UDF中访问。

相关的PIG代码行:

DEFINE CustomStorage KeyValStorage('param1','param2','param3');
...
STORE BLAH INTO /path/ using CustomStorage();

相关Java代码:

public class KeyValStorage<M extends Message> extends BaseStoreFunc /* ElephantBird Storage which inherits from StoreFunc */ {

...
public KeyValStorage(String param1, String param2, String param3) {
    ...
        try {
            InputStream is = new FileInputStream(configName);
            try {
                prop.load(is);
            } catch (IOException e) {
                System.out.println("PROPERTY LOADING FAILED");
                e.printStackTrace();
            }
        } catch (FileNotFoundException e) {
            System.out.println("FILE NOT FOUND");
            e.printStackTrace();
        }
   }
...
}

configName是我应该能够从分布式缓存中读取的LOCAL文件的名称,但是,我收到了FileNotFoundException。当我直接在PIG UDF中使用EXACT相同的代码时,会找到该文件,因此我知道该文件是通过分布式缓存发送的。我设置了适当的参数以确保发生这种情况:

<property><name>mapred.cache.files</name><value>/path/to/file/file.properties#configName</value></property>

我有什么想法可以解决这个问题吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

StroreFunc的构造函数在前端后端都被调用。当从前端调用它时(在作业启动之前),您将获得FileNotFoundException,因为此时来自分布式缓存的文件尚未复制到节点&#39;本地磁盘。
您可以检查您是否在后端(当作业正在执行时)并仅在这种情况下加载文件,例如:

DEFINE CustomStorage KeyValStorage('param1','param2','param3');
set mapreduce.job.cache.files hdfs://host/user/cache/file.txt#config
...
STORE BLAH INTO /path/ using CustomStorage();

public KeyValStorage(String param1, String param2, String param3) {
  ...
  try {
    if (!UDFContext.getUDFContext().isFrontend()) {
      InputStream is = new FileInputStream("./config");
      BufferedReader br = new BufferedReader(new InputStreamReader(is)); 
      ...
  ...
}