O Spark SQL é mais rápido que o Hive?


Melhor resposta

Em qualquer benchmark possível, o Spark Sql é “muito” mais rápido que o Hive. Embora o Facebook tenha criado o Presto – uma cópia barata do design do Spark colocada sob o capô da colmeia e também haja uma versão mais recente da colmeia em Tez – cuja desventura com DAGs está bem documentada aqui O Tragédia de Tez , mas em todas as tarefas relacionadas a SQL (por exemplo, sqls do lado do mapa => filtro, mutação de dados ou Sqls do lado de redução => funções de classificação / agregação / janela), o Spark ainda brilha.

Uma vez que a pergunta não pergunta Por quê, eu não entraria muito em detalhes técnicos. Mas, só para dar uma ideia, pense em um modelo de processamento de dados distribuído em que cada tarefa precisa gravar um conjunto de dados inteiro (com replicação) antes de ser concluído, em que o aplicativo é incapaz de avaliar a utilização de recursos por conta própria e onde o aplicativo está a misericórdia do gerenciador de cluster ao lançar a tarefa / estágio de execução e comparar isso com outro modelo de processamento de dados distribuído onde as tarefas podem viver na memória pela maior parte do tempo, onde os recursos podem ser alocados de forma inteligente pelo motor e onde a estrutura pode ficar no topo de um gerenciador de cluster e depende do gerenciador de cluster para nada – além da alocação de contêiner (e um pouco de Des / Serialização que pode até mesmo ser contornada)

(e para mantê-lo breve, não mencione até que Spark 1.6 / 2.x está intensificando o jogo com implementação de Tungsten ou simd para otimização de consulta)

Qual modelo você acha que venceria a batalha da latência?

Resposta

Vamos começar com sua consulta : Hive implementa um subconjunto de SQL – a linguagem Hive ( LanguageManual – Apache Hive – Apache Software Foundation ) que é específico para os recursos do Hive e do Hadoop. Sua consulta enviada é dividida em partes, predicados, que podem ser implementados em operações ou estágios. O SELECT col1 , col2 ,… coln especifica quais colunas de cada linha retornada serão mantidas e retornadas no conjunto de soluções. Da mesma forma, uma junção LEFT ou RIGHT seria implementada em um estado específico, provavelmente um estágio Map-Reduce (M\_R). Depois que sua consulta for separada em partes correspondentes a operações específicas, o Otimizador Baseado em Custo (CBO) usa estatísticas reunidas e armazenadas para tomar decisões inteligentes sobre como cada uma dessas etapas será executada. Por exemplo, uma cláusula WHERE pode ser implementada como uma verificação de tabela, se não for muito específica (baixa cardinalidade) ou se uma tabela não for particionada, ou pode resultar na eliminação da partição se a tabela for particionada e a cláusula WHERE especificar colunas de partição com alta especificidade. Se uma consulta especificar várias junções, cada junção será implementada como um estágio Map-Reduce. Se uma das tabelas de junção for muito pequena, um Map-Join pode ser selecionado para execução pelo CBO para melhor desempenho.

Uma vez que o CBO delineia um plano de execução, os estágios são programados e executados, normalmente como múltiplos estágios de MR. Você pode examinar o plano de execução que o CBO usaria para executar qualquer consulta, executando um EXPLAIN na consulta.

Eu tinha um cliente na indústria de vídeo que reunia estatísticas sobre os hábitos de visualização de seus usuários. Essas estatísticas foram reunidas em uma tabela muito grande (100s de TiB) que o cliente desejou juntar com cerca de 20 tabelas relativamente pequenas que continham dados sobre cada vídeo, os atores no vídeo, o enredo de cada vídeo, os dados de produção, etc. Eu criei visualizações que juntaram sucessivamente as tabelas menores que foram finalmente unidas à tabela de visualização para uma visualização de resultado, que foi então gravada em uma tabela de saída. Quando enviei uma consulta simples para selecionar a partir da visualização de resultados na tabela de saída (CREATE TABLE output (…) AS SELECT * FROM results\_view), o Hive criou uma consulta de 25 estágios que materializou todas as visualizações intermediárias na visualização final que foi então escrita para a tabela de saída. Como cada estágio era um trabalho M-R (para YARN) e o tempo de configuração para um trabalho M-R era de cerca de 30 segundos para esse cluster, cerca de 12 a 14 minutos foram gastos no tempo de configuração M-R. A maioria dos estágios M-R executados em 5 segundos, 2/3 dos quais foram tempo de configuração de M-R e 1/3 a execução real. A junção final do mapa das tabelas menores à tabela de estatísticas do visualizador levou mais 20 minutos. Criar um monte de visualizações que foram sucessivamente unidas em uma tabela de resultados me permitiu criar um pipeline que foi montado com um monte de consultas relativamente simples, em vez de tentar criar uma consulta massiva que tentaria juntar mais de 20 tabelas em uma consulta.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *