Diferença entre tabelas internas do Hive e tabelas externas?


110

Alguém pode me dizer a diferença entre a tabela externa do Hive e as tabelas internas. Eu sei que a diferença vem ao largar a mesa. Não entendo o que você quer dizer com os dados e os metadados são excluídos nas tabelas internas e apenas os metadados são excluídos nas tabelas externas. Alguém pode me explicar em termos de nós, por favor.

Respostas:


118

O Hive tem um banco de dados relacional no nó mestre que usa para controlar o estado. Por exemplo, quando você CREATE TABLE FOO(foo string) LOCATION 'hdfs://tmp/';, este esquema de tabela é armazenado no banco de dados.

Se você tiver uma tabela particionada, as partições são armazenadas no banco de dados (isso permite que o hive use listas de partições sem ir ao sistema de arquivos e localizá-las, etc). Esses tipos de coisas são os 'metadados'.

Quando você descarta uma tabela interna, ela descarta os dados e também os metadados.

Quando você remove uma tabela externa, ela apenas remove os metadados. Isso significa que a colmeia ignora esses dados agora. Ele não afeta os dados em si.


ok .. por exemplo, eu criei uma tabela externa .. e deixo-a cair. o que acontece? o que você quer dizer com os dados não são tocados? se eu der um select * dessa tabela, ela será exibida? não consigo imaginar a diferença.
DrewRose de

11
Se você eliminar uma tabela, o Hive retornará o estado em que estava antes de você eliminá-la. se você executar a consulta 'select * from foo' depois de eliminar foo, o hive dirá que a tabela não existe. Isso é porque você disse à colmeia para esquecer aquela mesa. Os dados ainda existem em qualquer sistema de arquivos em que estavam antes. Pense nos metadados como um 'ponteiro' para onde os dados estão.
prestomation

1
Então, você está dizendo se eu tenho dados em dis location opt / nancy / foo.txt e os carrego na tabela externa e solto, os metadados são perdidos, mas os dados neste local opt / nancy / foo.txt permanecem?
DrewRose de

OK, agora este local está no HDFS ou no meu sistema local? Se estiver no sistema local, quando carrego os dados em uma tabela interna e elimino a tabela, o arquivo foo.txt ainda permanecerá naquele local. estou certo até agora?
DrewRose

3
As tabelas do Hive estão em um sistema de arquivos compatível (Hbase, HDFS, S3, etc). Estou assumindo que você está usando "LOAD DATA" para carregar dados de um arquivo local em uma tabela de colmeia. Nesse caso, você está copiando o arquivo local para uma tabela de colmeia. Ao eliminar esta tabela, a cópia dos dados da tabela interna será excluída, mas o arquivo de origem do comando "LOAD DATA" ainda estará intacto.
prestomation

101

As tabelas do Hive podem ser criadas como EXTERNAL ou INTERNAL. Esta é uma escolha que afeta como os dados são carregados, controlados e gerenciados.

Use tabelas EXTERNAL quando:

  1. Os dados também são usados ​​fora do Hive. Por exemplo, os arquivos de dados são lidos e processados ​​por um programa existente que não bloqueia os arquivos.
  2. Os dados precisam permanecer no local subjacente mesmo depois de DROP TABLE. Isso pode se aplicar se você estiver apontando vários esquemas (tabelas ou visualizações) em um único conjunto de dados ou se estiver iterando por meio de vários esquemas possíveis.
  3. Você deseja usar um local personalizado, como ASV.
  4. O Hive não deve possuir dados e configurações de controle, dirs, etc., você tem outro programa ou processo que fará essas coisas.
  5. Você não está criando uma tabela com base na tabela existente (AS SELECT).

Use tabelas INTERNAS quando:

Os dados são temporários.

Você deseja que o Hive gerencie completamente o ciclo de vida da tabela e dos dados.



A criação de uma tabela INTERNA excluirá os dados do HDFS ou fará uma cópia e usará exclusivamente para colmeia deixando a fonte (HDFS) intacta?
luckyyluke

@swetha Olá, vim aqui porque eliminei completamente o metastore.db mas os dados permanecem em hdfs. Portanto, quando eu mostro tabelas, nada é mostrado. Existe uma maneira de recriar os metadados?
awadhesh14

47

Para responder a sua pergunta:

Para tabelas externas, o Hive armazena os dados no LOCAL especificado durante a criação da tabela (geralmente não no diretório do warehouse). Se a tabela externa for eliminada, os metadados da tabela serão excluídos, mas não os dados.

Para tabelas internas, o Hive armazena dados em seu diretório de warehouse. Se a tabela for descartada, os metadados e os dados da tabela serão excluídos.


Para sua referência,

Diferença entre tabelas internas e externas:

