Configuração do Metastore - Amazon EMR

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á.

Configuração do Metastore

Um metastore do Hive é um local centralizado que armazena informações estruturais sobre suas tabelas, incluindo esquemas, nomes de partições e tipos de dados. Com o EMR Serverless, você pode manter esses metadados da tabela em um metastore que tenha acesso aos seus trabalhos.

Você tem duas opções para uma metastore do Hive:

  • Catálogo de dados do AWS Glue

  • Uma metastore externa do Apache Hive

Usando o AWS Glue Data Catalog como metastore

Você pode configurar suas tarefas do Spark e do Hive para usar o AWS Glue Data Catalog como seu metastore. Recomendamos essa configuração quando você precisa de um metastore persistente ou compartilhado por diferentes aplicativos, serviços ou. Contas da AWS Para obter mais informações sobre o catálogo de dados, consulte Preenchendo o catálogo de dados do AWS Glue. Para obter informações sobre os preços do AWS Glue, consulte Preços do AWS Glue.

Você pode configurar sua tarefa EMR sem servidor para usar o AWS Glue Data Catalog no Conta da AWS mesmo aplicativo ou em um diferente. Conta da AWS

Configurar o catálogo de dados AWS Glue

Para configurar o Catálogo de Dados, escolha o tipo de aplicativo EMR sem servidor que você deseja usar.

Spark

Quando você usa o EMR Studio para executar seus trabalhos com aplicativos Spark EMR sem servidor, o AWS Glue Data Catalog é o metastore padrão.

Ao usar SDKs ou AWS CLI, você pode definir a spark.hadoop.hive.metastore.client.factory.class configuração com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory nos sparkSubmit parâmetros da execução do seu trabalho. O exemplo a seguir mostra como configurar o Catálogo de Dados com AWS CLI o.

aws emr-serverless start-job-run \ --application-id application-id \ --execution-role-arn job-role-arn \ --job-driver '{ "sparkSubmit": { "entryPoint": "s3://amzn-s3-demo-bucket/code/pyspark/extreme_weather.py", "sparkSubmitParameters": "--conf spark.hadoop.hive.metastore.client.factory.class=com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory --conf spark.driver.cores=1 --conf spark.driver.memory=3g --conf spark.executor.cores=4 --conf spark.executor.memory=3g" } }'

Como alternativa, você pode definir essa configuração ao criar uma nova SparkSession no seu código do Spark.

from pyspark.sql import SparkSession spark = ( SparkSession.builder.appName("SparkSQL") .config( "spark.hadoop.hive.metastore.client.factory.class", "com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory", ) .enableHiveSupport() .getOrCreate() ) # we can query tables with SparkSQL spark.sql("SHOW TABLES").show() # we can also them with native Spark print(spark.catalog.listTables())
Hive

Para aplicativos EMR Serverless Hive, o Catálogo de Dados é o metastore padrão. Ou seja, quando você executa trabalhos em um aplicativo EMR Serverless Hive, o Hive registra as informações do metastore no Catálogo de Dados da mesma forma que seu aplicativo. Conta da AWS Você não precisa de uma nuvem privada virtual (VPC) para usar o Catálogo de Dados como seu metastore.

Para acessar as tabelas do metastore do Hive, adicione as políticas necessárias do AWS Glue descritas em Configurando permissões IAM para o Glue. AWS

Configure o acesso entre contas para EMR Serverless e Glue Data Catalog AWS

