Existe uma maneira de fazer o grep do conteúdo gzip em hdfs sem extraí-lo?

4

Estou procurando uma maneira de zgrep hdfs files

algo como:

hadoop fs -zcat hdfs://myfile.gz | grep "hi"

ou

hadoop fs -cat hdfs://myfile.gz | zgrep "hi"

isso realmente não funciona para mim está lá de qualquer maneira para conseguir isso com a linha de comando?

    
por Jas 22.01.2015 / 11:49

3 respostas

4

zless / zcat / zgrep são apenas wrappers de shell que fazem o gzip mostrar os dados descomprimidos para o stdout. Para fazer o que você quer, você só precisa escrever um wrapper em torno dos comandos hadoop fs .

Além de: A razão pela qual isso provavelmente não funcionou para você é que você está perdendo uma barra adicional em seu URI de hdfs.

Você escreveu:

hadoop fs -cat hdfs://myfile.gz | zgrep "hi"

Isso tenta entrar em contato com o host ou cluster chamado myfile.gz . O que você realmente quer é hdfs: ///myfile.gz ou (assumindo que seus arquivos de configuração estão configurados corretamente), apenas myfile.gz , que o comando hadoop deve prefixar com o caminho correto do cluster / namenode definido por fs.defaultFS .

O seguinte funciona para mim.

$ hadoop fs -ls hdfs:///user/hcoyote/foo.gz
Found 1 items
-rw-r--r--   3 hcoyote users    5184637 2015-02-20 12:17 hdfs:///user/hcoyote/foo.gz

$ hadoop fs -cat hdfs:///user/hcoyote/foo.gz | gzip -c -d | grep -c Authorization
425893

$ hadoop fs -cat hdfs:///user/hcoyote/foo.gz | zgrep -c Authorization
425893
    
por 20.02.2015 / 19:32
5

Esta linha de comando encontrará automaticamente o descompactador correto para qualquer arquivo de texto simples e imprimirá os dados descompactados na saída padrão:

hadoop fs -text hdfs:///path/to/file [hdfs:///path/to/another/file]

Eu usei isso para .snappy & arquivos .gz. Provavelmente funciona para arquivos .lzo e .bz2.

Esse é um recurso importante porque o Hadoop usa um formato de arquivo personalizado para arquivos Snappy. Essa é a única maneira direta de descompactar um arquivo Snappy criado pelo Hadoop. Não há comando de linha de comando 'unsnappy' como há para os outros compressores. Eu também não sei de nenhum comando direto que crie um. Eu os criei apenas como dados da tabela Hive.

Nota: hadoop fs -text é single-threaded e executa a descompressão na máquina onde você executa o comando.

    
por 03.01.2016 / 01:27
0

Eu costumo usar hdfs fuse mounts .. então posso usar quase todos os comandos Unix regulares (alguns dos comandos podem não funcionar, pois o hdfs não é um sistema de arquivos compatível com POSIX).

gunzip / zcat

$ gunzip /hdfs_mount/dir1/somefile.gz 
$ grep hi /hdfs_mount/dir1/somefile.gz 

funciona muito bem em montagens de fusíveis hdfs. E mais rápido para digitar também :), mais fácil de ler se, por exemplo, você quer roteirizar isso.

Para montar o hadoop como um sistema de arquivos "regular": link

    
por 23.07.2015 / 20:13

Tags