Hadoop:hdfs dfs -text 的倒数
Hadoop: reciprocal of hdfs dfs -text
在 Hadoop 中,hdfs dfs -text
和 hdfs 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
.
读取
在 Hadoop 中,hdfs dfs -text
和 hdfs 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
.