Para configurar o acesso entre contas para o EMR Serverless, você deve primeiro fazer login no seguinte: Contas da AWS

  • AccountA— E Conta da AWS onde você criou um aplicativo EMR sem servidor.

  • AccountB— Um Conta da AWS que contém um AWS Glue Data Catalog que você deseja que suas execuções EMR sem servidor acessem.

  1. Certifique-se de que um administrador ou outra identidade autorizada AccountB anexe uma política de recursos ao Catálogo de Dados emAccountB. Essa política concede permissões AccountA específicas entre contas para realizar operações em recursos no AccountB catálogo.

    { "Version" : "2012-10-17", "Statement" : [ { "Effect" : "Allow", "Principal": { "AWS": [ "arn:aws:iam::accountA:role/job-runtime-role-A" ]}, "Action" : [ "glue:GetDatabase", "glue:CreateDatabase", "glue:GetDataBases", "glue:CreateTable", "glue:GetTable", "glue:UpdateTable", "glue:DeleteTable", "glue:GetTables", "glue:GetPartition", "glue:GetPartitions", "glue:CreatePartition", "glue:BatchCreatePartition", "glue:GetUserDefinedFunctions" ], "Resource": ["arn:aws:glue:region:AccountB:catalog"] } ] }
  2. Adicione uma IAM política à função de tempo de execução do trabalho EMR sem servidor AccountA para que essa função possa acessar os recursos do Catálogo de Dados em. AccountB

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "glue:GetDatabase", "glue:CreateDatabase", "glue:GetDataBases", "glue:CreateTable", "glue:GetTable", "glue:UpdateTable", "glue:DeleteTable", "glue:GetTables", "glue:GetPartition", "glue:GetPartitions", "glue:CreatePartition", "glue:BatchCreatePartition", "glue:GetUserDefinedFunctions" ], "Resource": ["arn:aws:glue:region:AccountB:catalog"] } ] }
  3. Comece sua execução de trabalhos. Essa etapa é um pouco diferente dependendo AccountA do tipo de aplicativo EMR sem servidor.

    Spark

    Defina a spark.hadoop.hive.metastore.glue.catalogid propriedade na hive-site classificação conforme mostrado no exemplo a seguir. Substituir ID do catálogo da conta com o ID do catálogo de dados emAccountB.

    aws emr-serverless start-job-run \ --application-id "application-id" \ --execution-role-arn "job-role-arn" \ --job-driver '{ "sparkSubmit": { "query": "s3://amzn-s3-demo-bucket/hive/scripts/create_table.sql", "parameters": "--hiveconf hive.exec.scratchdir=s3://amzn-s3-demo-bucket/hive/scratch --hiveconf hive.metastore.warehouse.dir=s3://amzn-s3-demo-bucket/hive/warehouse" } }' \ --configuration-overrides '{ "applicationConfiguration": [{ "classification": "hive-site", "properties": { "spark.hadoop.hive.metastore.glue.catalogid": "AccountB-catalog-id" } }] }'
    Hive

    Defina a hive.metastore.glue.catalogid propriedade na hive-site classificação conforme mostrado no exemplo a seguir. Substituir ID do catálogo da conta com o ID do catálogo de dados emAccountB.

    aws emr-serverless start-job-run \ --application-id "application-id" \ --execution-role-arn "job-role-arn" \ --job-driver '{ "hive": { "query": "s3://amzn-s3-demo-bucket/hive/scripts/create_table.sql", "parameters": "--hiveconf hive.exec.scratchdir=s3://amzn-s3-demo-bucket/hive/scratch --hiveconf hive.metastore.warehouse.dir=s3://amzn-s3-demo-bucket/hive/warehouse" } }' \ --configuration-overrides '{ "applicationConfiguration": [{ "classification": "hive-site", "properties": { "hive.metastore.glue.catalogid": "AccountB-catalog-id" } }] }'

Considerações ao usar o AWS Glue Data Catalog

Você pode adicionar auxiliares JARs ADD JAR em seus scripts do Hive. Para considerações adicionais, consulte Considerações ao usar o AWS Glue Data Catalog.

Usando uma metastore externa do Hive

Você pode configurar suas tarefas EMR Serverless Spark e Hive para se conectarem a um metastore externo do Hive, como Amazon Aurora ou Amazon for My. RDS SQL Esta seção descreve como configurar um metastore Amazon RDS Hive, configurar seus trabalhos sem servidor e configurar seus VPC trabalhos EMR sem servidor para usar um metastore externo.

