ver ruta lista contenido común comandos borrar archivo hadoop hdfs gfs

hadoop - lista - ruta hdfs



¿Es posible adjuntar al archivo HDFS de varios clientes en paralelo? (3)

Básicamente toda la pregunta está en el título. Me pregunto si es posible adjuntar a un archivo ubicado en HDFS desde varias computadoras simultáneamente. Algo así como almacenar un flujo de eventos constantemente producidos por múltiples procesos. El orden no es importante.

Recuerdo haber escuchado en una de las presentaciones de tecnología de Google que GFS admite dicha funcionalidad de anexos, pero probar algunas pruebas limitadas con HDFS (ya sea con apéndice de archivo regular () o con SequenceFile) no parece funcionar.

Gracias,


Google debería tener un sistema de archivos un poco más sofisticado que admita el acceso aleatorio mucho mejor que HDFS. Utilizan BigTable con mayor frecuencia y amplitud, lo que requiere una modificación más rápida de los bloques y lecturas / escrituras simultáneas de un bloque. Pero en realidad puedes implementar algo similar. Lo hice recientemente con la escritura de un webcrawler.

Básicamente no puedes paralizar IO. Así que tienes que usar una cola y adjuntar secuencialmente a un archivo de secuencia.

private final ConcurrentLinkedQueue<FetchResult> queue = new ConcurrentLinkedQueue<FetchResult>(); private final Configuration conf = new Configuration(); private SequenceFile.Writer writer = null; public boolean running = true; public FetchResultPersister() throws IOException { FileSystem fs = FileSystem.get(conf); Path out = new Path("files/crawl/result.seq"); fs.delete(out, true); writer = new SequenceFile.Writer(fs, conf, out, Text.class, Text.class); } public final void add(final FetchResult result) { queue.offer(result); } @Override public final void run() { long retrieved = 0L; while (running) { final FetchResult poll = queue.poll(); if (poll != null) { try { writer.append(new Text(poll.url), asText(poll.outlinks)); retrieved++; if (retrieved % 100 == 0) { System.out .println("Retrieved " + retrieved + " sites!"); } } catch (IOException e) { e.printStackTrace(); } } else { try { Thread.sleep(10000); } catch (InterruptedException e) { e.printStackTrace(); } } } // close etc omitted }

La idea principal es que el IO del disco no está bloqueando el cálculo.

Básicamente, solo estás usando una ConcurrentLinkedQueue que está sincronizada y estás agregando resultados de varios subprocesos. Como puede ver, esto también se está ejecutando en un subproceso, buscando nuevos resultados para escribir en el archivo de secuencia.

Estoy seguro de que GFS admite estas cosas de forma nativa, HDFS no (en este punto) no.


No creo que esto sea posible con HDFS. Aunque no le importa el orden de los registros, sí le importa el orden de los bytes en el archivo. No quiere que el escritor A escriba un registro parcial que luego se corrompe por el escritor B. Este es un problema difícil de resolver por sí mismo por HDFS, por lo que no lo hace.

Crea un archivo por escritor. Pase todos los archivos a cualquier trabajador de MapReduce que necesite leer estos datos. Esto es mucho más simple y se ajusta al diseño de HDFS y Hadoop. Si el código que no es de MapReduce necesita leer estos datos como una secuencia, entonces puede transmitir cada archivo de forma secuencial o escribir un trabajo MapReduce muy rápido para consolidar los archivos.