Externt Apache Hive-metaarkiv (äldre)
Den här artikeln beskriver hur du konfigurerar Azure Databricks-kluster för att ansluta till befintliga externa Apache Hive-metaarkiv. 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 finns i Känslighet för identifierarfall.
Kommentar
Att använda externa metaarkiv är en äldre 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?.
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>
där
<DNS name>
är servernamnet för Azure SQL Database.<port>
är databasens port.
Klusterkonfigurationer
Du måste ange 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
Ange spark.sql.hive.metastore.version
till versionen av hive-metaarkivet och spark.sql.hive.metastore.jars
på följande sätt:
Hive 0.13: ange
spark.sql.hive.metastore.jars
inte .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): inställt
spark.sql.hive.metastore.jars
påbuiltin
.För alla andra Hive-versioner rekommenderar Azure Databricks att du laddar ned metaarkivets JAR:er och ställer in konfigurationen
spark.sql.hive.metastore.jars
så att den pekar 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
inställt påmaven
ochspark.sql.hive.metastore.version
för att matcha versionen av metaarkivet.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.Ange att
spark.sql.hive.metastore.jars
ska använda den här katalogen. Om ditt init-skript kopierar/dbfs/hive_metastore_jar
till/databricks/hive_metastore_jars/
anger duspark.sql.hive.metastore.jars
som/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 anger 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
där
<mssql-connection-string>
är JDBC-niska veze (som du kan få i Azure-portalen). Du behöver inte inkludera användarnamn och lösenord i niska veze eftersom dessa anges 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 anger hive.metastore.schema.verification
till true
. Detta förhindrar att Hive-metaarkivklienten implicit ändrar metaarkivdatabasschemat 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 anger du
hive.metastore.schema.verification.record.version
tilltrue
aktiverahive.metastore.schema.verification
. - För Hive-metaarkivet 2.1.1 och senare anger du
hive.metastore.schema.verification.record.version
tilltrue
false
som standard.
Konfigurera ett externt metaarkiv med hjälp av användargränssnittet
Så här konfigurerar du 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.
Konfigurera 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 skapade metaarkivdatabasen och placera rätt databasnamn i JDBC-niska veze. 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 tabeller i metaarkivdatabasen automatiskt när det försöker komma åt dem men hittar dem inte.
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 metaarkivtabeller även om du har angett datanucleus.autoCreateSchema
till 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 har angett datanucleus.fixedDatastore
till 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ö.