2010-08-09 12 views
8

Czy istnieje sposób zmiany poprawnego i istniejącego obiektu ścieżki Hadoop na użyteczny obiekt pliku Java. Czy jest to dobry sposób na zrobienie tego, czy też muszę go ubić, żeby się zakodować? Bardziej oczywiste sposoby nie działają, i wydaje się, że będzie to wspólny kawałek koduJak przekonwertować obiekt ścieżki Hadoop na obiekt pliku Java

void func(Path p) { 
    if (p.isAbsolute()) { 
    File f = new File(p.toURI()); 
    } 
} 

To nie działa, ponieważ Ścieżka :: Touri() zwraca „HDFS” identyfikator oraz plik Javy (Konstruktor URI) rozpoznaje tylko identyfikator "pliku".

Czy istnieje sposób na połączenie ścieżki i pliku?

**

OK, a konkretnie ograniczony przykład.

Path[] paths = DistributedCache.getLocalCacheFiles(job); 

DistributedCache ma dostarczać zlokalizowaną kopię pliku, ale zwraca ścieżkę. Zakładam, że DistributedCache tworzy lokalną kopię pliku, w którym znajdują się na tym samym dysku. Biorąc pod uwagę ten ograniczony przykład, gdzie mam nadzieję, że hdfs nie jest w równaniu, czy istnieje sposób, aby niezawodnie przekonwertować ścieżkę do pliku?

**

+0

Zakładając 'java.nio.file.Path' jest do zaakceptowania (zamiast' java.io.File'), [ta biblioteka] (ht tps: //github.com/damiencarol/jsr203-hadoop) wydaje się obiecujący. – dimo414

Odpowiedz

1

Nie jestem tego świadomy.

Według mojego zrozumienia, Path w Hadoop reprezentuje identyfikator węzła w ich rozproszonym systemie plików. Jest to inna abstrakcja od java.io.File, która reprezentuje węzeł lokalnego systemu plików. Jest mało prawdopodobne, aby model mógł mieć nawet reprezentację File, która zachowywałaby się równoważnie, ponieważ podstawowe modele są zasadniczo różne.

Stąd brak tłumaczenia. Zakładam, że twoje stwierdzenie, że obiekty File są "[bardziej] użyteczne", chcesz obiekt tej klasy, aby użyć istniejących metod bibliotecznych? Z powyższych powodów nie zadziała to zbyt dobrze. Jeśli jest to twoja własna biblioteka, możesz przepisać ją tak, aby działała czysto za pomocą ścieżek Hadoop, a następnie konwertować dowolne obiekty Pliki do ścieżki (ten kierunek działa tak, jak Ścieżki są ścisłym nadzbiorem plików). Jeśli jest to biblioteka stron trzecich, to masz pecha; autorzy tej metody nie wzięli pod uwagę skutków rozproszonego systemu plików i napisali tylko tę metodę do pracy na zwykłych starych plikach lokalnych.

+5

Ta odpowiedź jest błędna: Hadoop [ścieżka] (https://hadoop.apache.org/docs/current/api/org/apache/hadoop/fs/Path.html) nie jest identyfikatorem węzła w systemie plików Hadoop ale plik lub katalog w dowolnym systemie plików.Hadoop [FileSystem] (https://hadoop.apache.org/docs/current/api/org/apache/hadoop/fs/FileSystem.html) jest ogólny, co oznacza, że ​​może obsługiwać różne systemy plików, nie tylko HDFS. Jest to wyraźnie napisane w dokumentacji. Powodem, dla którego nie ma konwersji z 'Ścieżki' Hadoop do pliku 'Java', nie jest, ponieważ reprezentują dwie różne abstrakcje. – mariop

11

Niedawno miałem to samo pytanie i naprawdę istnieje sposób na pobranie pliku ze ścieżki, ale wymaga to tymczasowego pobrania pliku. Oczywiście, to nie będą odpowiednie dla wielu zadań, ale jeśli czas i przestrzeń nie są istotne dla ciebie, a ty po prostu trzeba coś do pracy z wykorzystaniem plików z Hadoop, zrobić coś jak następuje:

import java.io.File; 
import java.io.IOException; 
import org.apache.hadoop.conf.Configuration; 
import org.apache.hadoop.fs.FileSystem; 
import org.apache.hadoop.fs.Path; 

public final class PathToFileConverter { 
    public static File makeFileFromPath(Path some_path, Configuration conf) throws IOException { 
     FileSystem fs = FileSystem.get(some_path.toUri(), conf); 
     File temp_data_file = File.createTempFile(some_path.getName(), ""); 
     temp_data_file.deleteOnExit(); 
     fs.copyToLocalFile(some_path, new Path(temp_data_file.getAbsolutePath())); 
     return temp_data_file; 
    } 
} 
2

If masz LocalFileSystem

final LocalFileSystem localFileSystem = FileSystem.getLocal(configuration); 

można zdać Hadoop ścieżce obiektu do localFileSystem.pathToFile

final File localFile = localFileSystem.pathToFile(<your hadoop Path>); 
Powiązane problemy