Hadoop:hdfs dfs -text 的倒数

Hadoop: reciprocal of hdfs dfs -text

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

这些命令是否有相互关系,允许从命令行将内容推送到 HDFS,同时支持与上述命令相同的压缩和格式功能hdfs dfs -put 似乎只是将本地文件的原始副本复制到 HDFS,无需压缩或更改容器格式。

也欢迎建议使用命令行工具来操作此类格式和压缩算法的答案。我通常会在 CompressedStream 中看到 Snappy 压缩数据,但不知道如何从命令行将纯旧文本文件(每行一个数据)转换为此类文件。我尝试了 snzip (as suggested in this askubuntu question) as well as this snappy command-line tool,但无法使用它们中的任何一个来生成 Hadoop 友好的 Snappy 文件(或使用 Apache Flume 读取 HDFS 中摄取的 Snappy 文件的内容)。

您可以使用 HDFS NFS,将其挂载为驱动器并且应该可以 运行 linux 命令进行交互。

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

似乎与 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.

读取