Uso de uma metastore externa do Hive - 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á.

Uso de uma metastore externa do Hive

Você pode configurar os trabalhos do Spark e do Hive no EMR Sem Servidor para se conectarem a uma metastore externa do Hive, como Amazon Aurora ou Amazon RDS para MySQL. Esta seção descreve como configurar uma metastore do Hive no Amazon RDS, uma VPC e trabalhos do EMR Sem Servidor para usar uma metastore externa.

Criação de uma metastore externa do Hive

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

  2. Crie sua aplicação do EMR Sem Servidor com a nova Amazon VPC e sub-redes privadas. Quando você configura a aplicação do EMR Sem Servidor com uma VPC, ela primeiro provisiona uma interface de rede elástica para cada sub-rede especificada. Em seguida, ela anexa o grupo de segurança especificado a essa interface de rede. Isso dá controle de acesso à aplicação. Para obter mais detalhes sobre como configurar a VPC, consulte Configuração do acesso à VPC para que aplicações do EMR Sem Servidor se conectem aos dados.

  3. Crie um banco de dados MySQL ou Aurora PostgreSQL em uma sub-rede privada na Amazon VPC. Para obter informações sobre como criar um banco de dados do Amazon RDS, consulte Criar uma instância de banco de dados do Amazon RDS.

  4. Modifique o grupo de segurança do banco de dados MySQL ou Aurora para permitir conexões JDBC do grupo de segurança do EMR Sem Servidor seguindo as etapas em Modificar uma instância de banco de dados do Amazon RDS. Adicione uma regra para tráfego de entrada ao grupo de segurança do RDS usando um dos grupos de segurança do EMR Sem Servidor.

    Tipo Protocolo Intervalo de portas Origem

    Todos os TCP

    TCP

    3306

    emr-serverless-security-group

Configurar opções do Spark

Uso do JDBC

Para configurar a aplicação do Spark no EMR Sem Servidor para se conectar a uma metastore do Hive baseada em uma instância do Amazon RDS para MySQL ou do Amazon Aurora MySQL, use uma conexão JDBC. Passe o mariadb-connector-java.jar com --jars nos parâmetros spark-submit da execução do 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 no 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()

Uso do serviço Thrift

Você pode configurar a aplicação do Hive no EMR Sem Servidor para se conectar a uma metastore do Hive com base em uma instância do Amazon RDS para MySQL ou do Amazon Aurora MySQL. Para fazer isso, execute um servidor do Thrift no nó principal de um cluster existente do Amazon EMR. Essa opção é ideal se você já tem um cluster do Amazon EMR com um servidor Thrift que deseja usar para simplificar as configurações de trabalho do 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 propriedade hive.metastore.uris precisa ser configurada para leitura em uma metastore externa 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()

Configuração de opções do Hive

Uso do JDBC

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

nota

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

Defina as configurações a seguir na classificação hive-site para ativar a metastore externa 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" } }

Uso de um servidor Thrift

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

Defina as configurações a seguir na classificação hive-site para que o EMR Sem Servidor possa acessar a metastore remota do Thrift. Observe que você deve definir a propriedade hive.metastore.uris para leitura em uma metastore externa 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" } }