2016-03-15 74 views
1

在Hadoop中,hdfs dfs -texthdfs dfs -getmerge命令允许从命令行轻松读取HDFS中的压缩文件内容,包括管道到其他处理命令(例如wc -l <(hdfs dfs -getmerge /whatever 2>/dev/null))。Hadoop:hdfs dfs -text

这些命令是否有倒数,允许从命令行将内容推送到HDFS,同时支持与上述命令相同的压缩和格式功能hdfs dfs -put似乎只是将本地文件的原始副本转换为HDFS,而不进行压缩或更改容器格式。

建议用于处理这种格式和压缩算法的命令行工具的答案也受到欢迎。我通常会在CompressedStream中看到Snappy压缩的数据,但无法知道如何从命令行将简单的旧文本文件(每行一个数据)转换为这样的文件。我尝试了snzip(如this askubuntu question中建议的)以及this snappy command-line tool,但无法使用它们中的任何一个来生成适用于Hadoop的Snappy文件(或者使用Apache Flume读取在HDFS中摄入的Snappy文件的内容)。

回答

1

有貌似没有倒数hdfs dfs -text和WebHDFS也有(DE)压缩不支持任何,所以我结束了用Java编写自己的命令行工具,用于压缩标准输入到标准输出Hadoop友好的Snappy。

代码是这样的:使用hadoop jar <jar path> <class name>

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); 
     } 
    } 
} 

运行。

以这种方式压缩的文本数据可以是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

nope,我在Unix世界(或程序输出)中有一个普通的旧文本文件,并希望将其作为Snappy文件存储在HDFS中。 'hdfs dfs -text/path/in/hdfs'使得从HDFS读取Snappy文件成为命令行中普通的旧文本成为可能,并且我正在做相反的操作。 – Shadocko