2014-10-29 11 views
9
You use the hadoop fs –put command to write a 300 MB file using and HDFS block size of 64 MB. Just after this command has finished writing 200 MB of this file, what would another user see when trying to access this file? 

a.) They would see Hadoop throw an ConcurrentFileAccessException when they try to access this file. 
b.) They would see the current state of the file, up to the last bit written by the command. 
c.) They would see the current of the file through the last completed block. 
d.) They would see no content until the whole file written and closed. 

z tego co rozumiem o poleceniu hadoop fs -put odpowiedź jest D, jednak niektórzy twierdzą, że jest C.dostęp do pliku, który jest napisany

ktoś może zapewnić konstruktywne wyjaśnienie jednej z opcji?

Dzięki xx

Odpowiedz

4

Powodem plik nie będzie dostępny aż cały plik jest zapisywany i zamykany (opcja D), ponieważ w celu uzyskania dostępu do pliku, wniosek jest najpierw przesyłany do NameNode , aby uzyskać metadane dotyczące różnych bloków, które tworzą plik. Te metadane zostaną zapisane przez NameNode dopiero po otrzymaniu potwierdzenia, że ​​wszystkie bloki pliku zostały pomyślnie zapisane.

W związku z tym, mimo że bloki są dostępne, użytkownik nie może wyświetlić pliku, dopóki metadane nie zostaną zaktualizowane, co następuje po zapisaniu wszystkich bloków.

7

Natychmiast po utworzeniu pliku jest on widoczny w przestrzeni nazw systemu plików. Żadna treść zapisana w pliku nie może być widoczna, jednak:

Po zapisaniu danych bloku, pierwszy blok będzie widoczny dla nowych czytelników. Dotyczy to również kolejnych bloków: zawsze jest zapisywany bieżący blok, który nie jest widoczny dla innych czytników. (Z ostatecznego przewodnika Hadoop, model spójności).

Tak, pójdę z Opcji C

Również spojrzeć na to związane question.

+0

To prawda, że ​​bloki są dostępne na poziomie bloku, tzn. Można uzyskać dostęp do pojedynczego bloku, jeśli wiadomo, który blok należy szukać. Jeśli jednak metadane zawierające odwzorowanie między blokami nazw plików -> są niedostępne, dopóki nie zostaną zapisane wszystkie bloki, sam plik nie będzie widoczny dla użytkowników, ponieważ wszystkie żądania systemu plików są kierowane za pośrednictwem identyfikatora Namenode – Chaos

+3

Oto, co zaobserwowałem, podczas kopiowania dużego pliku do HDFS, nazwa pliku jest tworzona jako "[FILENAME] _COPYING_" i podczas gdy zapis wciąż trwa, jeśli spróbujesz wykonać operację odczytu w pliku ('[FILENAME] _COPYING'), możesz nadal czytać plik do ostatniego napisanego bloku. Przetestowałem to zachowanie w klastrze Hadoop 2.4. Tak więc, z tego zachowania, przypuszczam, że NameNode aktualizuje mapę bloków, gdy tylko blok zostanie przepłukany ('hflush()') i ACK jest odesłany. Po zakończeniu zapisu pliku plik w HDFS zostanie zmieniony na "[FILENAME]". – Ashrith

+0

@AshrithM Próbowałem wypisać plik 300 MB za pomocą polecenia -PUT i odczytać go za pomocą polecenia -CAT pod innym użytkownikiem i otrzymałem komunikat "Plik nie istnieje". Jakiego polecenia (metody) użyłeś do odczytu zapisywanego pliku? – Dennis

Powiązane problemy