Para tabelas externas -

  • A tabela externa armazena arquivos no servidor HDFS, mas as tabelas não estão totalmente vinculadas ao arquivo de origem.

  • Se você excluir uma tabela externa, o arquivo ainda permanecerá no servidor HDFS.

    Por exemplo, se você criar uma tabela externa chamada “table_test” no HIVE usando HIVE-QL e vincular a tabela ao arquivo “file” , então deletar “table_test” do HIVE não irá deletar “file” do HDFS .

  • Os arquivos de tabelas externas podem ser acessados ​​por qualquer pessoa que tenha acesso à estrutura de arquivos HDFS e, portanto, a segurança precisa ser gerenciada no nível de arquivo / pasta HDFS.

  • Os metadados são mantidos no nó mestre e a exclusão de uma tabela externa do HIVE exclui apenas os metadados, não os dados / arquivo.


Para tabelas internas-

  • Armazenado em um diretório com base nas configurações em hive.metastore.warehouse.dir, por padrão, as tabelas internas são armazenadas no seguinte diretório “/ user / hive / warehouse”, você pode alterá-lo atualizando o local no arquivo de configuração.
  • Excluir a tabela exclui os metadados e dados do nó mestre e HDFS, respectivamente.
  • A segurança do arquivo da tabela interna é controlada exclusivamente pelo HIVE. A segurança precisa ser gerenciada dentro do HIVE, provavelmente no nível do esquema (depende da organização).

O Hive pode ter tabelas internas ou externas, esta é uma escolha que afeta como os dados são carregados, controlados e gerenciados.

Use tabelas EXTERNAL quando:

  • Os dados também são usados ​​fora do Hive . Por exemplo, os arquivos de dados são lidos e processados ​​por um programa existente que não bloqueia os arquivos.
  • Os dados precisam permanecer no local subjacente mesmo depois de DROP TABLE. Isso pode se aplicar se você estiver apontando vários esquemas (tabelas ou visualizações) em um único conjunto de dados ou se estiver iterando por meio de vários esquemas possíveis.
  • O Hive não deve possuir dados e configurações de controle, diretórios, etc. , Você pode ter outro programa ou processo que fará essas coisas.
  • Você não está criando uma tabela com base na tabela existente (AS SELECT).

Use tabelas INTERNAS quando:

  • Os dados são temporários .
  • Você deseja que o Hive gerencie completamente o ciclo de vida da tabela e dos dados .

Fonte :

HDInsight: introdução às tabelas internas e externas do Hive

Tabelas internas e externas no Hadoop- HIVE


1
@CapturedTree Mas a resposta não está correta. "O Hive move os dados para seu diretório de warehouse." - isso está completamente errado, não. Os dados estão sendo armazenados no local da tabela. Não importa externo ou gerenciado.
partiu para

6

Os dados de uma tabela interna são armazenados na pasta do warehouse, enquanto os dados de uma tabela externa são armazenados no local que você mencionou na criação da tabela.

Portanto, quando você exclui uma tabela interna, ele exclui o esquema, bem como os dados da pasta do warehouse, mas para uma tabela externa é apenas o esquema que você perderá.

Portanto, quando você quiser uma tabela externa de volta após excluí-la, pode criar uma tabela com o mesmo esquema novamente e apontá-la para o local dos dados originais. Espero que esteja claro agora.


4

A única diferença de comportamento (não o uso pretendido) com base na minha pesquisa e testes limitados até agora (usando Hive 1.1.0 -cdh5.12.0) parece ser quando uma tabela é descartada

  • os dados das tabelas internas (gerenciadas) são excluídos do sistema de arquivos HDFS
  • enquanto os dados das tabelas externas NÃO são excluídos do sistema de arquivos HDFS.

(NOTA: Veja a seção 'Tabelas gerenciadas e externas' em https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL que lista algumas outras diferenças que eu não entendi completamente)

Eu acredito que o Hive escolhe o local onde precisa criar a tabela com base na seguinte precedência de cima para baixo

  1. Localização definida durante a Criação da Tabela
  2. Local definido na Criação do Banco de Dados / Esquema em que a tabela é criada.
  3. Diretório Hive Warehouse padrão (propriedade hive.metastore.warehouse.dir em hive.site.xml)

Quando a opção "Localização" não é usada durante a "criação de uma tabela de colmeia", a regra de precedência acima é usada. Isso é aplicável para tabelas internas e externas. Isso significa que uma tabela interna não precisa necessariamente residir no diretório Warehouse e pode residir em qualquer outro lugar.

Nota: Eu posso ter perdido alguns cenários, mas com base em minha exploração limitada, o comportamento da mesa interna e externa parece ser o mesmo, exceto por uma diferença (exclusão de dados) descrita acima. Tentei os seguintes cenários para tabelas internas e externas.

  1. Criação de mesa com e sem opção de localização
  2. Criação de tabela com e sem opção de partição
  3. Adicionar novos dados usando as instruções Hive Load e Insert
  4. Adicionar arquivos de dados ao local da tabela fora do Hive (usando comandos HDFS) e atualizar a tabela usando o comando "MSCK REPAIR TABLE
  5. Derrubando as mesas

boa exploração. Esta é a única resposta explicada como a colmeia lida com a opção de localização para mesa interna e externa.
d2207197

3

Em tabelas externas, se você eliminá-lo, ele exclui apenas o esquema da tabela, os dados da tabela existem no local físico. Portanto, para excluir os dados, use hadoop fs - rmr tablename. A seção de tabelas gerenciadas terá controle total sobre as tabelas. Em tabelas externas, os usuários terão controle sobre ele.


