2013-08-18 2 views
3

최근에 나는 hadoop을 사용하기 시작했습니다. 이제 hadoop-client-2.0.4-alpha.jar의 종속성과 함께 hadoop-client를 설치하지 않는 원격 호스트에서 hdfs에 액세스하려고합니다.원격으로 HDFS에 액세스하는 데 예외가 있습니다. 도와주세요 ~~

그것은 RPC 예외처럼 보이는
java.io.IOException: Failed on local exception: com.google.protobuf.InvalidProtocolBufferException: Message missing required fields: callId, status; Host Details : local host is: "webserver/127.0.0.1"; destination host is: "222.333.111.77":8020; 
     at org.apache.hadoop.net.NetUtils.wrapException(NetUtils.java:761) 
     at org.apache.hadoop.ipc.Client.call(Client.java:1239) 
     at org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:202) 
     at $Proxy25.getFileInfo(Unknown Source) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
     at java.lang.reflect.Method.invoke(Method.java:597) 
     at org.apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:164) 
     at org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:83) 
     at $Proxy25.getFileInfo(Unknown Source) 
     at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolTranslatorPB.getFileInfo(ClientNamenodeProtocolTranslatorPB.java:630) 
     at org.apache.hadoop.hdfs.DFSClient.getFileInfo(DFSClient.java:1559) 
     at org.apache.hadoop.hdfs.DistributedFileSystem.getFileStatus(DistributedFileSystem.java:811) 
     at org.apache.hadoop.fs.FileSystem.exists(FileSystem.java:1345) 
     at com.kongming.kmdata.service.ExportService.copyToLocalFileFromHdfs(ExportService.java:60) 
     at com.kongming.kmdata.service.KMReportManager.run(KMReportManager.java:105) 
     at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441) 
     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) 
     at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
     at java.lang.Thread.run(Thread.java:662) 
Caused by: com.google.protobuf.InvalidProtocolBufferException: Message missing required fields: callId, status 
     at com.google.protobuf.UninitializedMessageException.asInvalidProtocolBufferException(UninitializedMessageException.java:81) 
     at org.apache.hadoop.ipc.protobuf.RpcPayloadHeaderProtos$RpcResponseHeaderProto$Builder.buildParsed(RpcPayloadHeaderProtos.java:1094) 
     at org.apache.hadoop.ipc.protobuf.RpcPayloadHeaderProtos$RpcResponseHeaderProto$Builder.access$1300(RpcPayloadHeaderProtos.java:1028) 
     at org.apache.hadoop.ipc.protobuf.RpcPayloadHeaderProtos$RpcResponseHeaderProto.parseDelimitedFrom(RpcPayloadHeaderProtos.java:986) 
     at org.apache.hadoop.ipc.Client$Connection.receiveResponse(Client.java:946) 
     at org.apache.hadoop.ipc.Client$Connection.run(Client.java:844) 

, 어떻게 그것을 해결하기 위해 : 나는 HDFS에 액세스하려고 할 때

는하지만, 나는 다음과 같은 예외가있어?

package com.xxx.xxx.service; 

import org.apache.hadoop.conf.Configuration; 
import org.apache.hadoop.fs.FileSystem; 
import org.apache.hadoop.fs.Path; 
import org.apache.log4j.Logger; 

import com.xxx.xxx.fileSystem.IFilePath; 
import com.xxx.xxx.inject.GuiceDependency; 

