-1

环境:hadoop 1.0.3、hbase 0.94.1、pig 0.11.1

我在 Java 程序中运行猪脚本,有时但并非总是出现以下错误。该程序所做的是从 hdfs 加载文件,进行一些转换并将其存储到 hbase 中。我的程序是多线程的。而且我已经使 PigServer 线程安全,并且在 hdfs 中创建了“/user/root”目录。这是程序的片段和我遇到的异常。请指教。

pigServer = PigFactory.getServer();
URL path = getClass().getClassLoader().getResource("cfg/concatall.py");  
LOG.info("CDNResolve2Hbase: reading concatall.py file from " + path.toString());
pigServer.getPigContext().getProperties().setProperty(PigContext.JOB_NAME,
"CDNResolve2Hbase");
pigServer.registerQuery("A = load '" + inputPath + "' using PigStorage('\t') as     (ip:chararray, do:chararray, cn:chararray, cdn:chararray, firsttime:chararray,     updatetime:chararray);");
pigServer.registerCode(path.toString(),"jython","myfunc");
pigServer.registerQuery("B = foreach A generate myfunc.concatall('"+ extractTimestamp (inputPath)+"',ip,do,cn), cdn, SUBSTRING(firsttime,0,8);");
outputTable = "hbase://" + outputTable;
ExecJob job = pigServer.store  ("B",outputTable,"org.apache.pig.backend.hadoop.hbase.HBaseStorage('d:cdn d:dtime')");

我的 PigFactory 有以下代码

private static ThreadLocal<PigServer> pigServer = new ThreadLocal<PigServer>();
public static synchronized PigServer getServer() {
if (pigServer.get() == null) {
try
{ printClassPath(); Properties prop = SystemUtils.getCfg(); pigServer.set(new PigServer    (ExecType.MAPREDUCE, prop)); return pigServer.get(); }
catch (Exception e)
{ LOG.error("error in starting PigServer:", e); return null; }
}
return pigServer.get();
}

org.apache.pig.impl.logicalLayer.FrontendException: ERROR 1000: 解析时出错。无法检查名称 hdfs://DC-001:9000/user/root 在 org.apache.pig.PigServer$Graph.parseQuery(PigServer.java:1607) 在 org.apache.pig.PigServer$Graph.registerQuery(PigServer .java:1546) 在 org.apache.pig.PigServer.registerQuery(PigServer.java:516) 在 org.apache.pig.PigServer.registerQuery(PigServer.java:529) 在 com.hugedata.cdnserver.datanalysis.CDNResolve2Hbase。在 com.hugedata.cdnserver.DatAnalysis.cdnResolve2Hbase(Unknown Source) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun 的 com.hugedata.cdnserver.task.HandleDomainNameLogTask.execute(Unknown Source) 处执行(Unknown Source)。反射.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 在 sun.reflect.DelegatingMethodAccessorImpl。

原因:解析失败:猪脚本解析失败:猪脚本验证失败:org.apache.pig.backend.datastorage.DataStorageException:错误6007:无法检查名称hdfs://DC-001:9000/user/根在 org.apache.pig.parser.QueryParserDriver.parse(QueryParserDriver.java:191) 在 org.apache.pig.PigServer$Graph.parseQuery(PigServer.java:1599)

... 15 更多原因:猪脚本无法验证:org.apache.pig.backend.datastorage.DataStorageException:错误 6007:无法在 org.apache 检查名称 hdfs://DC-001:9000/user/root .pig.parser.LogicalPlanBuilder.buildLoadOp(LogicalPlanBuilder.java:835) 在 org.apache.pig.parser.LogicalPlanGenerator.load_clause(LogicalPlanGenerator.java:3236) 在 org.apache.pig.parser.LogicalPlanGenerator.op_clause(LogicalPlanGenerator.java :1315) 在 org.apache.pig.parser.LogicalPlanGenerator.general_statement(LogicalPlanGenerator.java:799) 在 org.apache.pig.parser.LogicalPlanGenerator.statement(LogicalPlanGenerator.java:517) 在 org.apache.pig.parser。 LogicalPlanGenerator.query(LogicalPlanGenerator.java:392) 在 org.apache.pig.parser.QueryParserDriver.parse(QueryParserDriver.java:184)

... 16 更多原因:org.apache.pig.backend.datastorage.DataStorageException:错误 6007:无法在 org.apache.pig.backend.hadoop 检查名称 hdfs://DC-001:9000/user/root .datastorage.HDataStorage.isContainer(HDataStorage.java:207) 在 org.apache.pig.backend.hadoop.datastorage.HDataStorage.asElement(HDataStorage.java:128) 在 org.apache.pig.backend.hadoop.datastorage.HDataStorage .asElement(HDataStorage.java:138) 在 org.apache.pig.parser.QueryParserUtils.getCurrentDir(QueryParserUtils.java:91) 在 org.apache.pig.parser.LogicalPlanBuilder.buildLoadOp(LogicalPlanBuilder.java:827)

... 22 更多原因:java.io.IOException: Filesystem closed at org.apache.hadoop.hdfs.DFSClient.checkOpen(DFSClient.java:264) at org.apache.hadoop.hdfs.DFSClient.getFileInfo(DFSClient. java:873) 在 org.apache.hadoop.hdfs.DistributedFileSystem.getFileStatus(DistributedFileSystem.java:513) 在 org.apache.hadoop.fs.FileSystem.exists(FileSystem.java:768) 在 org.apache.pig.backend .hadoop.datastorage.HDataStorage.isContainer(HDataStorage.java:200)

... 26 更多

4

2 回答 2

0

您收到的错误表明您没有使用与服务器相同的 hadoop 客户端。你能检查一下本地安装的hadoop版本吗?

于 2014-04-17T08:15:46.920 回答
0

这看起来像一个HDFSClient问题。据我了解,问题是FileSystem对象被缓存。所以我的猜测是一个线程正在关闭它,而另一个线程仍在使用它。Caused by: java.io.IOException: Filesystem closed at

查看有关多个 FileSystem 实例的其他 SO 帖子。多个 Hadoop 文件系统实例

于 2013-10-14T17:51:29.863 回答