Java中的Pig UDF:错误---错误1066:无法打开别名的迭代器

Posted

技术标签:

【中文标题】Java中的Pig UDF:错误---错误1066:无法打开别名的迭代器【英文标题】:Pig UDF in java :Error ---ERROR 1066: Unable to open iterator for alias 【发布时间】:2015-07-10 09:36:10 【问题描述】:

我是猪的新手 我的输入数据是

(消息,NIL,2015-07-01,22:58:53.66,E,machine.com.name,12,0xd6,String,String ,0,0.0,key=value&key=123456789&key=value&key=US&key=COMPANY&key=MESSAGE&key=123456789&key=String&key=String&Key=String&Key=String)

我已经编写了如下的 Java UDF 来解析输入数据的最后一个字符串

package com.pig.udf;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

import org.apache.pig.EvalFunc;
import org.apache.pig.data.Tuple;

public class PigUDF extends EvalFunc<Map> 


    @Override
    public Map<String, String> exec(Tuple input) throws IOException 
        // If tuple is null, has fewer than 3 values, or has an even number of
        // values
        if (input == null || input.size() < 3 || (input.size() % 2 == 0)) 
            throw new IOException("Incorrect number of values.");
        

        String source = (String) input.get(0);
        System.out.println("input Source"+source);
        String delim = (input.size() > 1) ? (String) input.get(1) : "&";
        int length = (input.size() > 2) ? (Integer) input.get(2) : 0;
        if (source == null || delim == null) 
            return null;
        

        String[] splits = source.split(delim, length);
        System.out.println("Splits"+ splits);
        ArrayList<String> arrayList = new ArrayList<String>(
                Arrays.asList(splits));
        Map<String, String> map = new HashMap<String, String>();
        for (String keyValue : arrayList) 
            int end = keyValue.indexOf('=');
            if (end != -1) 
                map.put(keyValue.substring(0, end), keyValue.substring(end + 1));
            

        
        System.out.println("map"+map);

        return map;

    

 

当我使用上面的 Java UDF 运行我的 Pig 脚本时,我遇到了错误

Pig Stack Trace
---------------
ERROR 1066: Unable to open iterator for alias C

org.apache.pig.impl.logicalLayer.FrontendException: ERROR 1066: Unable to open iterator for alias C
    at org.apache.pig.PigServer.openIterator(PigServer.java:892)
    at org.apache.pig.tools.grunt.GruntParser.processDump(GruntParser.java:774)
    at org.apache.pig.tools.pigscript.parser.PigScriptParser.parse(PigScriptParser.java:372)
    at org.apache.pig.tools.grunt.GruntParser.parseStopOnError(GruntParser.java:198)
    at org.apache.pig.tools.grunt.GruntParser.parseStopOnError(GruntParser.java:173)
    at org.apache.pig.tools.grunt.Grunt.exec(Grunt.java:84)
    at org.apache.pig.Main.run(Main.java:607)
    at org.apache.pig.Main.main(Main.java:156)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.hadoop.util.RunJar.run(RunJar.java:221)
    at org.apache.hadoop.util.RunJar.main(RunJar.java:136)
Caused by: java.io.IOException: Job terminated with anomalous status FAILED
    at org.apache.pig.PigServer.openIterator(PigServer.java:884)
    ... 13 more



    Application Log
    -------------------------------------------------------------------
    Application application_1436453941326_0020 failed 2 times due to AM Container for appattempt_1436453941326_0020_000002 exited with exitCode: 1
For more detailed output, check application tracking page:http://quickstart.cloudera:8088/proxy/application_1436453941326_0020/Then, click on links to logs of each attempt.
Diagnostics: Exception from container-launch.
Container id: container_1436453941326_0020_02_000001
Exit code: 1
Stack trace: ExitCodeException exitCode=1:
at org.apache.hadoop.util.Shell.runCommand(Shell.java:538)
at org.apache.hadoop.util.Shell.run(Shell.java:455)
at org.apache.hadoop.util.Shell$ShellCommandExecutor.execute(Shell.java:715)
at org.apache.hadoop.yarn.server.nodemanager.DefaultContainerExecutor.launchContainer(DefaultContainerExecutor.java:211)
at org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch.call(ContainerLaunch.java:302)
at org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch.call(ContainerLaunch.java:82)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
Container exited with a non-zero exit code 1
Failing this attempt. Failing the application. 

我的脚本在没有 Java UDF 函数的情况下运行良好,并且也给了我输出文件。 当我在我的 Pig 脚本中包含 Java UDF 时,就会出现问题。 我的 Java UDF 和运行 Pig 的机器之间没有 Java 版本不匹配 任何指针将不胜感激

猪脚本:

Register '/home/cloudera/Pig/PigUDF_1.7.jar';
Register '/home/cloudera/Pig/pig.jar';
 A= Load 'Logs_message.txt' using PigStorage(',') as (component:chararray,Nil:chararray,date:chararray,time:chararray,E:chararray,machine_address:chararray,number1:chararray,hex_number:chararray,cal_type:chararray,cal_name:chararray,number2:chararray,number3:chararray,data:chararray) 
 B = filter A by cal_name matches 'CHANGEDMESSAGE';
 C = foreach B generate cal_name ,com.pig.udf.PigUDF(data) as dataMap;
 dump C ;

【问题讨论】:

你如何称呼 udf?另外,查找更详细的日志。 你能把 Pig 脚本粘贴到你调用 UDF 的地方吗,我认为这是你 Pig 脚本中的问题 嗨@Fred,我在哪里可以找到更详细的日志? 对于在寻找ERROR 1066: Unable to open iterator for alias 时发现此帖子的人,这里是generic solution。 【参考方案1】:

我发现您的代码存在 3 个问题:

    您在第一行缺少一个分号。不确定它是如何运行的,假设这是将其复制到 *** 的错误 您将变量命名为“E”:这是一个保留变量。不确定这会产生什么影响,但为了安全起见,我不会这样做。有关保留 Pig 关键字的列表,请参阅 here (这可能是导致错误的原因)。你的验证毫无意义。看起来您创建了一个拆分函数,旨在采用 3 个或更少的参数(要拆分的字符串、分隔符和最大拆分大小)。然而,您正在验证输入是否有 3 个以上的参数。此外,您正在验证它是否具有偶数个参数。这似乎是对字符串 after 的验证,而不是之前。

应该是这样的:

if (input == null || input.size() == 0 || input.size() > 3) 
  throw new IOException("Incorrect number of values.");

//...
if(splits.length % 2 != 0)
  throw new IOException("Invalid key value pairs");

我建议在调试完程序之前不要在 Hadoop 上的云中运行程序,先让它们在本地运行。如果您使用 PigServer 类,您可以通过 eclipse 或其他 IDE 在您的开发机器上调试 UDF。

【讨论】:

以上是关于Java中的Pig UDF:错误---错误1066:无法打开别名的迭代器的主要内容,如果未能解决你的问题,请参考以下文章

迭代连接集后的 PIG 错误 1066。

错误 1066:无法在 Pig 中打开别名的迭代器,通用解决方案

Pig的Python UDF:数据类型转换错误

Pig UDF 中的 Java 依赖项

错误1066:无法在Pig,Generic解决方案中打开别名的迭代器

错误 1066:无法打开别名的迭代器 - PIG SCRIPT