Externt Apache Hive-metaarkiv (äldre)
Viktigt!
Den här dokumentationen har dragits tillbaka och kanske inte uppdateras.
Kommentar
Att använda externa metastores är en traditionell datastyrningsmodell. Databricks rekommenderar att du uppgraderar till Unity Catalog. Unity Catalog förenklar säkerheten och styrningen av dina data genom att tillhandahålla en central plats för att administrera och granska dataåtkomst över flera arbetsytor i ditt konto. Se Vad är Unity Catalog?.
Den här artikeln beskriver hur du set upp Azure Databricks-kluster för att ansluta till befintliga externa Apache Hive-metastores. Den innehåller information om rekommenderade konfigurationskrav för metaarkiv och klusterkonfiguration, följt av instruktioner för att konfigurera kluster för att ansluta till ett externt metaarkiv. Information om Hive-biblioteksversioner som ingår i Databricks Runtime finns i relevanta viktig information om Databricks Runtime-versionen.
Viktigt!
- Sql Server fungerar som den underliggande metaarkivdatabasen för Hive 2.0 och senare, men exemplen i den här artikeln använder Azure SQL Database.
- Information om Hive-metaarkivkompatibilitet med HDInsight finns i Använda externa metadatalager i Azure HDInsight.
- Om du använder Azure Database for MySQL som ett externt metaarkiv måste du ändra värdet
lower_case_table_names
för egenskapen från 1 (standard) till 2 i databaskonfigurationen på serversidan. Mer information om skiftlägeskänslighet finns i Identifier.
Konfiguration av Hive-metaarkiv
Metaarkivklienten som körs i ett kluster ansluter till din underliggande metaarkivdatabas direkt med JDBC.
Om du vill testa nätverksanslutningen från ett kluster till metaarkivet kan du köra följande kommando i en notebook-fil:
%sh
nc -vz <DNS name> <port>
where
-
<DNS name>
är servernamnet för Azure SQL Database. -
<port>
är databasens port.
Klusterkonfigurationer
Du måste set två uppsättningar konfigurationsalternativ för att ansluta ett kluster till ett externt metaarkiv:
- Spark-alternativ konfigurerar Spark med Hive-metaarkivversionen och JAR:erna för metaarkivklienten.
- Hive-alternativ konfigurerar metaarkivklienten för att ansluta till det externa metaarkivet.
Konfigurationsalternativ för Spark
Set
spark.sql.hive.metastore.version
för versionen av ditt Hive metastore och spark.sql.hive.metastore.jars
enligt följande:
Hive 0.13: inte set
spark.sql.hive.metastore.jars
.Kommentar
Hive 1.2.0 och 1.2.1 är inte det inbyggda metaarkivet på Databricks Runtime 7.0 och senare. Om du vill använda Hive 1.2.0 eller 1.2.1 med Databricks Runtime 7.0 och senare följer du proceduren som beskrivs i Ladda ned metaarkivburkarna och peka på dem.
Hive 2.3.7 (Databricks Runtime 7.0–9.x) eller Hive 2.3.9 (Databricks Runtime 10.0 och senare): set
spark.sql.hive.metastore.jars
tillbuiltin
.För alla andra Hive-versioner rekommenderar Azure Databricks att du laddar ned metaarkivets JAR:er och set konfigurationen
spark.sql.hive.metastore.jars
att peka på de nedladdade JAR:erna med hjälp av proceduren som beskrivs i Ladda ned metaarkivburkarna och peka på dem.
Ladda ned metaarkivsburkarna och peka på dem
Skapa ett kluster med
spark.sql.hive.metastore.jars
set tillmaven
ochspark.sql.hive.metastore.version
för att matcha versionen av ditt metadatalager.När klustret körs söker du i drivrutinsloggen och hittar en rad som liknar följande:
17/11/18 22:41:19 INFO IsolatedClientLoader: Downloaded metastore jars to <path>
Katalogen
<path>
är platsen för nedladdade JAR:er i drivrutinsnoden i klustret.Du kan också köra följande kod i en Scala-anteckningsbok för att skriva ut platsen för JAR:erna:
import com.typesafe.config.ConfigFactory val path = ConfigFactory.load().getString("java.io.tmpdir") println(s"\nHive JARs are downloaded to the path: $path \n")
Kör
%sh cp -r <path> /dbfs/hive_metastore_jar
(ersätt<path>
med klustrets information) för att kopiera den här katalogen till en katalog i DBFS-roten som anropashive_metastore_jar
via DBFS-klienten i drivrutinsnoden.Skapa ett init-skript som kopierar till nodens
/dbfs/hive_metastore_jar
lokala filsystem och se till att init-skriptet viloläge några sekunder innan det kommer åt DBFS-klienten. Detta säkerställer att klienten är klar.Set
spark.sql.hive.metastore.jars
för att använda den här katalogen. Om ditt init-skript kopierar/dbfs/hive_metastore_jar
till/databricks/hive_metastore_jars/
och setochspark.sql.hive.metastore.jars
till/databricks/hive_metastore_jars/*
. Platsen måste innehålla det avslutande/*
.Starta om klustret.
Konfigurationsalternativ för Hive
I det här avsnittet beskrivs alternativ som är specifika för Hive.
Om du vill ansluta till ett externt metaarkiv med lokalt läge set du följande Konfigurationsalternativ för Hive:
# 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
where
-
<mssql-connection-string>
är JDBC-anslutningssträngen (som du kan get i Azure-portalen). Du behöver inte inkludera användarnamn och lösenord i anslutningssträngen eftersom dessa kommer att vara set avjavax.jdo.option.ConnectionUserName
ochjavax.jdo.option.ConnectionDriverName
. -
<mssql-username>
och<mssql-password>
ange användarnamnet och lösenordet för ditt Azure SQL Database-konto som har läs- och skrivåtkomst till databasen.
Kommentar
För produktionsmiljöer rekommenderar vi att du sethive.metastore.schema.verification
true
. Detta förhindrar att Hive-metaarkivklienten implicit ändrar metaarkivdatabasen schema när metaarkivklientversionen inte matchar metaarkivdatabasversionen. När du aktiverar den här inställningen för metaarkivklientversioner som är lägre än Hive 1.2.0 kontrollerar du att metaarkivklienten har skrivbehörighet till metaarkivdatabasen (för att förhindra problemet som beskrivs i HIVE-9749).
- För Hive-metaarkivet 1.2.0 och senare, set
hive.metastore.schema.verification.record.version
tilltrue
för att aktiverahive.metastore.schema.verification
. - För Hive-metaarkivet 2.1.1 och senare, set
hive.metastore.schema.verification.record.version
tilltrue
eftersom det är set tillfalse
som standard.
Set sätt upp en extern metadatabutik med hjälp av användargränssnittet
Så här set du upp ett externt metaarkiv med hjälp av Azure Databricks-användargränssnittet:
Klicka på knappen Kluster i sidofältet.
Klicka på Skapa kluster.
Ange följande Konfigurationsalternativ för Spark:
# 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>
Fortsätt konfigurationen av klustret genom att följa anvisningarna i referensen för beräkningskonfiguration.
Klicka på Skapa kluster för att skapa klustret.
Set upp ett externt metaarkiv med hjälp av ett init-skript
Med Init-skript kan du ansluta till ett befintligt Hive-metaarkiv utan att manuellt ange nödvändiga konfigurationer.
- Skapa den baskatalog som du vill lagra init-skriptet i om det inte finns. I följande exempel används
dbfs:/databricks/scripts
. - Kör följande kodfragment i en notebook-fil. Kodfragmentet skapar init-skriptet
/databricks/scripts/external-metastore.sh
i Databricks File System (DBFS). Du kan också använda DBFS REST API:ets put-åtgärd för att skapa init-skriptet. Det här init-skriptet skriver nödvändiga konfigurationsalternativ till en konfigurationsfil med namnet00-custom-spark.conf
i ett JSON-liknande format under/databricks/driver/conf/
varje nod i klustret, när ett kluster med det namn som anges som<cluster-name>
startar. Azure Databricks tillhandahåller standardkonfigurationer för Spark i/databricks/driver/conf/spark-branch.conf
filen. Konfigurationsfiler i/databricks/driver/conf
katalogen gäller i omvänd alfabetisk ordning. Om du vill ändra namnet på filen kontrollerar du att den00-custom-spark.conf
fortsätter att gälla förespark-branch.conf
filen.
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
)
- Konfigurera klustret med init-skriptet.
- Starta om klustret.
Felsökning
Kluster startar inte (på grund av felaktiga init-skriptinställningar)
Om ett init-skript för att konfigurera det externa metaarkivet gör att klusterskapandet misslyckas konfigurerar du init-skriptet för att logga och felsöker init-skriptet med hjälp av loggarna.
Fel i SQL-instruktion: InvocationTargetException
Felmeddelandemönster i den fullständiga undantagsstackspårningen:
Caused by: javax.jdo.JDOFatalDataStoreException: Unable to open a test connection to the given database. JDBC url = [...]
JDBC-anslutningsinformation för externt metaarkiv är felkonfigurerad. Kontrollera det konfigurerade värdnamnet, porten, användarnamnet, lösenordet och JDBC-drivrutinsklassnamnet. Kontrollera även att användarnamnet har rätt behörighet att komma åt metaarkivdatabasen.
Felmeddelandemönster i den fullständiga undantagsstackspårningen:
Required table missing : "`DBS`" in Catalog "" Schema "". DataNucleus requires this table to perform its persistence operations. [...]
Den externa metaarkivdatabasen har inte initierats korrekt. Kontrollera att du har skapat metaarkivdatabasen och placera rätt databasnamn i JDBC-anslutningssträng. Starta sedan ett nytt kluster med följande två Spark-konfigurationsalternativ:
datanucleus.schema.autoCreateTables true datanucleus.fixedDatastore false
På så sätt försöker Hive-klientbiblioteket skapa och initiera tables i metaarkivdatabasen automatiskt när det försöker komma åt dem men hittar dem frånvarande.
Fel i SQL-instruktion: AnalysisException: Det går inte att instansiera org.apache.hadoop.hive.metastore.HiveMetastoreClient
Felmeddelande i den fullständiga undantagsstacken:
The specified datastore driver (driver name) was not found in the CLASSPATH
Klustret är konfigurerat för att använda en felaktig JDBC-drivrutin.
Att ange datanucleus.autoCreateSchema till true fungerar inte som förväntat
Som standard anger datanucleus.fixedDatastore
Databricks också till true
, vilket förhindrar oavsiktliga strukturella ändringar i metaarkivdatabaserna. Hive-klientbiblioteket kan därför inte skapa metastore tables även om du setdatanucleus.autoCreateSchema
att true
. Den här strategin är i allmänhet säkrare för produktionsmiljöer eftersom den förhindrar att metaarkivdatabasen av misstag uppgraderas.
Om du vill använda datanucleus.autoCreateSchema
för att initiera metaarkivdatabasen kontrollerar du att du setdatanucleus.fixedDatastore
för att false
. Du kanske också vill vända båda flaggorna när du har initierat metaarkivdatabasen för att ge bättre skydd för din produktionsmiljö.