9 pontos por GN⁺ 2026-01-19 | 2 comentários | Compartilhar no WhatsApp
  • Ao processar cerca de 1,75 GB de dados de partidas de xadrez com ferramentas de linha de comando em vez de Hadoop, a tarefa foi concluída em apenas 12 segundos, mostrando desempenho mais de 235 vezes superior aos 26 minutos do Hadoop
  • Combinando comandos básicos de shell como grep, sort, uniq, awk, xargs e mawk, foi montado um pipeline de processamento em streaming, mantendo o uso de memória praticamente em zero
  • Com processamento paralelo com xargs e otimização com mawk, o aproveitamento dos núcleos de CPU aumentou e os gargalos de IO foram minimizados
  • Em comparação com o processamento do mesmo conjunto de dados em um cluster Hadoop (7 instâncias c1.medium), o custo e a carga de manutenção são significativamente menores
  • O caso mostra que é possível fazer análise de dados eficiente até mesmo em uma única máquina e chama atenção para o uso desnecessário de ferramentas de Big Data

Introdução: processamento em linha de comando mais rápido que Hadoop

  • Após ver um caso de análise de cerca de 2 milhões de partidas de xadrez com Amazon EMR e mrjob, o mesmo conjunto de dados foi reproduzido com processamento em streaming baseado em linha de comando
    • No cluster Hadoop (7 máquinas c1.medium), foram necessários 26 minutos, com taxa de processamento de 1,14 MB/sec
    • Em um notebook local, a tarefa terminou em 12 segundos, com taxa de processamento de 270 MB/sec
  • Fica demonstrado que tarefas simples de agregação de resultados são muito mais eficientes com pipelines de shell do que com Hadoop
  • Ao combinar comandos de shell, é possível implementar em uma única máquina uma estrutura de processamento paralelo em fluxo semelhante ao Storm

Estrutura e preparação dos dados

  • Os dados estão no formato PGN (Portable Game Notation), que registra partidas de xadrez, e o resultado de cada partida aparece na linha "Result"
    • "1-0" significa vitória das brancas, "0-1" vitória das pretas e "1/2-1/2" empate
  • Foi obtido um conjunto de dados de cerca de 3,46 GB no repositório rozim/ChessData no GitHub
    • Aproximadamente o dobro do conjunto usado no experimento de Tom Hayden (1,75 GB)

Construção do pipeline básico

  • Para medir o limite de IO, foi executado cat *.pgn > /dev/null, que levou cerca de 13 segundos (272 MB/sec)
  • Pipeline básico de análise:
    cat *.pgn | grep "Result" | sort | uniq -c
    
    • Tempo de execução de cerca de 70 segundos, aproximadamente 47 vezes mais rápido que o Hadoop
  • Em vez de sort | uniq, foi usado AWK para agregar diretamente os resultados
    • Tempo de execução de 65 segundos, com uso de memória quase nulo
    • O grep ocupava um único núcleo de CPU e se tornava o gargalo

Paralelização e otimização

  • Paralelização do grep com xargs
    find . -type f -name '*.pgn' -print0 | xargs -0 -n1 -P4 grep -F "Result" | gawk ...
    
    • Tempo de execução de 38 segundos, cerca de 77 vezes mais rápido
  • Remoção do grep e simplificação das etapas com filtragem apenas com AWK
    • Foi montado um pipeline duplo com AWK para consolidar os resultados de cada arquivo
    • Tempo de execução de 18 segundos, cerca de 174 vezes mais rápido
  • Troca para mawk para otimização adicional
    find . -type f -name '*.pgn' -print0 | xargs -0 -n4 -P4 mawk ... | mawk ...
    
    • Tempo de execução de 12 segundos, 235 vezes mais rápido que o Hadoop, com taxa de processamento de 270 MB/sec

Conclusão: a eficiência da simplicidade

  • Exceto quando é realmente necessário processamento distribuído em larga escala, a combinação de ferramentas de shell em uma única máquina é mais rápida e mais econômica
  • O Hadoop muitas vezes vem sendo usado em excesso até para tarefas que um banco de dados relacional ou um script simples resolveriam
  • A análise em streaming baseada em linha de comando é uma excelente alternativa em termos de desempenho, custo de implementação e manutenibilidade

