2016-03-15 2 views
1

В Hadoop команды и hdfs dfs -getmerge позволяют легко считывать содержимое сжатых файлов в HDFS из командной строки, включая прокладку к другим командам для обработки (например, wc -l <(hdfs dfs -getmerge /whatever 2>/dev/null)).Hadoop: обратный hdfs dfs -text

Есть ли обратная связь для этих команд, позволяющая передавать содержимое в HDFS из командной строки, , поддерживая те же функции сжатия и форматирования, что и вышеупомянутые команды? hdfs dfs -put, похоже, просто сделает необработанную копию локального файла в HDFS без изменения формата сжатия или контейнера.

Ответы, предлагающие инструменты командной строки для управления такими форматами и алгоритмами сжатия, также приветствуются. Обычно я вижу сжатые данные Snappy в CompressedStream, но не могу понять, как преобразовать простой текстовый файл (один базовый элемент в строке) в такой файл из командной строки. Я попробовал snzip (как предложено в this askubuntu question), а также this snappy command-line tool, но не смог использовать ни один из них для создания файлов с поддержкой Hadoop-Snappy (или прочитать содержимое файлов Snappy, попавших в HDFS с использованием Apache Flume).

ответ

1

Там нет, казалось бы, не взаимна hdfs dfs -text и не WebHDFS также имеет поддержки сжатия (де) вообще, так что я в конечном итоге написание мой собственный инструмент командной строки в Java для сжатия стандартного ввода на стандартный вывод в Hadoop-дружелюбный Snappy.

код выглядит следующим образом:

class SnappyCompressor { 
    static void main(String[] args) 
    { 
     try { 
      Configuration conf = new Configuration(); 
      CompressionCodecFactory ccf = new CompressionCodecFactory(conf); 
      CompressionCodec codec = 
       ccf.getCodecByClassName(SnappyCodec.class.getName()); 
      Compressor comp = CodecPool.getCompressor(codec); 
      CompressionOutputStream compOut = 
       codec.createOutputStream(System.out, comp); 
      BufferedReader in = 
       new BufferedReader(new InputStreamReader(System.in)); 
      String line; 
      while((line=in.readLine()) != null) { 
       compOut.write(line.getBytes()); 
       compOut.write('\n'); 
      } 
      compOut.finish(); 
      compOut.close(); 
     } 
     catch(Exception e) { 
      System.err.print("An exception occured: "); 
      e.printStackTrace(System.err); 
     } 
    } 
} 

Выполнить с помощью hadoop jar <jar path> <class name>.

Текстовые данные, сжатые таким образом, могут быть put в HDFS (например, hdfs dfs -put или с использованием WebHDFS), затем читать с помощью hdfs dfs -text.

0

Вы можете использовать HDFS NFS, монтировать его как диск и иметь возможность запускать команду linux для взаимодействия.

https://hadoop.apache.org/docs/r2.4.1/hadoop-project-dist/hadoop-hdfs/HdfsNfsGateway.html

+0

И как это поможет в точности с форматами файлов и режимами сжатия? Я бы просто получил доступ к необработанным файлам, как, например, с помощью 'hdfs dfs -put' и' hdfs dfs -get', правильно? – Shadocko

+0

Вы хотите, чтобы вы прочитали необработанный файл? – vgunnu

+0

Нет, у меня есть обычный текстовый файл в мире Unix (или выход программы) и хотел бы сохранить его как файл Snappy в HDFS. 'hdfs dfs -text/path/in/hdfs' позволяет читать файл Snappy из HDFS в виде обычного текста в командной строке, и я запускаю противоположную операцию. – Shadocko