2014-07-03 21 views
11

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?

+0

Credo che per un singolo cluster nodo replica dovrebbe essere pari a zero, e qual è il valore per dfs.support.append? –

+0

@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

+0

Yepp, la replica deve essere 1 –

risposta

10

Come ho menzionato nella modifica. Anche se il dfs.replication è impostato su 1, fileStatus.block_replication è impostato su 3.

Una soluzione possibile è quella di eseguire

hadoop fs -setrep -w 1 -R /user/hadoop/ 

che cambierà il fattore di replica per ogni file ricorsivamente nella directory data. La documentazione per il comando può essere trovata here.

Quello che si deve fare ora è cercare perché il valore in hdfs-site.xml è ignorato. E come forzare il valore 1 come predefinito.

EDIT

Si scopre che la proprietà dfs.replication deve essere impostata nel caso Configuration troppo, altrimenti si chiede che il fattore di replica per il file sia il default che è 3 indipendentemente dal valore impostato in hdfs-site.xml

Aggiungendo al codice la seguente dichiarazione lo risolverà.

conf.set("dfs.replication", "1"); 
+0

Per rendere le cose più chiare per riferimento futuro: la soluzione per i nuovi file è aggiungere conf.set ("dfs.replication", "1") alla configurazione di FileSystem.get. Per i file esistenti, è anche necessario eseguire hadoop fs -setrep -w 1/user/hadoop/(-R è ignorato nelle versioni correnti). – daphshez

1

ho anche affrontato la stessa eccezione come inizialmente postato e ho risolto il problema grazie ai vostri commenti (set dfs.replication a 1).

Ma non capisco qualcosa, cosa succede se ho la replica? In tal caso non è possibile aggiungere un file?

Apprezzerò la vostra risposta e se avete avuto un'esperienza con esso.

Grazie

+2

Quando si ha la replica, è necessario assicurarsi che il fattore di replica sia inferiore o uguale al numero dei propri datanode. Il motivo per cui la scrittura per la prima volta ha esito positivo e l'aggiunta non riesce quando il fattore di replica è maggiore del numero di datanode è che l'aggiunta è più rigida per garantire la coerenza mentre la scrittura per la prima volta può tollerare la sottorappresentazione. p.s. il tuo contributo sarebbe stato più adatto come commento che come risposta – MoustafaAAtta

Problemi correlati