Ich verwende HiveContext mit SparkSQL und versuche, eine Verbindung zu einem entfernten Hive-Metastore herzustellen. Die einzige Möglichkeit, den Hive-Metastore festzulegen, besteht darin, die Hive-site.xml-Datei in den Klassenpfad aufzunehmen (oder in/etc/spark/conf /).
Gibt es eine Möglichkeit, diesen Parameter programmgesteuert in einem Java-Code festzulegen, ohne die Hive-site.xml einzuschließen? Wenn ja, was soll die Spark-Konfiguration verwenden?
Für Spark 1.x können Sie Folgendes einstellen:
System.setProperty("Hive.metastore.uris", "thrift://METASTORE:9083");
final SparkConf conf = new SparkConf();
SparkContext sc = new SparkContext(conf);
HiveContext hiveContext = new HiveContext(sc);
Oder
final SparkConf conf = new SparkConf();
SparkContext sc = new SparkContext(conf);
HiveContext hiveContext = new HiveContext(sc);
hiveContext.setConf("Hive.metastore.uris", "thrift://METASTORE:9083");
Update Wenn dein Hive kerberisiert ist :
Setzen Sie diese Einstellungen, bevor Sie den HiveContext erstellen:
System.setProperty("Hive.metastore.sasl.enabled", "true");
System.setProperty("Hive.security.authorization.enabled", "false");
System.setProperty("Hive.metastore.kerberos.principal", hivePrincipal);
System.setProperty("Hive.metastore.execute.setugi", "true");
In spark 2.0. + Sollte es ungefähr so aussehen:
Vergessen Sie nicht, "Hive.metastore.uris" durch Ihre zu ersetzen. Diese Angenommen, Sie haben bereits einen Hive-Metastore-Dienst gestartet (kein hiveserver).
val spark = SparkSession
.builder()
.appName("interfacing spark sql to Hive metastore without configuration file")
.config("Hive.metastore.uris", "thrift://localhost:9083") // replace with your hivemetastore service's thrift url
.enableHiveSupport() // don't forget to enable Hive support
.getOrCreate()
import spark.implicits._
import spark.sql
// create an arbitrary frame
val frame = Seq(("one", 1), ("two", 2), ("three", 3)).toDF("Word", "count")
// see the frame created
frame.show()
/**
* +-----+-----+
* | Word|count|
* +-----+-----+
* | one| 1|
* | two| 2|
* |three| 3|
* +-----+-----+
*/
// write the frame
frame.write.mode("overwrite").saveAsTable("t4")
Auch ich hatte das gleiche Problem, aber gelöst. Folgen Sie einfach diesen Schritten in Spark 2.0 Version
Schritt1: Kopieren Sie die Datei "Hive-site.xml" aus dem Ordner "Hive Conf" nach spark conf .
Schritt 2: Bearbeiten Sie die Datei spark-env.sh und konfigurieren Sie den MySQL-Treiber. (Wenn Sie Mysql als Hive-Metastore verwenden.)
Oder fügen Sie MySQL-Treiber zu Maven/SBT hinzu (wenn Sie diese verwenden)
Step3: Wenn Sie eine Spark-Sitzung erstellen, fügen Sie enableHiveSupport () hinzu.
val spark = SparkSession.builder.master ("local"). appName ("testing") .enableHiveSupport () .getOrCreate ()
Beispielcode:
package sparkSQL
/**
* Created by venuk on 7/12/16.
*/
import org.Apache.spark.sql.SparkSession
object hivetable {
def main(args: Array[String]): Unit = {
val spark = SparkSession.builder.master("local[*]").appName("hivetable").enableHiveSupport().getOrCreate()
spark.sql("create table hivetab (name string, age int, location string) row format delimited fields terminated by ',' stored as textfile")
spark.sql("load data local inpath '/home/hadoop/Desktop/asl' into table hivetab").show()
val x = spark.sql("select * from hivetab")
x.write.saveAsTable("hivetab")
}
}
Ausgabe:
Der folgende Code hat für mich funktioniert. Wir können die Konfiguration von Hive.metastore.uris
für den lokalen Metastore ignorieren, und Spark erstellt lokal Hive-Objekte im Spare-Warehouse-Verzeichnis.
import org.Apache.spark.sql.SparkSession;
object spark_Hive_support1
{
def main (args: Array[String])
{
val spark = SparkSession
.builder()
.master("yarn")
.appName("Test Hive Support")
//.config("Hive.metastore.uris", "jdbc:mysql://localhost/metastore")
.enableHiveSupport
.getOrCreate();
import spark.implicits._
val testdf = Seq(("Word1", 1), ("Word4", 4), ("Word8", 8)).toDF;
testdf.show;
testdf.write.mode("overwrite").saveAsTable("WordCount");
}
}
Spark-Version: 2.0.2
Hive-Version: 1.2.1
Der folgende Java-Code funktionierte für mich, um eine Verbindung zum Hive-Metastore von Spark herzustellen:
import org.Apache.spark.sql.SparkSession;
public class SparkHiveTest {
public static void main(String[] args) {
SparkSession spark = SparkSession
.builder()
.appName("Java Spark Hive Example")
.config("spark.master", "local")
.config("Hive.metastore.uris",
"thrift://maxiqtesting123.com:9083")
.config("spark.sql.warehouse.dir", "/apps/Hive/warehouse")
.enableHiveSupport()
.getOrCreate();
spark.sql("SELECT * FROM default.survey_data limit 5").show();
}
}