Crie uma metastore externa do Hive

  1. Crie uma Amazon Virtual Private Cloud (AmazonVPC) com sub-redes privadas seguindo as instruções em Criar uma. VPC

  2. Crie seu aplicativo EMR Serverless com sua nova Amazon VPC e sub-redes privadas. Quando você configura seu aplicativo EMR Serverless com umVPC, ele primeiro provisiona uma interface de rede elástica para cada sub-rede especificada. Em seguida, ele anexa o grupo de segurança especificado a essa interface de rede. Isso dá controle de acesso ao seu aplicativo. Para obter mais detalhes sobre como configurar seuVPC, consulteConfigurando o acesso VPC.

  3. Crie um SQL banco de dados My SQL ou Aurora Postgre em uma sub-rede privada na sua Amazon. VPC Para obter informações sobre como criar um RDS banco de dados da Amazon, consulte Criação de uma RDS instância de banco de dados da Amazon.

  4. Modifique o grupo de segurança do seu banco de dados My SQL ou Aurora para permitir JDBC conexões do seu grupo de segurança EMR sem servidor seguindo as etapas em Modificar uma instância de banco de dados Amazon. RDS Adicione uma regra para tráfego de entrada para o grupo de RDS segurança de um dos seus grupos de segurança EMR sem servidor.

    Tipo Protocolo Intervalo de portas Origem

    Tudo TCP

    TCP

    3306

    emr-serverless-security-group

Configurar as opções do Spark

Usando JDBC

Para configurar seu aplicativo EMR Serverless Spark para se conectar a um metastore Hive baseado em uma instância Amazon for RDS My ou SQL Amazon Aurora My, use uma conexão. SQL JDBC Passe o mariadb-connector-java.jar with --jars nos spark-submit parâmetros da execução do seu trabalho.

aws emr-serverless start-job-run \ --application-id "application-id" \ --execution-role-arn "job-role-arn" \ --job-driver '{ "sparkSubmit": { "entryPoint": "s3://amzn-s3-demo-bucket/scripts/spark-jdbc.py", "sparkSubmitParameters": "--jars s3://amzn-s3-demo-bucket/mariadb-connector-java.jar --conf spark.hadoop.javax.jdo.option.ConnectionDriverName=org.mariadb.jdbc.Driver --conf spark.hadoop.javax.jdo.option.ConnectionUserName=<connection-user-name> --conf spark.hadoop.javax.jdo.option.ConnectionPassword=<connection-password> --conf spark.hadoop.javax.jdo.option.ConnectionURL=<JDBC-Connection-string> --conf spark.driver.cores=2 --conf spark.executor.memory=10G --conf spark.driver.memory=6G --conf spark.executor.cores=4" } }' \ --configuration-overrides '{ "monitoringConfiguration": { "s3MonitoringConfiguration": { "logUri": "s3://amzn-s3-demo-bucket/spark/logs/" } } }'

O exemplo de código a seguir é um script de ponto de entrada do Spark que interage com uma metastore do Hive na Amazon. RDS

from os.path import expanduser, join, abspath from pyspark.sql import SparkSession from pyspark.sql import Row # warehouse_location points to the default location for managed databases and tables warehouse_location = abspath('spark-warehouse') spark = SparkSession \ .builder \ .config("spark.sql.warehouse.dir", warehouse_location) \ .enableHiveSupport() \ .getOrCreate() spark.sql("SHOW DATABASES").show() spark.sql("CREATE EXTERNAL TABLE `sampledb`.`sparknyctaxi`(`dispatching_base_num` string, `pickup_datetime` string, `dropoff_datetime` string, `pulocationid` bigint, `dolocationid` bigint, `sr_flag` bigint) STORED AS PARQUET LOCATION 's3://<s3 prefix>/nyctaxi_parquet/'") spark.sql("SELECT count(*) FROM sampledb.sparknyctaxi").show() spark.stop()

Usando o serviço de economia

Você pode configurar seu aplicativo EMR Serverless Hive para se conectar a um metastore do Hive com base em uma instância Amazon for RDS My ou SQL Amazon Aurora My. SQL Para fazer isso, execute um servidor econômico no nó principal de um EMR cluster existente da Amazon. Essa opção é ideal se você já tem um EMR cluster da Amazon com um servidor econômico que deseja usar para simplificar suas configurações de trabalho EMR sem servidor.