public class ExportService { 
private static Logger log = Logger.getLogger(ExportService.class); 

private static Configuration configuration = new Configuration(); 

private static String dir = "./"; 

private static String hadoopConf = "hadoop-conf/"; 

static { 

    configuration.addResource(new Path(hadoopConf + "core-site.xml")); 
    configuration.addResource(new Path(hadoopConf + "hdfs-site.xml")); 
    configuration.addResource(new Path(hadoopConf + "mapred-site.xml")); 
    configuration.addResource(new Path(hadoopConf + "yarn-site.xml")); 



} 

public static boolean copyToLocalFileFromHdfs(String reportID) { 


    IFilePath filePath = GuiceDependency.getInstance(IFilePath.class); 

    String resultPath = filePath.getFinalResult(reportID) + "/part-r-00000"; 
    Path src = new Path(resultPath); 

    String exportPath = dir + reportID + ".csv"; 

    Path dst = new Path(exportPath); 
    System.out.println(configuration.get("fs.defaultFS")); 
    System.out.println("zxz copyToLocalFileFromHdfs scr: " 
      + src.toString() + " , dst: " + dst.toString()); 
    try { 

     System.out.println("zxz get fileSystem start "); 

     FileSystem fs = FileSystem.get(configuration); 
     System.out.println("zxz get fileSystem end " 
       + fs.getHomeDirectory().toString()); 
     System.out.println("zxz ~~~~~~~~~~~~~~~~~~~~~~~~~" 
       + fs.exists(src)); 
     ; 

     fs.copyToLocalFile(false, src, dst); 

     fs.copyToLocalFile(false, src, dst, true); 
    } catch (Exception e) { 

     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     log.error("copyFromHDFSFile error : ", e); 

     return false; 
    } 
    System.out.println("zxz end copyToLocalFileFromHdfs for report: " 
      + reportID); 
    return true; 
} 

가}

및 코어를 site.xml :

<?xml version="1.0" encoding="UTF-8"?> 

<!--Autogenerated by Cloudera CM on 2013-07-19T00:57:49.581Z--> 
<configuration> 
    <property> 
    <name>fs.defaultFS</name> 
    <value>hdfs://222.333.111.77:8020</value> 
    </property> 
    <property> 
    <name>fs.trash.interval</name> 
    <value>1</value> 
    </property> 
    <property> 
    <name>io.file.buffer.size</name> 
    <value>65536</value> 
    </property> 
    <property> 
    <name>hadoop.security.authentication</name> 
    <value>simple</value> 
    </property> 
    <property> 
    <name>hadoop.rpc.protection</name> 
    <value>authentication</value> 
    </property> 
    <property> 
    <name>hadoop.security.auth_to_local</name> 
    <value>DEFAULT</value> 
    </property> 
    <property> 
    <name>hadoop.native.lib</name> 
    <value>false</value> 
    <description>Should native hadoop libraries, if present, be used.</description> 
</property> 

</configuration> 

누구든지이 문제를 알고 여기 내 코드는? 도와 주셔서 대단히 감사합니다 ~

+0

나는 google protobuf 라이브러리를 사용하여 hdfs를 믿습니다. 그리고 클라이언트 코드가 잘못된 (호환되지 않는) 버전의 protobuf를 사용하고있는 것으로 보입니다. 이 방향으로 파고보십시오. 나는 비슷한 예외를 보았지만 관리자가 아니었다. –

+0

도움을 주셔서 감사합니다 ~이 문제를 확인했지만 제 의뢰인이 다른 protobuf를 사용하지 않았습니다. 단지 hadoop이 그것을 사용합니다. 어쩌면 호환되지 않는 버전이 아닐 수도 있습니다. 더 많은 정보를 제공해 주시겠습니까? 정말로 일반적인 질문이 아닌 것 같습니다. 다른 사람이이 문제를 안고있는 걸 본적이 없습니다. – zxz

+0

감사합니다 ~ 해결 된 문제! 원격 호스트에서 사용한 hadoop-client 버전은 2.0.4-alpha이지만 hadoop의 버전은 defaultFS에 cdh4.3.0입니다. 대단히 고마워요 – zxz

답변

6

나는 구글의 protobuf 라이브러리를 사용하여 belive hdfs. 그리고 클라이언트 코드가 잘못된 (호환되지 않는) 버전의 protobuf를 사용하고있는 것으로 보입니다.

+0

대단히 감사합니다! 문제가 해결되었습니다. 클라이언트는 cloudera로 설치하고, 코드는 아파치 hadoop을 사용했다. 답장을 보내 주셔서 죄송합니다. – zxz

+0

버전 차이는 어떻게 결정 되었습니까? – 64k

관련 문제