Direkt zum Inhalt

Wie richte ich eine SSL-Verbindung zwischen Hive auf Amazon EMR und einem Metastore auf Amazon RDS für MySQL ein?

Lesedauer: 8 Minute
0

Ich möchte eine SSL-Verbindung zwischen Hive auf Amazon EMR und einem Metastore auf Amazon Relational Database Service (Amazon RDS) für MySQL einrichten.

Kurzbeschreibung

Verwende ein SSL-Zertifikat, um eine verschlüsselte Verbindung zwischen Hive und einem externen Metastore einzurichten. Du kannst eine SSL-Verbindung einrichten, sobald du einen neuen Amazon EMR-Cluster startest oder nachdem dieser bereits läuft.

Hinweis: Die folgenden Schritte wurden mit Amazon EMR Version 7.3.0 und Amazon RDS für MySQL Version 8.0.39 getestet.

Lösung

Hinweis: Wenn du beim Ausführen von AWS Command Line Interface (AWS CLI)-Befehlen Fehlermeldungen erhältst, findest du weitere Informationen dazu unter Problembehandlung bei der AWS CLI. Stelle außerdem sicher, dass du die neueste Version von AWS CLI verwendest.

Eine SSL-Verbindung auf einem neuen Amazon EMR-Cluster einrichten

