2014-07-03 7 views
11

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?

+0

Chyba dla pojedynczego węzła klastra replikacja powinna wynosić zero, i jaka jest wartość dla dfs.support.append? –

+0

@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

+0

Yepp, replikacja musi być 1 –

Odpowiedz

10

Jak wspomniałem w edycji. Chociaż dfs.replication jest ustawiony na 1, fileStatus.block_replication jest ustawiony na 3.

Możliwym rozwiązaniem jest uruchomienie

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

co zmieni współczynnik replikacji dla każdego pliku rekurencyjnie w danym katalogu. Dokumentacja dla polecenia można znaleźć here.

Co należy teraz zrobić, to sprawdzić, dlaczego wartość w pliku hdfs-site.xml jest ignorowana. I jak wymusić wartość domyślną dla wartości 1.

EDIT

Okazuje się, że nieruchomość dfs.replication musi być ustawiony na przykład Configuration też inaczej to wnioskuje, że czynnik replikacji dla pliku jako domyślny, który wynosi 3, niezależnie od wartości ustawionej w hdfs-site.xml

Dodanie do kodu poniższej instrukcji rozwiąże to.

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

Aby wszystko było bardziej zrozumiałe na przyszłość: rozwiązaniem nowych plików jest dodanie conf.set ("dfs.replikacja", "1") do konfiguracji FileSystem.get. W przypadku istniejących plików konieczne jest również uruchomienie hadoop fs -setrep -w 1/user/hadoop/(-R jest ignorowane w aktualnych wersjach). – daphshez

1

również w obliczu tego samego wyjątku, jak początkowo pisał i rozwiązał problem dzięki komentarze (zestaw dfs.replication 1).

Ale nie rozumiem czegoś, co się stanie, jeśli mam replikację? W takim przypadku nie można dołączyć do pliku?

Doceniam twoją odpowiedź i jeśli miałeś z nią doświadczenie.

Dzięki

+2

Po przeprowadzeniu replikacji należy upewnić się, że współczynnik replikacji jest mniejszy lub równy liczbie datanodów. Powodem, dla którego pisanie po raz pierwszy powiedzie się i dołączanie kończy się niepowodzeniem, gdy współczynnik replikacji jest większy niż liczba datanodów, jest większe, aby dołączanie było bardziej ścisłe, aby zapewnić spójność, podczas gdy pisanie po raz pierwszy może tolerować niepełną replikację. p.s. Twój wkład byłby bardziej odpowiedni jako komentarz niż jako odpowiedź – MoustafaAAtta

Powiązane problemy