[HADOOP] Java에서 HDFS로 작성하면 "minReplication 대신 0 개의 노드로만 복제 할 수 있습니다"
HADOOPJava에서 HDFS로 작성하면 "minReplication 대신 0 개의 노드로만 복제 할 수 있습니다"
CDH4 (Hadoop 2.0.0 실행) 용 Cloudera의 Hadoop Demo VM을 다운로드하여 시작했습니다. 내 Windows 7 컴퓨터 (VM이 실행중인 동일한 컴퓨터 / OS)에서 실행되는 Java 프로그램을 작성하려고합니다. 다음과 같은 샘플 프로그램이 있습니다.
public static void main(String[] args) {
try{
Configuration conf = new Configuration();
conf.addResource("config.xml");
FileSystem fs = FileSystem.get(conf);
FSDataOutputStream fdos=fs.create(new Path("/testing/file01.txt"), true);
fdos.writeBytes("Test text for the txt file");
fdos.flush();
fdos.close();
fs.close();
}catch(Exception e){
e.printStackTrace();
}
}
내 config.xml 파일은 fs.default.name = hdfs : // CDH4_IP : 8020에 정의 된 속성에만 있습니다.
그것을 실행할 때 다음과 같은 예외가 발생합니다.
org.apache.hadoop.ipc.RemoteException(java.io.IOException): File /testing/file01.txt could only be replicated to 0 nodes instead of minReplication (=1). There are 1 datanode(s) running and 1 node(s) are excluded in this operation.
at org.apache.hadoop.hdfs.server.blockmanagement.BlockManager.chooseTarget(BlockManager.java:1322)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getAdditionalBlock(FSNamesystem.java:2170)
at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.addBlock(NameNodeRpcServer.java:471)
at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.addBlock(ClientNamenodeProtocolServerSideTranslatorPB.java:297)
at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java:44080)
at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:453)
at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:898)
at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:1693)
at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:1689)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:396)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1332)
at org.apache.hadoop.ipc.Server$Handler.run(Server.java:1687)
at org.apache.hadoop.ipc.Client.call(Client.java:1160)
at org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:202)
at $Proxy9.addBlock(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 $Proxy9.addBlock(Unknown Source)
at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolTranslatorPB.addBlock(ClientNamenodeProtocolTranslatorPB.java:290)
at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.locateFollowingBlock(DFSOutputStream.java:1150)
at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.nextBlockOutputStream(DFSOutputStream.java:1003)
at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.run(DFSOutputStream.java:463)
나는 인터넷을 둘러 보았는데, 디스크 공간이 적을 때 이런 일이 일어나는 것 같지만, "hdfs dfsadmin -report"를 실행하면 나에게는 그렇지 않다.
Configured Capacity: 25197727744 (23.47 GB)
Present Capacity: 21771988992 (20.28 GB)
DFS Remaining: 21770715136 (20.28 GB)
DFS Used: 1273856 (1.21 MB)
DFS Used%: 0.01%
Under replicated blocks: 0
Blocks with corrupt replicas: 0
Missing blocks: 0
-------------------------------------------------
Datanodes available: 1 (1 total, 0 dead)
Live datanodes:
Name: 127.0.0.1:50010 (localhost.localdomain)
Hostname: localhost.localdomain
Decommission Status : Normal
Configured Capacity: 25197727744 (23.47 GB)
DFS Used: 1273856 (1.21 MB)
Non DFS Used: 3425738752 (3.19 GB)
DFS Remaining: 21770715136 (20.28 GB)
DFS Used%: 0.01%
DFS Remaining%: 86.4%
Last contact: Fri Jan 11 17:30:56 EST 201323 EST 2013
또한이 코드를 VM에서와 같이 실행해도됩니다. 문제가 무엇인지 또는 문제를 해결하는 방법을 모르겠습니다. 이것은 처음으로 hadoop을 사용하기 때문에 나는 아마 뭔가를 놓친 것 같다. 어떤 아이디어?
로그에서 볼 수있는 유일한 것은 클라이언트에서 얻는 것과 비슷한 예외입니다.
java.io.IOException: File /testing/file01.txt could only be replicated to 0 nodes instead of minReplication (=1). There are 1 datanode(s) running and 1 node(s) are excluded in this operation.
at org.apache.hadoop.hdfs.server.blockmanagement.BlockManager.chooseTarget(BlockManager.java:1322)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getAdditionalBlock(FSNamesystem.java:2170)
at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.addBlock(NameNodeRpcServer.java:471)
at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.addBlock(ClientNamenodeProtocolServerSideTranslatorPB.java:297)
at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java:44080)
at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:453)
at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:898)
at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:1693)
at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:1689)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:396)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1332)
at org.apache.hadoop.ipc.Server$Handler.run(Server.java:1687)
데이터 디렉토리 (/ var / lib / hadoop-hdfs / cache / hdfs / dfs / data)에 대한 사용 권한을 변경하려고 시도했지만 수정하지 않았습니다.
나는 HUE 웹 응용 프로그램을 통해 HDFS를 탐색 할 때 폴더 구조가 만들어지고 파일이 존재하지만 비어 있음을 확인합니다. 파일을 기본 사용자 디렉토리에 넣으려고했는데
FSDataOutputStream fdos=fs.create(new Path("testing/file04.txt"), true);
대신에
FSDataOutputStream fdos=fs.create(new Path("/testing/file04.txt"), true);
그러면 파일 경로가 "/user/dharris/testing/file04.txt"( 'dharris'는 내 Windows 사용자)가됩니다. 그러나 그것은 저에게 동일한 종류의 오류를주었습니다.
해결법
-
==============================
1.나는 똑같은 문제가있다. 내 경우, 문제의 핵심은 다음과 같은 오류 메시지였습니다. 1 개의 데이터 노드가 실행 중이고 1 개의 노드가이 작업에서 제외됩니다.
나는 똑같은 문제가있다. 내 경우, 문제의 핵심은 다음과 같은 오류 메시지였습니다. 1 개의 데이터 노드가 실행 중이고 1 개의 노드가이 작업에서 제외됩니다.
이는 hdfs-client가 50010 포트로 데이터 노드에 연결할 수 없음을 의미합니다. hdfs namenode에 연결하면 데이터 노드의 상태를 알 수 있습니다. 그러나 hdfs-client가 데이터 노드에 연결하지 못했습니다.
(hdfs에서 namenode는 파일 디렉토리와 데이터 노드를 관리합니다 .hdfs-client가 namnode에 연결하면 대상 파일 경로와 데이터가있는 데이터 노드의 주소를 찾을 수 있습니다. 그러면 hdfs-client는 datanode와 통신합니다. netstat을 사용하여 그 datanode uri를 확인하십시오. 왜냐하면 hdfs-client는 namenode에 의해 알려지는 주소를 사용하여 datanode와 통신하려고하기 때문입니다)
나는 그 문제를 다음과 같이 해결했다.
가난한 영어 실력으로 인해 유감입니다.
-
==============================
2.Linux VM으로 이동하여 호스트 이름과 IP 주소 (ifconfig cmd 사용)를 확인하십시오. 그런 다음 리눅스 VM에서 / etc / host 파일을 편집하십시오.
Linux VM으로 이동하여 호스트 이름과 IP 주소 (ifconfig cmd 사용)를 확인하십시오. 그런 다음 리눅스 VM에서 / etc / host 파일을 편집하십시오.
IP 주소 (SPACE) 호스트 이름
예 : 192.168.110.27 clouderavm
모든 hadoop 구성 파일을 다음과 같이 변경하십시오.
core-site.xml
hdfs-site.xml
mapred-site.xml
yarn-site.xml
localhost 또는 localhost.localdomain 또는 0.0.0.0을 호스트 이름으로 변경하십시오
cloudera 관리자를 다시 시작하십시오.
윈도우 머신에서 C : \ Windows \ System32 \ Drivers \ etc \ hosts 편집
끝에 한 줄 추가
vm 컴퓨터의 IP와 호스트 이름 (VM의 / etc / host 파일에서했던 것과 동일)
VMIPADRESS VMHOSTNAME
예 :
192.168.110.27 clouderavm
그런 다음 지금 확인해보세요. 튜브의 비디오를 따라 세부 구성 확인을 위해 작동해야합니다.
https://www.youtube.com/watch?v=fSGpYHjGIRY
-
==============================
3.hdfs-site.xml에 주어진 속성 추가
hdfs-site.xml에 주어진 속성 추가
<property> <name>dfs.replication</name> <value>1</value> </property>
이 파일을 프로그램에 추가하십시오.
conf.addResource("hdfs-site.xml");
멈추다
stop-all.sh
시작하다
start-all.sh
-
==============================
4.비슷한 문제가 발생하여 두 가지 정보가 도움이 될 수 있습니다.
비슷한 문제가 발생하여 두 가지 정보가 도움이 될 수 있습니다.
내가 변경 한 후 core-site.xml에서
<name>fs.defaultFS</name> <value>hdfs://localhost:9000</value>
에
<value>hdfs://host_name:9000</value>
더 이상 ssh 터널이 필요하지 않으며 원격으로 hdfs에 액세스 할 수 있습니다.
-
==============================
5.나는 똑같은 문제를 가지고있는 것에 대한 나의 수색에서 이처럼 많은 질문을 발견했기 때문에 나는 마침내 나를 위해 일한 것을 공유 할 것이라고 생각했다. Hortonworks에서이 포럼 게시물을 발견했습니다. https://community.hortonworks.com/questions/16837/cannot-copy-from-local-machine-to-vm-datanode-via.html
나는 똑같은 문제를 가지고있는 것에 대한 나의 수색에서 이처럼 많은 질문을 발견했기 때문에 나는 마침내 나를 위해 일한 것을 공유 할 것이라고 생각했다. Hortonworks에서이 포럼 게시물을 발견했습니다. https://community.hortonworks.com/questions/16837/cannot-copy-from-local-machine-to-vm-datanode-via.html
대답은 진정으로 새로운 Configuration ()을 호출하는 것이 무엇인지를 이해하고 필요한 매개 변수를 설정하는 것이 었습니다. 제 경우에는 정확히 그 게시물에서 언급 한 것입니다. 그래서 제 작업 코드는 이렇게 보입니다.
try { Configuration config = new Configuration(); config.set("dfs.client.use.datanode.hostname", "true"); Path pdFile = new Path("stgicp-" + pd); FileSystem dFS = FileSystem.get(new URI("hdfs://" + HadoopProperties.HIVE_HOST + ":" + HadoopProperties.HDFS_DEFAULT_PORT), config, HadoopProperties.HIVE_DEFAULT_USER); if (dFS.exists(pdFile)) { dFS.delete(pdFile, false); } FSDataOutputStream outStream = dFS.create(pdFile); for (String sjWLR : processWLR.get(pd)) { outStream.writeBytes(sjWLR); } outStream.flush(); outStream.close(); dFS.delete(pdFile, false); dFS.close(); } catch (IOException | URISyntaxException | InterruptedException e) { log.error("WLR file processing error: " + e.getMessage()); }
-
==============================
6.hadoop 구성에서 기본 복제는 3으로 설정됩니다. 한 번 확인하고 요구 사항에 따라 변경하십시오
hadoop 구성에서 기본 복제는 3으로 설정됩니다. 한 번 확인하고 요구 사항에 따라 변경하십시오
-
==============================
7.수동으로 데이터 (dfs / data) 폴더를 삭제하고 namenode를 포맷 할 수 있습니다. 그런 다음 hadoop을 시작할 수 있습니다.
수동으로 데이터 (dfs / data) 폴더를 삭제하고 namenode를 포맷 할 수 있습니다. 그런 다음 hadoop을 시작할 수 있습니다.
-
==============================
8.오류 메시지 복제 요인이 양호한 것 같습니다. 즉 1. 그것은 datanode 제대로 작동하거나 권한 문제가있는 것 같습니다. 사용 권한을 확인하고 사용자의 데이터 노드 상태를 확인하면 hadoop을 실행하려고합니다.
오류 메시지 복제 요인이 양호한 것 같습니다. 즉 1. 그것은 datanode 제대로 작동하거나 권한 문제가있는 것 같습니다. 사용 권한을 확인하고 사용자의 데이터 노드 상태를 확인하면 hadoop을 실행하려고합니다.
-
==============================
9.나는 비슷한 문제가 있었는데, 내 경우에 다음 폴더를 비웠다. $ {hadoop.tmp.dir} / nm-local-dir / usercache / {{hdfs_user}} / appcache /
나는 비슷한 문제가 있었는데, 내 경우에 다음 폴더를 비웠다. $ {hadoop.tmp.dir} / nm-local-dir / usercache / {{hdfs_user}} / appcache /
-
==============================
10.FS에 문제가있는 것으로 보입니다. cross-site.xml의 매개 변수가 읽으려는 파일과 일치하지 않습니다.
FS에 문제가있는 것으로 보입니다. cross-site.xml의 매개 변수가 읽으려는 파일과 일치하지 않습니다.
또는
경로에 공통된 불일치가 있습니다 (WINDOWS 참조가 있음을 알 수 있습니다).
cygwin 도구를 사용하여 경로를 설정하고 datanodes 및 temp 파일 위치가 놓여 있고 그 트릭을 충분히 수행해야하는 위치에 배치 할 수 있습니다 위치 : $ / bin / cygpath.exe
-
==============================
11.다음은 HDFS에서 파일을 만드는 방법입니다.
다음은 HDFS에서 파일을 만드는 방법입니다.
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; FileSystem hdfs = FileSystem.get(context.getConfiguration()); Path outFile=new Path("/path to store the output file"); String line1=null; if (!hdfs.exists(outFile)){ OutputStream out = hdfs.create(outFile); BufferedWriter br = new BufferedWriter(new OutputStreamWriter(out, "UTF-8")); br.write("whatever data"+"\n"); br.close(); hdfs.close(); } else{ String line2=null; BufferedReader br1 = new BufferedReader(new InputStreamReader(hdfs.open(outFile))); while((line2=br1.readLine())!=null){ line1=line1.concat(line2)+"\n"; } br1.close(); hdfs.delete(outFile, true); OutputStream out = hdfs.create(outFile); BufferedWriter br2 = new BufferedWriter(new OutputStreamWriter(out, "UTF-8")); br2.write(line1+"new data"+"\n"); br2.close(); hdfs.close(); }
from https://stackoverflow.com/questions/14288453/writing-to-hdfs-from-java-getting-could-only-be-replicated-to-0-nodes-instead by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] Hadoop은 시뮬레이션을 실행하는 데 적합합니까? (0) | 2019.07.07 |
---|---|
[HADOOP] 클래스 패스 내의 디폴트의 hadoop jar를 오버라이드 (override)합니다. (0) | 2019.07.07 |
[HADOOP] WebHDFS 대 HttpFS (0) | 2019.07.07 |
[HADOOP] hadoop fs -copyToLocal 명령을 사용하여 기존 파일을 덮어 쓰는 방법 (0) | 2019.07.07 |
[HADOOP] 지도 축소 : ChainMapper 및 ChainReducer (0) | 2019.07.07 |