Führe die folgenden Schritte aus:

  1. Um eine DB-Instance für Amazon RDS für MySQL zu erstellen, führe den folgenden Befehl create-db-instance aus:

    aws rds create-db-instance \
     --db-name hive \
     --db-instance-identifier example-db-instance-identifier \
     --db-instance-class db.c6gd.large \
     --engine mysql --engine-version 8.0.39 \
     --db-subnet-group-name example-subnet-group \
     --master-username example-rds-primary-user \
     --master-user-password example-rds-primary-password \
     --allocated-storage 200 \
     --storage-type gp3 \
     --vpc-security-group-ids example-rds-vpc-security-group

    **Hinweis:**Ersetze example-db-instance-identifier mit deiner DB-Instance-ID, example-subnet-group mit deinem Subnetz-Gruppennamen, example-rds-primary-user mit deinem primären Amazon RDS-Benutzernamen und example-rds-primary-password mit deinem primären Amazon RDS-Passwort. Ersetze außerdem example-rds-vpc-security-group mit deinem Sicherheitsgruppenname von Amazon Virtual Private Cloud (Amazon VPC).

  2. Stelle eine Verbindung zur DB-Instance von Amazon RDS für MySQL als primärer Benutzer her. Erstelle dann einen Benutzer für den Hive-Metastore:
    Hinweis: Vergewissere dich, dass du den Zugriff des primären Benutzers auf die DB-Instance beschränkst, die du zuvor erstellt hast.

    mysql -h example-rds-db-instance-endpoint -P 3306 -u example-rds-primary-user -p
    Enter password: example-rds-primary-password
    CREATE USER 'example-hive-username' IDENTIFIED BY 'example-hive-password' REQUIRE SSL;
    REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'example-hive-username';
    GRANT ALL PRIVILEGES ON hive.* TO 'example-hive-username';
    FLUSH PRIVILEGES;

    Hinweis: Ersetze example-rds-db-instance-endpoint mit deinem DB-Instance-Endpunkt von Amazon RDS, example-rds-primary-user mit deinem primären Amazon RDS-Benutzernamen und example-rds-primary-password mit deinem primären Amazon RDS-Passwort. Ersetze außerdem example-hive-username mit deinem Hive-Benutzernamen und example-hive-password mit deinem Passwort für example-hive-username.

  3. Erstelle eine JSON-Konfigurationsdatei, die der folgenden ähnelt:

    **Hinweis:**Verwende die folgende JSON-Datei, um den Amazon EMR-Cluster im nächsten Schritt zu starten. Die Datei ermöglicht es Hive, eine SSL-Verbindung zur DB-Instance von Amazon RDS herzustellen.

    [
        {
            "Classification": "hive-site",
            "Properties": {
                "javax.jdo.option.ConnectionURL": "jdbc:mysql://example-rds-db-instance-endpoint:3306/hive?createDatabaseIfNotExist=true&useSSL=true&serverSslCert=/home/hadoop/global-bundle.pem",
                "javax.jdo.option.ConnectionDriverName": "org.mariadb.jdbc.Driver",
                "javax.jdo.option.ConnectionUserName": "example-hive-username",
                "javax.jdo.option.ConnectionPassword": "example-hive-password"
            }
        }
    ]

    Hinweis: Ersetze example-rds-db-instance-endpoint mit deinem DB-Instance-Endpunkt von Amazon RDS, example-hive-username mit deinem Benutzernamen, den Hive für die Verbindung zur DB-Instance von Amazon RDS verwenden wird, und example-hive-password mit deinem Passwort für example-hive-username.

  4. Erstelle eine eingehende Regel in der Sicherheitsgruppe, die mit deiner Instance von Amazon RDS für MySQL verbunden ist, wie folgt:
    Wähle für Typ MySQL/Aurora (3306) aus.
    Für **Protokoll ** ist standardmäßig TCP (6) ausgewählt.
    Für Portbereich ist standardmäßig 3306 ausgewählt.
    Gib für Quelle die Gruppen-ID der von Amazon EMR verwalteten Sicherheitsgruppe ein, die mit dem Primärknoten verbunden ist.
    Hinweis: Durch diese Regel kann der Primärknoten des Amazon EMR-Clusters auf die Amazon RDS-Instance zugreifen. Weitere Informationen findest du unter Überblick über VPC-Sicherheitsgruppen.

  5. Erstelle die folgende Skriptdatei Bootstrap-Aktion. Lade diese dann in einen Amazon S3-Bucket hoch. Die Bootstrap-Aktion lädt das SSL-Zertifikat auf /home/hadoop/ auf dem Primärknoten herunter.

    #!/bin/bash
    if grep isMaster /mnt/var/lib/info/instance.json | grep false;
    then        
        echo "This is not primary node, do nothing, exiting"
        exit 0
    fi
    echo "This is primary, continuing to execute script"
    cd /home/hadoop
    wget -S -T 10 -t 5 https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem
  6. Um einen Amazon EMR-Cluster zu starten, führe den folgenden Befehl create-cluster mit der vorherigen JSON-Datei und der Bootstrap-Aktion aus:

    Beispiel:

    aws emr create-cluster \
     --name "EMR Hive Metastore SSL" \
     --log-uri $LOG_URI \
     --release-label "emr-7.3.0" \
     --service-role $EMRServiceRole \
     --ec2-attributes KeyName=$EC2_KEY_PAIR,InstanceProfile=$EMREC2Role,SubnetId=$EMR_SUBNET,EmrManagedSlaveSecurityGroup=$EMR_CORE_AND_TASK_VPC_SG,EmrManagedMasterSecurityGroup=$EMR_PRIMARY_VPC_SG \
     --applications Name=Hadoop Name=Hive \
     --bootstrap-actions Path=$BOOTSTRAP_ACTION_SCRIPT_PATH \
     --configurations file:///<Full-Path-To>/hive-ext-meta-mysql-ssl.json \
     --instance-groups '[{"InstanceCount":1,"InstanceGroupType":"CORE","Name":"Core","InstanceType":"m5.xlarge","EbsConfiguration":{"EbsBlockDeviceConfigs":[{"VolumeSpecification":{"VolumeType":"gp2","SizeInGB":32},"VolumesPerInstance":2}]}},{"InstanceCount":1,"InstanceGroupType":"MASTER","Name":"Primary","InstanceType":"m5.xlarge","EbsConfiguration":{"EbsBlockDeviceConfigs":[{"VolumeSpecification":{"VolumeType":"gp2","SizeInGB":32},"VolumesPerInstance":2}]}},{"InstanceCount":1,"InstanceGroupType":"TASK","Name":"Task - 1","InstanceType":"m5.xlarge","EbsConfiguration":{"EbsBlockDeviceConfigs":[{"VolumeSpecification":{"VolumeType":"gp2","SizeInGB":32},"VolumesPerInstance":2}]}}]'
  7. Verwende SSH, um eine Verbindung zum Primärknoten herzustellen.

  8. Öffne eine Hive-Sitzung auf dem Primärknoten. Erstelle dann eine Tabelle für Testzwecke.

    Beispiel:

    hive> create table tb_test (col1 STRING, col2 BIGINT);
    OK
    Time taken: 2.371 seconds
    hive> describe tb_test;
    OK
    col1                    string
    col2                    bigint
    Time taken: 0.254 seconds, Fetched: 2 row(s)
  9. Verwende den mysql-Client auf dem Primärknoten, um eine Verbindung mit dem Metastore von Amazon RDS für MySQL herzustellen. Überprüfe dann die Metadaten der Tabelle im Metastore. Wenn die Metadaten der Tabelle entsprechen, die du im vorherigen Schritt erstellt hast, funktioniert die SSL-Verbindung.

    Beispiel:

    mysql -h example-rds-db-instance-endpoint -P 3306 -u example-rds-primary-user -pEnter password: example-rds-primary-password
    
    mysql> use hive;
    Database changed
    
    mysql> select t1.OWNER, t1.TBL_NAME, t1.TBL_TYPE, s1.INPUT_FORMAT, s1.OUTPUT_FORMAT, s1.LOCATION from TBLS t1 inner join SDS s1 on s1.SD_ID = t1.SD_ID where t1.TBL_NAME = 'tb_test'\G
    *************************** 1. row ***************************
            OWNER: hadoop
         TBL_NAME: tb_test
         TBL_TYPE: MANAGED_TABLE
     INPUT_FORMAT: org.apache.hadoop.mapred.TextInputFormat
    OUTPUT_FORMAT: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
         LOCATION: hdfs://ip-xxx-xx-xx-xxx.ec2.internal:8020/user/hive/warehouse/tb_test
    1 row in set (0.23 sec)
    
    mysql> select t1.OWNER, t1.TBL_NAME, c1.COLUMN_NAME, c1.TYPE_NAME from TBLS t1 inner join SDS s1 on s1.SD_ID = t1.SD_ID inner join COLUMNS_V2 c1 on c1.CD_ID = s1.CD_ID where t1.TBL_NAME = 'tb_test';
    +--------+----------+-------------+-----------+
    | OWNER  | TBL_NAME | COLUMN_NAME | TYPE_NAME |
    +--------+----------+-------------+-----------+
    | hadoop | tb_test  | col1        | string    |
    | hadoop | tb_test  | col2        | bigint    |
    +--------+----------+-------------+-----------+
    2 rows in set (0.22 sec)

    Hinweis: Ersetze example-rds-db-instance-endpoint mit deinem DB-Instance-Endpunkt von Amazon RDS, example-rds-primary-user mit deinem primären Amazon RDS-Benutzernamen und example-rds-primary-password mit deinem primären Amazon RDS-Passwort.

