Sto tentando di aggiungere un file su un hdf su un cluster a nodo singolo. Ho anche provato un cluster a 2 nodi, ma ho le stesse eccezioni.Come aggiungere a un file hdfs su un cluster estremamente piccolo (3 nodi o meno)
In HDFS loco, devo dfs.replication
set a 1. Se ho impostato dfs.client.block.write.replace-datanode-on-failure.policy
-DEFAULT
ottengo la seguente eccezione
java.io.IOException: Failed to replace a bad datanode on the existing pipeline due to no more good datanodes being available to try. (Nodes: current=[10.10.37.16:50010], original=[10.10.37.16:50010]). The current failed datanode replacement policy is DEFAULT, and a client may configure this via 'dfs.client.block.write.replace-datanode-on-failure.policy' in its configuration.
Se seguo la raccomandazione nel commento per la configuration in hdfs-default.xml per estremamente piccoli cluster (3 nodi o meno) e impostare dfs.client.block.write.replace-datanode-on-failure.policy
-NEVER
ottengo la seguente eccezione:
org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.hdfs.server.namenode.SafeModeException): Cannot append to file/user/hadoop/test. Name node is in safe mode.
The reported blocks 1277 has reached the threshold 1.0000 of total blocks 1277. The number of live datanodes 1 has reached the minimum number 0. In safe mode extension. Safe mode will be turned off automatically in 3 seconds.
Ecco come io cerco di aggiungere:
012.Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://MY-MACHINE:8020/user/hadoop");
conf.set("hadoop.job.ugi", "hadoop");
FileSystem fs = FileSystem.get(conf);
OutputStream out = fs.append(new Path("/user/hadoop/test"));
PrintWriter writer = new PrintWriter(out);
writer.print("hello world");
writer.close();
C'è qualcosa che sto facendo male nel codice? forse, c'è qualcosa che manca nella configurazione? Qualsiasi aiuto sarà apprezzato!
EDIT
Anche se questo dfs.replication
è impostato su 1
, quando posso controllare lo stato del file tramite
FileStatus[] status = fs.listStatus(new Path("/user/hadoop"));
trovo che status[i].block_replication
è impostato su 3
. Non penso che questo sia il problema, perché quando ho cambiato il valore di dfs.replication
a 0
ho ottenuto un'eccezione rilevante. Quindi apparentemente obbedisce al valore di dfs.replication
ma, per sicurezza, esiste un modo per modificare il valore block_replication
per file?
Credo che per un singolo cluster nodo replica dovrebbe essere pari a zero, e qual è il valore per dfs.support.append? –
@sambhavSharma Ho provato a impostarlo su 0 ma ha anche emesso un'eccezione sul fatto che non ci sono datanode live e dfs.support.append è impostato su true – MoustafaAAtta
Yepp, la replica deve essere 1 –