

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

# Diferenças e considerações sobre o Hive no Amazon EMR
<a name="emr-hive-differences"></a>

## Diferenças entre o Apache Hive no Amazon EMR e o Apache Hive
<a name="emr-hive-apache-diff"></a>

[Esta seção descreve as diferenças entre o Hive no Amazon EMR e as versões padrão do Hive disponíveis em http://svn.apache. org/viewvc/hive/branches](http://svn.apache.org/viewvc/hive/branches/)/. 

### Autorização do Hive
<a name="emr-hive-authorization"></a>

 O Amazon EMR é compatível com a [autorização do Hive](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Authorization) para o HDFS, mas não para o EMRFS e o Amazon S3. Os clusters do Amazon EMR são executados com a autorização desabilitada por padrão.

### Comportamento de mesclagem de arquivos do Hive com o Amazon S3
<a name="emr-hive-filemerge"></a>

O Apache Hive mesclará arquivos pequenos no final de um trabalho somente mapa se `hive.merge.mapfiles` for "true", e a mesclagem apenas será acionada se o tamanho médio de saída do trabalho for menor do que a configuração `hive.merge.smallfiles.avgsize`. O Hive no Amazon EMR tem exatamente o mesmo comportamento se o caminho de saída final está no HDFS. Se o caminho de saída estiver no Amazon S3, o parâmetro `hive.merge.smallfiles.avgsize` será ignorado. Nessa situação, a tarefa de mesclagem sempre será acionada se `hive.merge.mapfiles` estiver definido como `true`.

### Transações ACID e o Amazon S3
<a name="emr-hive-acid"></a>

O Amazon EMR 6.1.0 e versões posteriores oferecem suporte às transações Hive ACID (atomicidade, consistência, isolamento, durabilidade) para que esteja em conformidade com as propriedades ACID de um banco de dados. Com esse atributo, você pode executar as operações INSERT, UPDATE, DELETE e MERGE em tabelas gerenciadas do Hive com dados no Amazon Simple Storage Service (Amazon S3).

### LLAP (Live Long and Process) do Hive
<a name="emr-hive-LLAP"></a>

A [funcionalidade LLAP](https://cwiki.apache.org/confluence/display/Hive/LLAP) adicionada na versão 2.0 do Apache Hive padrão não é compatível com o Hive 2.1.0 na versão 5.0 do Amazon EMR.

As versões 6.0.0 e posteriores do Amazon EMR são compatíveis com a funcionalidade Live Long and Process (LLAP) do Hive. Para obter mais informações, consulte [Usar o LLAP do Hive](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-hive-llap.html). 

## Diferenças no Hive entre as versões 4.x e 5.x do Amazon EMR
<a name="emr-hive-diff"></a>

Esta seção discute as diferenças que devem ser consideradas antes da migração de uma implementação do Hive versão 1.0.0 na versão 4.x do Amazon EMR para o Hive 2.x na versão 5.x do Amazon EMR.

### Considerações e diferenças operacionais
<a name="emr-hive-diffs-ops"></a>
+ **Suporte adicionado para transações [ACID (atomicidade, consistência, isolamento e durabilidade)](https://cwiki.apache.org/confluence/display/Hive/Hive+Transactions):** essa diferença entre o Hive 1.0.0 no Amazon EMR 4.x e o Apache Hive padrão foi eliminada.
+ **Gravações diretas no Amazon S3 eliminadas:** essa diferença entre o Hive 1.0.0 no Amazon EMR e o Apache Hive padrão foi eliminada. O Hive 2.1.0 na versão 5.x do Amazon EMR agora cria, lê e grava arquivos temporários armazenados no Amazon S3. Como resultado, para ler e gravar na mesma tabela, você não precisa mais criar uma tabela temporária no sistema de arquivos HDFS local do cluster como solução alternativa. Se você usar buckets com versionamento, certifique-se de gerenciar esses arquivos temporários conforme descrito abaixo.
+ **Gerenciar arquivos temporários ao serem usados buckets do Amazon S3 com versionamento:** quando você executa consultas do Hive em que o destino dos dados gerados é o Amazon S3, muitos arquivos e diretórios e temporários são criados. Este é o novo comportamento, conforme descrito anteriormente. Se você usar buckets do S3 com versionamento, esses arquivos temporários sobrecarregarão o Amazon S3 e resultarão em custos caso não sejam excluídos. Ajuste suas regras de ciclo de vida para que os dados com um prefixo `/_tmp` sejam excluídos após um curto período, como cinco dias. Consulte [Especificar uma configuração de ciclo de vida](https://docs.aws.amazon.com/AmazonS3/latest/userguide/how-to-set-lifecycle-configuration-intro.html) para obter mais informações.
+ **Log4j atualizado para log4j 2:** se você usa log4j, talvez precise alterar sua configuração de registro em log devido a este upgrade. Para obter detalhes, consulte [Apache log4j 2](http://logging.apache.org/log4j/2.x/).

### Diferenças e considerações de desempenho
<a name="emr-hive-diffs-perf"></a>
+ **Diferenças de desempenho com o Tez:** com o Amazon EMR versão 5.x, o Tez é o mecanismo de execução padrão para o Hive em vez do. MapReduce O Tez fornece melhor desempenho para a maioria dos fluxos de trabalho.
+ **Tabelas com muitas partições:** consultas que geram um grande número de partições dinâmicas podem falhar e consultas que selecionam tabelas com muitas partições podem demorar mais do que o esperado para serem executadas. Por exemplo, um seleção de 100.000 partições pode demorar 10 minutos ou mais.

## Atributos adicionais do Hive no Amazon EMR
<a name="emr-hive-additional-features"></a>

O Amazon EMR amplia o Hive com novos recursos que oferecem suporte à integração do Hive com outros AWS serviços, como a capacidade de ler e gravar no Amazon Simple Storage Service (Amazon S3) e no DynamoDB.

### Variáveis no Hive
<a name="emr-hive-variables"></a>

 Você pode incluir variáveis nos seus scripts usando o sinal de cifrão e chaves. 

```
add jar ${LIB}/jsonserde.jar
```

 Você transmite os valores dessas variáveis ao Hive na linha de comando usando o parâmetro `-d`, como no exemplo a seguir: 

```
-d LIB=s3://elasticmapreduce/samples/hive-ads/lib
```

 Você também pode transmitir os valores em etapas que executam scripts Hive. 

**Para transmitir valores variáveis em etapas do Hive usando o console**

1. [Abra o console do Amazon EMR em https://console.aws.amazon.com /emr.](https://console.aws.amazon.com/emr/)

1. Selecione **Criar cluster**.

1. Na seção **Steps (Etapas)**, para **Add Step (Adicionar etapa)**, escolha **Hive Program (Programa Hive)** na lista e depois **Configure and add (Configurar e adicionar)**.

1.  Na caixa de diálogo **Add Step (Adicionar etapa)**, especifique os parâmetros usando a tabela a seguir como guia e escolha **Add (Adicionar)**.     
[See the AWS documentation website for more details](http://docs.aws.amazon.com/pt_br/emr/latest/ReleaseGuide/emr-hive-differences.html)

1. Selecione os valores conforme necessário e escolha **Create cluster (Criar cluster)**.

**Para passar valores variáveis para as etapas do Hive usando o AWS CLI**

Para passar valores variáveis para as etapas do Hive usando o AWS CLI, use o `--steps` parâmetro e inclua uma lista de argumentos.
+ 
**nota**  
Os caracteres de continuação de linha do Linux (\\) são incluídos para facilitar a leitura. Eles podem ser removidos ou usados ​​em comandos do Linux. No Windows, remova-os ou substitua-os por um sinal de interpolação (^).

  ```
  aws emr create-cluster --name "{{Test cluster}}" --release-label {{emr-7.13.0}} \
  --applications Name={{Hive}} Name={{Pig}} --use-default-roles --ec2-attributes KeyName={{myKey}} --instance-type {{m5.xlarge}} --instance-count {{3}} \
  --steps Type={{Hive}},Name="{{Hive Program}}",ActionOnFailure={{CONTINUE}},Args=[-f,{{s3://elasticmapreduce/samples/hive-ads/libs/response-time-stats.q}},-d,INPUT={{s3://elasticmapreduce/samples/hive-ads/tables}},-d,OUTPUT={{s3://amzn-s3-demo-bucket/hive-ads/output/}},-d,{{SAMPLE}}={{s3://elasticmapreduce/samples/hive-ads/}}]
  ```

  Para obter mais informações sobre o uso dos comandos do Amazon EMR no AWS CLI, consulte. [https://docs.aws.amazon.com/cli/latest/reference/emr](https://docs.aws.amazon.com/cli/latest/reference/emr)

**Para transmitir valores variáveis em etapas do Hive usando o SDK Java**
+ O exemplo a seguir demonstra como transmitir variáveis em etapas usando o SDK. Para obter mais informações, consulte [Classe StepFactory](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/elasticmapreduce/util/StepFactory.html) na *Referência AWS SDK para Java da API*. 

  ```
  StepFactory stepFactory = new StepFactory();
  
     StepConfig runHive = new StepConfig()
       .withName("Run Hive Script")
       .withActionOnFailure("TERMINATE_JOB_FLOW")
       .withHadoopJarStep(stepFactory.newRunHiveScriptStep(“s3://amzn-s3-demo-bucket/script.q”,
        Lists.newArrayList(“-d”,”LIB= s3://elasticmapreduce/samples/hive-ads/lib”));
  ```

### Consultas do Hive no Amazon EMR para acomodar esquemas parciais do DynamoDB
<a name="emr-hive-partial-schema"></a>

O Hive no Amazon EMR oferece a máxima flexibilidade na consulta a tabelas do DynamoDB ao permitir que você especifique um subconjunto de colunas no qual pode filtrar dados, em vez de exigir que sua consulta inclua todas as colunas. Essa técnica de consulta de esquema parcial é eficaz quando você tem uma esquema de banco de dados esparso e deseja filtrar registros com base em algumas colunas, por exemplo, em carimbos de data/hora. 

 O exemplo a seguir mostra como usar uma consulta do Hive para: 
+ Crie uma tabela do DynamoDB.
+ Selecione um subconjunto de itens (linhas) no DynamoDB e restrinja ainda mais os dados para determinadas colunas.
+ Copie os dados resultantes para o Amazon S3. 

```
DROP TABLE dynamodb; 
DROP TABLE s3;

CREATE EXTERNAL TABLE dynamodb(hashKey STRING, recordTimeStamp BIGINT, fullColumn map<String, String>)
    STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' 
    TBLPROPERTIES ( 
     "dynamodb.table.name" = "myTable",
     "dynamodb.throughput.read.percent" = ".1000", 
     "dynamodb.column.mapping" = "hashKey:HashKey,recordTimeStamp:RangeKey"); 

CREATE EXTERNAL TABLE s3(map<String, String>)
     ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' 
     LOCATION 's3://bucketname/path/subpath/';

INSERT OVERWRITE TABLE s3 SELECT item fullColumn FROM dynamodb WHERE recordTimeStamp < "2012-01-01";
```

A tabela a seguir mostra a sintaxe de consulta para a seleção de qualquer combinação de itens do DynamoDB.


| Exemplo de consulta | Descrição do resultado | 
| --- | --- | 
| SELECIONE \* DE{{table\_name}}; | Seleciona todos os itens (linhas) de uma determinada tabela e inclui dados de todas as colunas disponíveis para esses itens. | 
| SELECIONE \* DE {{table\_name}} ONDE {{field\_name}} ={{value}}; | Seleciona alguns itens (linhas) de uma determinada tabela e inclui dados de todas as colunas disponíveis para esses itens. | 
| SELECIONE{{column1\_name}},{{column2\_name}}, {{column3\_name}} DE{{table\_name}}; | Seleciona todos os itens (linhas) de uma determinada tabela e inclui dados de algumas colunas disponíveis para esses itens. | 
| SELECIONE{{column1\_name}},{{column2\_name}}, {{column3\_name}} DE {{table\_name}} ONDE {{field\_name}} ={{value}}; | Seleciona alguns itens (linhas) de uma determinada tabela e inclui dados de algumas colunas disponíveis para esses itens. | 

### Copiar dados entre tabelas do DynamoDB em diferentes regiões AWS
<a name="emr-hive-cross-region-ddb-copy"></a>

O Hive no Amazon EMR fornece uma propriedade `dynamodb.region` que você pode definir para cada tabela do DynamoDB. Quando `dynamodb.region` é definido de forma diferente em duas tabelas, quaisquer dados copiados entre as tabelas ocorrem automaticamente entre as regiões especificadas.

 O exemplo a seguir mostra como criar uma tabela do DynamoDB com um script do Hive que define a propriedade `dynamodb.region`:

**nota**  
As propriedades da região por tabela substituem as propriedades globais do Hive.

```
CREATE EXTERNAL TABLE dynamodb(hashKey STRING, recordTimeStamp BIGINT, map<String, String> fullColumn)
    STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' 
    TBLPROPERTIES ( 
     "dynamodb.table.name" = "myTable",
     "dynamodb.region" = "eu-west-1", 
     "dynamodb.throughput.read.percent" = ".1000", 
     "dynamodb.column.mapping" = "hashKey:HashKey,recordTimeStamp:RangeKey");
```

### Definir valores de throughput do DynamoDB por tabela
<a name="emr-hive-set-ddb-throughput"></a>

O Amazon EMR Hive permite que você defina o DynamoDB readThroughputPercent e writeThroughputPercent as configurações por tabela na definição da tabela. O script do Hive no Amazon EMR a seguir mostra como definir os valores de throughput. Para obter mais informações sobre valores de throughput do DynamoDB, consulte [Especificar requisitos de leitura e gravação para tabelas](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/WorkingWithDDTables.html#ProvisionedThroughput). 

```
CREATE EXTERNAL TABLE dynamodb(hashKey STRING, recordTimeStamp BIGINT, map<String, String> fullColumn)
    STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' 
    TBLPROPERTIES ( 
     "dynamodb.table.name" = "myTable",
     "dynamodb.throughput.read.percent" = ".4",
     "dynamodb.throughput.write.percent" = "1.0",
     "dynamodb.column.mapping" = "hashKey:HashKey,recordTimeStamp:RangeKey");
```