Próbuję dołączyć do pliku na hdfs w klastrze jednego węzła. Próbowałem również w klastrze z 2 węzłami, ale otrzymałem te same wyjątki.Jak dołączyć do pliku hdfs w bardzo małym klastrze (3 lub mniej węzłów)
W HDFS miejscu, mam dfs.replication
wartość 1. Jeżeli ustawić dfs.client.block.write.replace-datanode-on-failure.policy
do DEFAULT
otrzymuję następujący wyjątek
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.
Gdybym zalecenia w komentarzu do configuration in hdfs-default.xml o niezwykle małych klastrów (3 węzły lub mniej) i ustawić dfs.client.block.write.replace-datanode-on-failure.policy
do NEVER
otrzymuję następujący wyjątek:
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.
Oto jak próbuję dołączyć:
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();
Czy jest coś, co robię źle w kodzie? Być może brakuje czegoś w konfiguracji? Każda pomoc zostanie doceniona!
EDIT
Mimo że dfs.replication
jest ustawiony na 1
, kiedy sprawdzić status pliku przez
FileStatus[] status = fs.listStatus(new Path("/user/hadoop"));
Uważam, że status[i].block_replication
jest ustawiony na 3
. Nie sądzę, że to problem, ponieważ po zmianie wartości dfs.replication
na 0
otrzymałem odpowiedni wyjątek. Więc najwyraźniej rzeczywiście jest to zgodne z wartością dfs.replication
, ale aby być po bezpiecznej stronie, czy istnieje sposób na zmianę wartości jednego pliku na wartość block_replication
?
Chyba dla pojedynczego węzła klastra replikacja powinna wynosić zero, i jaka jest wartość dla dfs.support.append? –
@sambhavSharma Próbowałem ustawić go na 0, ale również rzucił wyjątek, że nie ma żadnych aktywnych datanodów i dfs.support.append jest rzeczywiście ustawiony na true – MoustafaAAtta
Yepp, replikacja musi być 1 –