Eine SSL-Verbindung auf einem laufenden Amazon EMR-Cluster einrichten

Hinweis: Stelle sicher, dass du eine DB-Instance von Amazon RDS für MySQL hast, bevor du beginnst.

  1. Verwende SSH, um eine Verbindung zum Primärknoten herzustellen..

  2. Lade das SSL-Zertifikat auf /home/hadoop/ auf dem Primärknoten herunter:

    cd /home/hadoop && wget -S -T 10 -t 5 https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem
  3. Füge dem Verzeichnis /etc/hive/conf.dist die folgenden Zeilen in der Datei hive-site.xml hinzu oder bearbeite sie:

    <property>
      <name>javax.jdo.option.ConnectionURL</name>
      <value>jdbc:mysql://example-rds-db-instance-endpoint:3306/hive?createDatabaseIfNotExist=true&amp;useSSL=true&amp;serverSslCert=/home/hadoop/global-bundle.pem</value>
      <description>example-rds-db-instance-endpoint</description>
    </property>
    
    <property>
        <name>javax.jdo.option.ConnectionUserName</name>
        <value>example-hive-username</value>
        <description>example-metastore-db-user</description>
    </property>
    
    <property>
        <name>javax.jdo.option.ConnectionPassword</name>
        <value>example-hive-password</value>
        <description>example-metastore-db-password</description>
    </property>

    Hinweis: Ersetze example-rds-db-instance-endpoint mit deinem DB-Instance-Endpunkt von Amazon RDS, example-hive-username mit deinem Benutzernamen, den Hive für die Verbindung zur DB-Instance von Amazon RDS verwenden wird, und example-hive-password mit deinem Passwort für example-hive-username. Außerdem ist das Und-Zeichen (&) ein Sonderzeichen in XML. Um ein Und-Zeichen in hive-site.xml zu verwenden, z. B. in der JDBC-Zeichenfolge, verwende & anstelle von &. Wenn du & nicht verwendest, erhältst du eine Fehlermeldung, wenn du den hive-hcatalog-server neu startest.

  4. Teste die SSL-Verbindung:

    mysql -h example-rds-db-instance-endpoint -P 3306 -u example-hive-username -p --ssl-ca /home/hadoop/global-bundle.pem
    Enter password: example-hive-password

    Hinweis: Ersetze example-rds-db-instance-endpoint mit deinem DB-Instance-Endpunkt von Amazon RDS, example-hive-username mit deinem Benutzernamen, den Hive für die Verbindung zur DB-Instance von Amazon RDS verwenden wird, und example-hive-password mit deinem Passwort für example-hive-username.

  5. Führe einen Neustart von hive-hcatalog-server auf dem Primärknoten durch.

  6. Bestätige, dass die Dienste erfolgreich neu gestartet wurden:

    sudo systemctl status hive-hcatalog-server.service
  7. Öffne eine Hive-Sitzung auf dem Primärknoten. Erstelle dann eine Tabelle für Testzwecke.

    Beispiel:

    hive> create table tb_test (col1 STRING, col2 BIGINT);OK
    Time taken: 2.371 seconds
    
    hive> describe tb_test;
    OK
    col1                    string
    col2                    bigint
    Time taken: 0.254 seconds, Fetched: 2 row(s)
  8. Verwende den mysql-Client auf dem Primärknoten, um eine Verbindung mit dem Metastore von Amazon RDS für MySQL herzustellen. Überprüfe dann die Metadaten der Tabelle im Metastore. Wenn die Metadaten der Tabelle entsprechen, die du im vorherigen Schritt erstellt hast, funktioniert die SSL-Verbindung.

    Beispiel:

    $ mysql -h example-rds-db-instance-endpoint -P 3306 -u example-rds-primary-user -p
    Enter password: example-rds-primary-password
    
    mysql> use hive;
    Database changed
    
    mysql> select t1.OWNER, t1.TBL_NAME, t1.TBL_TYPE, s1.INPUT_FORMAT, s1.OUTPUT_FORMAT, s1.LOCATION from TBLS t1 inner join SDS s1 on s1.SD_ID = t1.SD_ID where t1.TBL_NAME = 'tb_test'\G
    *************************** 1. row ***************************
            OWNER: hadoop
         TBL_NAME: tb_test
         TBL_TYPE: MANAGED_TABLE
     INPUT_FORMAT: org.apache.hadoop.mapred.TextInputFormat
    OUTPUT_FORMAT: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
         LOCATION: hdfs://ip-xxx-xx-xx-xxx.ec2.internal:8020/user/hive/warehouse/tb_test
    1 row in set (0.23 sec)
    
    mysql> select t1.OWNER, t1.TBL_NAME, c1.COLUMN_NAME, c1.TYPE_NAME from TBLS t1 inner join SDS s1 on s1.SD_ID = t1.SD_ID inner join COLUMNS_V2 c1 on c1.CD_ID = s1.CD_ID where t1.TBL_NAME = 'tb_test';
    +--------+----------+-------------+-----------+
    | OWNER  | TBL_NAME | COLUMN_NAME | TYPE_NAME |
    +--------+----------+-------------+-----------+
    | hadoop | tb_test  | col1        | string    |
    | hadoop | tb_test  | col2        | bigint    |
    +--------+----------+-------------+-----------+
    2 rows in set (0.22 sec)

    Hinweis: Ersetze example-rds-db-instance-endpoint mit deinem DB-Instance-Endpunkt von Amazon RDS, example-rds-primary-user mit deinem primären Amazon RDS-Benutzernamen und example-rds-primary-password mit deinem primären Amazon RDS-Passwort.