aws emr-serverless start-job-run \ --application-id "application-id" \ --execution-role-arn "job-role-arn" \ --job-driver '{ "sparkSubmit": { "entryPoint": "s3://amzn-s3-demo-bucket/thriftscript.py", "sparkSubmitParameters": "--jars s3://amzn-s3-demo-bucket/mariadb-connector-java.jar --conf spark.driver.cores=2 --conf spark.executor.memory=10G --conf spark.driver.memory=6G --conf spark.executor.cores=4" } }' \ --configuration-overrides '{ "monitoringConfiguration": { "s3MonitoringConfiguration": { "logUri": "s3://amzn-s3-demo-bucket/spark/logs/" } } }'

O exemplo de código a seguir é um script de ponto de entrada (thriftscript.py) que usa o protocolo Thrift para se conectar a uma metastore do Hive. Observe que a hive.metastore.uris propriedade precisa ser configurada para ser lida em um metastore externo do Hive.

from os.path import expanduser, join, abspath from pyspark.sql import SparkSession from pyspark.sql import Row # warehouse_location points to the default location for managed databases and tables warehouse_location = abspath('spark-warehouse') spark = SparkSession \ .builder \ .config("spark.sql.warehouse.dir", warehouse_location) \ .config("hive.metastore.uris","thrift://thrift-server-host:thift-server-port") \ .enableHiveSupport() \ .getOrCreate() spark.sql("SHOW DATABASES").show() spark.sql("CREATE EXTERNAL TABLE sampledb.`sparknyctaxi`( `dispatching_base_num` string, `pickup_datetime` string, `dropoff_datetime` string, `pulocationid` bigint, `dolocationid` bigint, `sr_flag` bigint) STORED AS PARQUET LOCATION 's3://<s3 prefix>/nyctaxi_parquet/'") spark.sql("SELECT * FROM sampledb.sparknyctaxi").show() spark.stop()

Configurar as opções do Hive

Usando JDBC

Se você quiser especificar a localização de um banco de dados externo do Hive em uma instância do Amazon RDS My SQL ou do Amazon Aurora, você pode substituir a configuração padrão do metastore.

nota

No Hive, você pode realizar várias gravações em tabelas do metastore ao mesmo tempo. Se você compartilhar informações de metastore entre dois trabalhos, certifique-se de não gravar na mesma tabela de metastore simultaneamente, a menos que grave em partições diferentes da mesma tabela de metastore.

Defina as seguintes configurações na hive-site classificação para ativar o metastore externo do Hive.

{ "classification": "hive-site", "properties": { "hive.metastore.client.factory.class": "org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClientFactory", "javax.jdo.option.ConnectionDriverName": "org.mariadb.jdbc.Driver", "javax.jdo.option.ConnectionURL": "jdbc:mysql://db-host:db-port/db-name", "javax.jdo.option.ConnectionUserName": "username", "javax.jdo.option.ConnectionPassword": "password" } }

Usando um servidor econômico

Você pode configurar seu aplicativo EMR Serverless Hive para se conectar a um metastore do Hive baseado em um Amazon for RDS My ou SQL Amazon Aurora M. ySQLinstance Para fazer isso, execute um servidor econômico no nó principal de um EMR cluster existente da Amazon. Essa opção é ideal se você já tem um EMR cluster da Amazon que executa um servidor econômico e deseja usar suas configurações de trabalho EMR sem servidor.

Defina as seguintes configurações na hive-site classificação para que o EMR Serverless possa acessar o metastore remoto do Thrift. Observe que você deve definir a hive.metastore.uris propriedade para ser lida em um metastore externo do Hive.

{ "classification": "hive-site", "properties": { "hive.metastore.client.factory.class": "org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClientFactory", "hive.metastore.uris": "thrift://thrift-server-host:thirft-server-port" } }

Considerações ao usar um metastore externo

  • Você pode configurar bancos de dados compatíveis com o MariaDB como sua JDBC metastore. Exemplos desses bancos de dados são RDS para MariaDB, SQL My e Amazon Aurora.

  • As metástores não são inicializadas automaticamente. Se sua metastore não for inicializada com um esquema para sua versão do Hive, use a Hive Schema Tool.

  • EMRO Serverless não oferece suporte à autenticação Kerberos. Você não pode usar um servidor de metastore econômico com autenticação Kerberos com tarefas EMR Serverless Spark ou Hive.