2 comentários

 
dongho42 2026-01-20

Antigamente existia a expressão programação Taco Bell, então parece uma filosofia parecida.

 
GN⁺ 2026-01-19
Comentários do Hacker News
  • A parte mais triste é que este texto é de 2014
    Hoje existem ainda mais camadas de abstração, como Airflow, dbt e Snowflake, e elas acabam sendo colocadas por cima até de datasets que cabem inteiros na RAM
    Startups torram US$ 5 mil por mês em clusters distribuídos para processar menos de 10 GB de logs por dia. O motivo é que usar o ‘Modern Data Stack’ rende promoção, mas resolver com scripts bash é descartado como ‘não escalável’. Eficiência e incentivos estão completamente desalinhados

    • Em entrevistas recentes, falavam de ‘problemas de escala’, mas na prática muitas vezes tudo cabia tranquilamente em uma única máquina
      Houve até um caso de ingestão de 1 GB de JSON por dia, e quando expliquei que uma máquina só bastava, responderam: “tecnicamente está certo, mas não é a resposta que queremos” — e me rejeitaram
      As máquinas de hoje têm RAM na casa dos TBs e centenas de núcleos. Uma única máquina já é enorme
    • Isso não é só questão de promoção, mas também da estrutura de contratação
      Ao contratar gente de DevOps, enfatizam experiência com frameworks chamativos, então essas pessoas chegam à empresa e repetem exatamente a mesma coisa
      Como ninguém contesta, acabam complicando trabalhos que um desktop sozinho daria conta
    • Passei os últimos 20 anos usando a ‘tecnologia certa’ em vez da ‘tecnologia que parece legal’, e no fim fui demitido
      Estou há mais de um ano procurando emprego com um currículo quase sem frameworks da moda, e começo a me sentir um idiota
    • Vejo algo parecido na empresa também. Para fazer rodar alguns GB de dados por dia entre vários sistemas, algo que antes terminava em uma semana com um script em Python agora leva meses e quebra com frequência
    • Hoje em dia até notebooks com 128 GB de RAM são comuns, e servidores são muito maiores
      Em 2014, 4 GB era algo normal, mas agora a velocidade de streaming via SSD também aumentou, então às vezes ler de um SSD local é melhor do que usar um cluster
  • Sou o autor do texto!
    Fico feliz que um texto antigo ainda seja útil
    Concordo com a opinião de que a situação piorou, mas por outro lado também vejo um movimento de afastamento da adoração cega por microservices, o que é um alívio
    Mando meu apoio a todos que estão trabalhando para melhorar desempenho. Ainda há esperança

    • Adam, obrigado!
      Reli o texto várias vezes e, inspirado por ele, portei a Waters-Series para JavaScript para implementar pipeline de streams
  • Hoje o setor tem uma noção forte demais de que Spark ou ferramentas distribuídas são a resposta certa para engenharia de dados
    É parecido com o uso excessivo de frameworks SPA no desenvolvimento web
    Meu conselho é o seguinte:

    • Gestores não devem exigir uma tecnologia específica (Spark, React), e sim deixar nas mãos de engenheiros com capacidade de resolver problemas
    • Líderes técnicos devem ser honestos e dizer: “nosso pipeline aguenta até 20 GB, e se crescer mais do que isso temos um plano para escalar com X/Y/Z”
      O que o gestor quer ouvir não é ‘tudo escala infinitamente’, mas a confiança de que ‘isso roda com estabilidade’
    • A maioria das empresas lida com poucos dados
      O tamanho dos dados segue uma lei de potência, então engenheiros que realmente trabalham com dados em escala de petabytes são uma minoria minúscula
      Mas, como muita gente quer colocar esse tipo de experiência no currículo para ganhar mais, acaba surgindo engenharia excessiva
    • Quando trabalhei em um unicórnio famoso, o gestor disse: “no próximo trimestre temos que usar Spark”
      Quando perguntei por quê, a resposta foi: “porque temos que usar”. Provavelmente era por causa de currículo ou de algum motivo político de alguém
  • Uma história histórica relacionada ao texto
    A ferramenta mrjob também podia rodar em modo local, sem Hadoop
    Em datasets pequenos, era muito mais rápida que um cluster. Especialmente mais rápida do que clusters temporários como AWS EMR
    Mesmo assim, a abordagem do autor provavelmente era ainda mais eficiente que isso
    O MapReduce facilitava escalar para volumes grandes, mas para dados pequenos vinha com muitas restrições ineficientes
    No começo dos anos 2010, processei dados em escala de petabytes com mrjob, mas hoje quase ninguém usa mais

  • Quando trabalhei como engenheiro de dados, reescrevi scripts Bash/Python em C# e levei a velocidade de processamento de JSON a 1 GB/s
    Só com otimizações simples, como parsing em streaming, já deu uma diferença enorme
    Então fico curioso — a partir de que volume de dados um cluster realmente passa a fazer sentido?

    • Em compensação, há 15 anos já aconteceu comigo o contrário: troquei um sistema complexo em C# por bash + Python e ficou muito mais rápido
      Para mim, se a tarefa leva mais de um dia, já vale considerar processamento distribuído
    • Uma vez, em um painel da PyCon, um cientista de dados famoso disse que o Excel é melhor que o Pandas
      Quando os dados eram grandes, ele fazia amostragem e analisava no Excel. Hoje, com LLMs, até scripts simples em Python/Bash ficaram fáceis de escrever
    • Além do tempo de processamento, outro critério é quando os dados não cabem no disco local
      Já dá para ler e gravar direto em armazenamento de objetos como S3, e hoje dá para chegar a 100 GB/s
    • O dataset de xadrez citado neste comentário tem cerca de 14 TB
      Cabe em disco, mas é grande demais para um notebook comum
    • Tenho curiosidade sobre como fazer parsing de JSON em streaming. A maioria dos parsers precisa ler tudo para validar a sintaxe, então queria entender como isso foi resolvido
  • O ‘tamanho’ dos dados depende do que você quer fazer com eles
    Por exemplo, para estatísticas simples em dados cirúrgicos, bash basta; mas se quiser calcular a correlação entre experiência do médico e taxa de sucesso, a complexidade sobe drasticamente
    Então, do ponto de vista da empresa, é muito mais fácil dizer “usamos Spark” do que dizer “criamos um motor sob medida para cada pergunta”

    • Mas só com SQLite já dá para lidar com dados entre 50 GB e 2 TB
      Todos os problemas mencionados podem ser resolvidos em um único servidor com ferramentas simples
  • Este texto já apareceu várias vezes no HN
    A versão de 2018, a versão de 2022 e a versão de 2024 foram enviadas pela mesma pessoa

  • Isso me lembra a frase de apresentação do antigo site da Shakti
    “1K rows: Excel / 1M rows: Pandas / 1B rows: Shakti / 1T rows: Only Shakti”
    Fonte

  • Muitos desenvolvedores aprenderam em ambiente Windows e não estão acostumados com ferramentas de CLI
    Mas a CLI oferece recursos poderosos, como loops implícitos, separação automática de campos e aplicação paralela de expressões regulares
    Isso ajuda a criar rapidamente soluções ad-hoc e serve como um ótimo ponto de partida antes de partir para sistemas grandes

  • Fico pensando como seria refazer o benchmark escalando bem mais os dados de xadrez
    Hoje o dataset do Lichess tem cerca de 7B partidas, 2,34 TB compactado (14 TB sem compactação)
    Será que nessa escala o Hadoop venceria?

    • Se colocar vários SSDs rápidos em um único servidor, ainda parece provável que seja mais rápido que EMR+S3
      Mas isso também exige administrar um servidor dedicado
      O EMR é um modelo pensado para processamento paralelo quando a frequência de acesso aos dados é baixa (de 1 a 10 vezes por dia)
    • Os dados compactados cabem tranquilamente em SSD local, e também dá para fazer descompressão em streaming
    • Fico curioso sobre o que seria calculado com esses dados. Seria divertido testar isso em uma NVL72