Estou encontrando uma situação em que o diretório nem sempre é excluído após um DROP TABLE em uma tabela interna criada por meio de CREATE TABLE foo (id INT). Os metadados estão aparentemente ok porque SHOW TABLES é consistente - a tabela não aparece na lista após ser eliminada. Surpreendentemente, às vezes notei que o dir / is / foi excluído, mas não consigo recriar isso de forma consistente. Alguma ideia?
Matthew Cornell

As permissões das tabelas são verificadas? Você pode ter alterado a propriedade do local no HDFS para algum usuário diferente.
Milind Jindal

1

As tabelas internas são úteis se você deseja que o Hive gerencie o ciclo de vida completo dos seus dados, incluindo a exclusão, enquanto as tabelas externas são úteis quando os arquivos estão sendo usados ​​fora do Hive.


1

A tabela hive externa tem as vantagens de não remover arquivos quando removemos tabelas, podemos definir formatos de linha com configurações diferentes, como serde .... delimitado


1

Lembre-se também de que o Hive é um grande data warehouse. Quando você deseja eliminar uma tabela, não quer perder Gigabytes ou Terabytes de dados. Gerar, mover e copiar dados nessa escala pode ser demorado. Quando você descarta uma seção de tabela 'Gerenciada', também destrói seus dados. Quando você remove uma tabela 'Externa', apenas a definição do esquema do meta-armazenamento do hive é removida. Os dados sobre os hdfs ainda permanecem.


1

Considere este cenário que melhor se adequa à Tabela Externa:

Um trabalho MapReduce (MR) filtra um enorme arquivo de log para liberar narquivos de sub log (por exemplo, cada arquivo de sub log contém um log de tipo de mensagem específico) e a saída, ou seja, os narquivos de sub log são armazenados em hdfs.

Esses arquivos de log devem ser carregados nas tabelas do Hive para a realização de análises adicionais, neste cenário eu recomendaria uma (s) Tabela (s) Externa (s), porque os arquivos de log reais são gerados e pertencentes a um processo externo, ou seja, um trabalho de MR além de você pode evitar um etapa adicional de carregar cada arquivo de log gerado na respectiva tabela Hive também.


1

O melhor caso de uso para uma tabela externa na seção é quando você deseja criar a tabela a partir de um arquivo CSV ou de texto


0

O hive armazena apenas os metadados no metastore e os dados originais no lado externo do hive quando usamos a tabela externa, podemos dar a localização '' por estes nossos dados originais não afetarão quando descartamos a tabela


0

Quando já houver dados no HDFS, uma tabela Hive externa pode ser criada para descrever os dados. É denominado EXTERNAL porque os dados na tabela externa são especificados nas propriedades LOCATION em vez do diretório padrão do warehouse.

Ao manter os dados nas tabelas internas, o Hive gerencia totalmente o ciclo de vida da tabela e dos dados. Isso significa que os dados são removidos assim que a tabela interna é eliminada. Se a tabela externa for eliminada, os metadados da tabela serão excluídos, mas os dados serão mantidos. Na maioria das vezes, uma tabela externa é preferida para evitar a exclusão de dados junto com as tabelas por engano.


0

Para tabelas gerenciadas, o Hive controla o ciclo de vida de seus dados. O Hive armazena os dados das tabelas gerenciadas em um subdiretório no diretório definido por hive.metastore.warehouse.dir por padrão.

Quando eliminamos uma tabela gerenciada, o Hive exclui os dados da tabela. Mas as tabelas gerenciadas são menos convenientes para compartilhar com outras ferramentas. Por exemplo, digamos que temos dados que são criados e usados ​​principalmente pelo Pig, mas queremos executar algumas consultas neles, mas não dar ao Hive a propriedade dos dados.

Nesse momento, é definida uma tabela externa que aponta para esses dados, mas não se apropria deles.


0

INTERNO : a tabela é criada primeiro e os dados são carregados depois

EXTERNO : os dados estão presentes e a tabela é criada sobre eles.


0

No Hive, também podemos criar uma mesa externa. Diz ao Hive para consultar os dados que estão em um local existente fora do diretório do warehouse. A eliminação de tabelas externas excluirá os metadados, mas não os dados.


0

Eu gostaria de adicionar isso

  1. As tabelas internas são usadas quando os dados precisam ser atualizados ou algumas linhas precisam ser excluídas porque as propriedades ACID podem ser suportadas nas tabelas internas, mas as propriedades ACID não podem ser suportadas nas tabelas externas.
  2. Certifique-se de que haja um backup dos dados na tabela interna, pois se uma tabela interna for descartada, os dados também serão perdidos.

-2

Em palavras simples, existem duas coisas:

O Hive pode gerenciar coisas no warehouse, ou seja, não excluirá dados do warehouse. Quando excluímos a tabela:

1) Para tabelas internas, os dados são gerenciados internamente no warehouse. Portanto, será excluído.

2) Para tabelas externas, os dados são gerenciados eternamente a partir do warehouse. Portanto, não pode ser excluído e outros clientes além do hive também podem usá-lo.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.