Fehler beim Neustarten von hive-hcatalog-server beheben

Wenn du versuchst, hive-hcatalog-server neu zu starten, erhältst du möglicherweise die folgende oder eine ähnliche Fehlermeldung:

„2020-08-20T14:18:50,750 WARN [main] org.apache.hadoop.hive.metastore.HiveMetaStore - Retrying creating default database after error: Unable to open a test connection to the given database. JDBC url = jdbc:mysql://mysql-hive-meta.########.us-east-1.rds.amazonaws.com:3306/hive?createDatabaseIfNotExist=true&useSSL=true&serverSSlCert=/home/hadoop/global-bundle.pem, username = masteruser. Terminating connection pool (set lazyInit to true if you expect to start your database after your app). Original Exception: ------java.sql.SQLException: Host '172.31.41.187' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'“

Dieser Fehler tritt auf, wenn die DB-Instance von Amazon RDS für MySQL aus Sicherheitsgründen den Primärknoten des Amazon EMR-Clusters blockiert. Führe die folgenden Schritte aus, um diesen Fehler zu beheben:

  1. Stelle eine Verbindung zu einem anderen lokalen Computer oder einer Instance von Amazon Elastic Compute Cloud (Amazon EC2) her, auf der das Tool mysqladmin installiert ist.
  2. Leere den Primärknoten aus der DB-Instance:
    mysqladmin -h example-rds-db-instance-endpoint -P 3306 -u example-rds-primary-username -p flush-hosts
    Enter password: example-rds-primary-password
    Hinweis: Ersetze example-rds-primary-username mit deinem primären Amazon RDS-Benutzernamen und example-rds-primary-password mit deinem primären Amazon RDS-Passwort.
  3. Starte den hive-hcatalog-server neu.

Ähnliche Informationen

Eine externe MySQL-Datenbank oder Amazon Aurora verwenden

AWS OFFICIALAktualisiert vor 10 Monaten