Externe Apache Hive-metastore (verouderd)
In dit artikel wordt beschreven hoe u Azure Databricks-clusters instelt om verbinding te maken met bestaande externe Apache Hive-metastores. Het bevat informatie over aanbevolen configuratievereisten voor metastore en clusterconfiguratie, gevolgd door instructies voor het configureren van clusters om verbinding te maken met een externe metastore. Zie de relevante releaseopmerkingen van de Databricks Runtime-versie voor Hive-bibliotheekversies die zijn opgenomen in Databricks Runtime.
Belangrijk
- Hoewel SQL Server werkt als de onderliggende metastore-database voor Hive 2.0 en hoger, maken de voorbeelden in dit artikel gebruik van Azure SQL Database.
- Zie Externe metagegevensarchieven gebruiken in Azure HDInsight voor meer informatie over hive-metastorecompatibiliteit met HDInsight.
- Als u Azure Database for MySQL als een externe metastore gebruikt, moet u de waarde van de
lower_case_table_names
eigenschap wijzigen van 1 (de standaardinstelling) in 2 in de databaseconfiguratie aan de serverzijde. Zie Gevoeligheid voor id-hoofdletters voor meer informatie.
Notitie
Het gebruik van externe metastores is een verouderd gegevensbeheermodel. Databricks raadt u aan om een upgrade uit te voeren naar Unity Catalog. Unity Catalog vereenvoudigt de beveiliging en governance van uw gegevens door een centrale plaats te bieden voor het beheren en controleren van toegang tot gegevens in meerdere werkruimten in uw account. Bekijk Wat is Unity Catalog?
Installatie van Hive-metastore
De metastore-client die in een cluster wordt uitgevoerd, maakt rechtstreeks verbinding met uw onderliggende metastore-database met behulp van JDBC.
Als u de netwerkverbinding van een cluster naar de metastore wilt testen, kunt u de volgende opdracht uitvoeren in een notebook:
%sh
nc -vz <DNS name> <port>
waar
<DNS name>
is de servernaam van Azure SQL Database.<port>
is de poort van de database.
Clusterconfiguraties
U moet twee sets configuratieopties instellen om een cluster te verbinden met een externe metastore:
- Spark-opties configureren Spark met de Hive-metastoreversie en de JAR's voor de metastore-client.
- Hive-opties configureren de metastore-client om verbinding te maken met de externe metastore.
Spark-configuratieopties
Stel spark.sql.hive.metastore.version
deze in op de versie van uw Hive-metastore en spark.sql.hive.metastore.jars
ga als volgt te werk:
Hive 0.13: niet ingesteld
spark.sql.hive.metastore.jars
.Notitie
Hive 1.2.0 en 1.2.1 zijn niet de ingebouwde metastore op Databricks Runtime 7.0 en hoger. Als u Hive 1.2.0 of 1.2.1 wilt gebruiken met Databricks Runtime 7.0 en hoger, volgt u de procedure die wordt beschreven in De metastore-JAR's downloaden en wijst u deze aan.
Hive 2.3.7 (Databricks Runtime 7.0 - 9.x) of Hive 2.3.9 (Databricks Runtime 10.0 en hoger): ingesteld op
spark.sql.hive.metastore.jars
builtin
.Voor alle andere Hive-versies raadt Azure Databricks u aan de metastore-JAR's te downloaden en de configuratie
spark.sql.hive.metastore.jars
zo in te stellen dat deze verwijst naar de gedownloade JAR's met behulp van de procedure die wordt beschreven in De metastore-JAR's downloaden en ernaar verwijzen.
Download de metastore-JAR's en wijs ze aan
Maak een cluster met de set en
spark.sql.hive.metastore.version
maven
die overeenkomt metspark.sql.hive.metastore.jars
de versie van uw metastore.Wanneer het cluster wordt uitgevoerd, zoekt u in het stuurprogrammalogboek en zoekt u een regel zoals hieronder:
17/11/18 22:41:19 INFO IsolatedClientLoader: Downloaded metastore jars to <path>
De map
<path>
is de locatie van gedownloade JAR's in het stuurprogrammaknooppunt van het cluster.U kunt ook de volgende code uitvoeren in een Scala-notebook om de locatie van de JAR's af te drukken:
import com.typesafe.config.ConfigFactory val path = ConfigFactory.load().getString("java.io.tmpdir") println(s"\nHive JARs are downloaded to the path: $path \n")
Voer
%sh cp -r <path> /dbfs/hive_metastore_jar
deze map uit (vervang deze<path>
door de gegevens van uw cluster) om deze map te kopiëren naar een map in de DBFS-hoofdmap die via de DBFS-client in het stuurprogrammaknooppunt wordt aangeroepenhive_metastore_jar
.Maak een init-script dat naar het lokale bestandssysteem van het knooppunt kopieert
/dbfs/hive_metastore_jar
, en zorg ervoor dat het init-script enkele seconden in de slaapstand blijft voordat deze toegang krijgt tot de DBFS-client. Dit zorgt ervoor dat de client gereed is.Stel
spark.sql.hive.metastore.jars
in op het gebruik van deze map. Als uw init-script/dbfs/hive_metastore_jar
naar/databricks/hive_metastore_jars/
wordt gekopieerd, stelt uspark.sql.hive.metastore.jars
in op/databricks/hive_metastore_jars/*
. De locatie moet de volgtekens/*
bevatten.Start het cluster opnieuw op.
Hive-configuratieopties
In deze sectie worden opties beschreven die specifiek zijn voor Hive.
Als u verbinding wilt maken met een externe metastore met behulp van de lokale modus, stelt u de volgende Hive-configuratieopties in:
# JDBC connect string for a JDBC metastore
javax.jdo.option.ConnectionURL <mssql-connection-string>
# Username to use against metastore database
javax.jdo.option.ConnectionUserName <mssql-username>
# Password to use against metastore database
javax.jdo.option.ConnectionPassword <mssql-password>
# Driver class name for a JDBC metastore
javax.jdo.option.ConnectionDriverName com.microsoft.sqlserver.jdbc.SQLServerDriver
waar
<mssql-connection-string>
is de JDBC-verbindingsreeks (die u kunt ophalen in Azure Portal). U hoeft geen gebruikersnaam en wachtwoord op te nemen in de verbindingsreeks, omdat deze worden ingesteld doorjavax.jdo.option.ConnectionUserName
enjavax.jdo.option.ConnectionDriverName
.<mssql-username>
en<mssql-password>
geef de gebruikersnaam en het wachtwoord op van uw Azure SQL Database-account met lees-/schrijftoegang tot de database.
Notitie
Voor productieomgevingen wordt u aangeraden deze in te true
stellen hive.metastore.schema.verification
op . Hierdoor voorkomt u dat de Hive-metastore-client impliciet het metastore-databaseschema wijzigt wanneer de metastore-clientversie niet overeenkomt met de versie van de metastore-database. Wanneer u deze instelling inschakelt voor metastore-clientversies lager dan Hive 1.2.0, moet u ervoor zorgen dat de metastore-client over de schrijfmachtiging voor de metastore-database beschikt (om het probleem te voorkomen dat wordt beschreven in HIVE-9749).
- Voor Hive-metastore 1.2.0 en hoger moet
hive.metastore.schema.verification.record.version
u dittrue
inschakelenhive.metastore.schema.verification
. - Voor Hive-metastore 2.1.1 en hoger, ingesteld
hive.metastore.schema.verification.record.version
optrue
de standaardinstellingfalse
.
Een externe metastore instellen met behulp van de gebruikersinterface
Een externe metastore instellen met behulp van de Gebruikersinterface van Azure Databricks:
Klik op de knop Clusters op de zijbalk.
Klik op Cluster maken.
Voer de volgende Spark-configuratieopties in:
# Hive-specific configuration options. # spark.hadoop prefix is added to make sure these Hive specific options propagate to the metastore client. # JDBC connect string for a JDBC metastore spark.hadoop.javax.jdo.option.ConnectionURL <mssql-connection-string> # Username to use against metastore database spark.hadoop.javax.jdo.option.ConnectionUserName <mssql-username> # Password to use against metastore database spark.hadoop.javax.jdo.option.ConnectionPassword <mssql-password> # Driver class name for a JDBC metastore spark.hadoop.javax.jdo.option.ConnectionDriverName com.microsoft.sqlserver.jdbc.SQLServerDriver # Spark specific configuration options spark.sql.hive.metastore.version <hive-version> # Skip this one if <hive-version> is 0.13.x. spark.sql.hive.metastore.jars <hive-jar-source>
Ga door met de clusterconfiguratie en volg de instructies in de referentie voor compute-configuratie.
Klik op Cluster maken om het cluster te maken.
Een externe metastore instellen met behulp van een init-script
Met Init-scripts kunt u verbinding maken met een bestaande Hive-metastore zonder handmatig vereiste configuraties in te stellen.
- Maak de basismap waarin u het init-script wilt opslaan als het niet bestaat. In het volgende voorbeeld wordt gebruikgemaakt van
dbfs:/databricks/scripts
. - Voer het volgende codefragment uit in een notebook. Het fragment maakt het init-script
/databricks/scripts/external-metastore.sh
in Databricks File System (DBFS). U kunt ook de putbewerking van de DBFS REST API gebruiken om het init-script te maken. Dit init-script schrijft vereiste configuratieopties naar een configuratiebestand met de naam00-custom-spark.conf
in een JSON-achtige indeling binnen/databricks/driver/conf/
elk knooppunt van het cluster, wanneer een cluster met de naam die is opgegeven als<cluster-name>
begint. Azure Databricks biedt standaard Spark-configuraties in het/databricks/driver/conf/spark-branch.conf
bestand. Configuratiebestanden in de/databricks/driver/conf
map zijn van toepassing in omgekeerde alfabetische volgorde. Als u de naam van het00-custom-spark.conf
bestand wilt wijzigen, moet u ervoor zorgen dat het bestand van toepassing blijft vóór hetspark-branch.conf
bestand.
Scala
dbutils.fs.put(
"/databricks/scripts/external-metastore.sh",
"""#!/bin/sh
|# Loads environment variables to determine the correct JDBC driver to use.
|source /etc/environment
|# Quoting the label (i.e. EOF) with single quotes to disable variable interpolation.
|cat << 'EOF' > /databricks/driver/conf/00-custom-spark.conf
|[driver] {
| # Hive specific configuration options.
| # spark.hadoop prefix is added to make sure these Hive specific options will propagate to the metastore client.
| # JDBC connect string for a JDBC metastore
| "spark.hadoop.javax.jdo.option.ConnectionURL" = "<mssql-connection-string>"
|
| # Username to use against metastore database
| "spark.hadoop.javax.jdo.option.ConnectionUserName" = "<mssql-username>"
|
| # Password to use against metastore database
| "spark.hadoop.javax.jdo.option.ConnectionPassword" = "<mssql-password>"
|
| # Driver class name for a JDBC metastore
| "spark.hadoop.javax.jdo.option.ConnectionDriverName" = "com.microsoft.sqlserver.jdbc.SQLServerDriver"
|
| # Spark specific configuration options
| "spark.sql.hive.metastore.version" = "<hive-version>"
| # Skip this one if <hive-version> is 0.13.x.
| "spark.sql.hive.metastore.jars" = "<hive-jar-source>"
|}
|EOF
|""".stripMargin,
overwrite = true
)
Python
contents = """#!/bin/sh
# Loads environment variables to determine the correct JDBC driver to use.
source /etc/environment
# Quoting the label (i.e. EOF) with single quotes to disable variable interpolation.
cat << 'EOF' > /databricks/driver/conf/00-custom-spark.conf
[driver] {
# Hive specific configuration options.
# spark.hadoop prefix is added to make sure these Hive specific options will propagate to the metastore client.
# JDBC connect string for a JDBC metastore
"spark.hadoop.javax.jdo.option.ConnectionURL" = "<mssql-connection-string>"
# Username to use against metastore database
"spark.hadoop.javax.jdo.option.ConnectionUserName" = "<mssql-username>"
# Password to use against metastore database
"spark.hadoop.javax.jdo.option.ConnectionPassword" = "<mssql-password>"
# Driver class name for a JDBC metastore
"spark.hadoop.javax.jdo.option.ConnectionDriverName" = "com.microsoft.sqlserver.jdbc.SQLServerDriver"
# Spark specific configuration options
"spark.sql.hive.metastore.version" = "<hive-version>"
# Skip this one if <hive-version> is 0.13.x.
"spark.sql.hive.metastore.jars" = "<hive-jar-source>"
}
EOF
"""
dbutils.fs.put(
file = "/databricks/scripts/external-metastore.sh",
contents = contents,
overwrite = True
)
- Configureer uw cluster met het init-script.
- Start het cluster opnieuw op.
Probleemoplossing
Clusters worden niet gestart (vanwege onjuiste init-scriptinstellingen)
Als een init-script voor het instellen van de externe metastore ervoor zorgt dat het maken van clusters mislukt, configureert u het init-script om te registreren en fouten in het init-script op te sporen met behulp van de logboeken.
Fout in SQL-instructie: InvocationTargetException
Foutberichtpatroon in de volledige tracering van de uitzonderingsstack:
Caused by: javax.jdo.JDOFatalDataStoreException: Unable to open a test connection to the given database. JDBC url = [...]
Externe metastore JDBC-verbindingsgegevens zijn onjuist geconfigureerd. Controleer de geconfigureerde hostnaam, poort, gebruikersnaam, wachtwoord en JDBC-stuurprogrammaklassenaam. Zorg er ook voor dat de gebruikersnaam de juiste bevoegdheid heeft voor toegang tot de metastore-database.
Foutberichtpatroon in de volledige tracering van de uitzonderingsstack:
Required table missing : "`DBS`" in Catalog "" Schema "". DataNucleus requires this table to perform its persistence operations. [...]
Externe metastore-database is niet juist geïnitialiseerd. Controleer of u de metastore-database hebt gemaakt en plaats de juiste databasenaam in de JDBC-verbindingsreeks. Start vervolgens een nieuw cluster met de volgende twee Spark-configuratieopties:
datanucleus.schema.autoCreateTables true datanucleus.fixedDatastore false
Op deze manier probeert de Hive-clientbibliotheek automatisch tabellen te maken en te initialiseren in de metastore-database wanneer wordt geprobeerd om ze te openen, maar vindt ze afwezig.
Fout in SQL-instructie: AnalysisException: Kan org.apache.hadoop.hive.metastore.HiveMetastoreClient niet instantiëren
Foutbericht in de volledige uitzonderingsstacktrace:
The specified datastore driver (driver name) was not found in the CLASSPATH
Het cluster is geconfigureerd voor het gebruik van een onjuist JDBC-stuurprogramma.
Het instellen van datanucleus.autoCreateSchema op true werkt niet zoals verwacht
Databricks wordt standaard ook ingesteld datanucleus.fixedDatastore
true
op , waardoor onbedoelde structurele wijzigingen in de metastore-databases worden voorkomen. Daarom kan de Hive-clientbibliotheek geen metastore-tabellen maken, zelfs niet als u instelt op datanucleus.autoCreateSchema
true
. Deze strategie is over het algemeen veiliger voor productieomgevingen, omdat hiermee wordt voorkomen dat de metastore-database per ongeluk wordt bijgewerkt.
Als u wilt gebruiken datanucleus.autoCreateSchema
om de metastore-database te initialiseren, moet u deze instellen datanucleus.fixedDatastore
false
op . U kunt ook beide vlaggen spiegelen nadat u de metastore-database hebt geïnitialiseerd om uw productieomgeving beter te beveiligen.