如何在没有 hive-site.xml 的情况下将 Spark SQL 连接到远程 Hive Metastore(通过节俭协议)?
How to connect Spark SQL to remote Hive metastore (via thrift protocol) with no hive-site.xml?
我将 HiveContext 与 SparkSQL 一起使用,并且我正在尝试连接到远程 Hive 元存储,设置 Hive 元存储的唯一方法是在类路径中包含 hive-site.xml(或复制它到 /etc/spark/conf/).
有没有办法在不包含 hive-site.xml 的 java 代码中以编程方式设置此参数?如果是这样,要使用的 Spark 配置是什么?
对于 Spark 1.x,您可以设置为:
System.setProperty("hive.metastore.uris", "thrift://METASTORE:9083");
final SparkConf conf = new SparkConf();
SparkContext sc = new SparkContext(conf);
HiveContext hiveContext = new HiveContext(sc);
或
final SparkConf conf = new SparkConf();
SparkContext sc = new SparkContext(conf);
HiveContext hiveContext = new HiveContext(sc);
hiveContext.setConf("hive.metastore.uris", "thrift://METASTORE:9083");
更新如果你的 Hive 是 Kerberized :
尝试在创建 HiveContext 之前设置这些:
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");
在 spark 2.0.+ 中它应该看起来像这样:
Don't forget to replace the "hive.metastore.uris" with yours. This
assume that you have a hive metastore service started already (not a
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")
我也遇到了同样的问题,但是已经解决了。只需在 Spark 2.0 版本
中执行此步骤
Step1: 将 hive-site.xml 文件从 Hive conf 文件夹复制到 spark conf。
步骤 2: 编辑 spark-env.sh 文件并配置您的 mysql 驱动程序。 (如果您使用 Mysql 作为配置单元元存储。)
或将 MySQL 驱动程序添加到 Maven/SBT(如果使用那些)
第 3 步: 创建 spark 会话时添加 enableHiveSupport()
val spark = SparkSession.builder.master("local").appName("testing").enableHiveSupport().getOrCreate()
示例代码:
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")
}
}
输出:
下面的代码对我有用。对于local metastore我们可以忽略hive.metastore.uris
的配置,spark会在本地的spare-warehouse目录下创建hive对象。
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");
}
}
星火版本:2.0.2
蜂巢版本:1.2.1
下面的 Java 代码让我可以从 Spark 连接到 Hive Metastore:
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://abc123.com:9083")
.config("spark.sql.warehouse.dir", "/apps/hive/warehouse")
.enableHiveSupport()
.getOrCreate();
spark.sql("SELECT * FROM default.survey_data limit 5").show();
}
}
一些类似的问题被标记为重复,这是在不使用 hive.metastore.uris
或单独的 thrift server(9083) 的情况下从 Spark 连接到 Hive 并且不将 hive-site.xml 复制到 SPARK_CONF_DIR.
import org.apache.spark.sql.SparkSession
val spark = SparkSession
.builder()
.appName("hive-check")
.config(
"spark.hadoop.javax.jdo.option.ConnectionURL",
"JDBC_CONNECT_STRING"
)
.config(
"spark.hadoop.javax.jdo.option.ConnectionDriverName",
"org.postgresql.Driver"
)
.config("spark.sql.warehouse.dir", "/user/hive/warehouse")
.config("spark.hadoop.javax.jdo.option.ConnectionUserName", "JDBC_USER")
.config("spark.hadoop.javax.jdo.option.ConnectionPassword", "JDBC_PASSWORD")
.enableHiveSupport()
.getOrCreate()
spark.catalog.listDatabases.show(false)
在 Hadoop 3 中,Spark 和 Hive 目录是分开的:
对于spark-shell(默认情况下带有.enableHiveSupport()
)只需尝试:
pyspark-shell --conf spark.hadoop.metastore.catalog.default=hive
对于 spark-submit 工作创建你这样的 spark session:
SparkSession.builder.appName("Test").enableHiveSupport().getOrCreate()
然后将此 conf 添加到您的 spark-submit 命令中:
--conf spark.hadoop.metastore.catalog.default=hive
但对于 ORC table(以及更普遍的内部 table),建议使用 HiveWareHouse 连接器。
设置 spark.hadoop.metastore.catalog.default=hive 对我有用。
我在不使用 hive-site.xml.
的情况下尝试从 spark 连接到 hive metastore 时观察到一种奇怪的行为
一切正常当我们在创建 SparkSession 时在 spark 代码中使用 hive.metastore.uris
属性。
但是,如果我们不在代码中指定,而是在使用带有 --conf
标志的 spark-shell
或 spark-submit
时指定,它将不起作用。
它将抛出如下所示的警告,并且不会连接到远程 Metastore。
Warning: Ignoring non-Spark config property: hive.metastore.uris
一个解决方法是使用下面的 属性.
spark.hadoop.hive.metastore.uris
Spark 3.x:
// Scala
import org.apache.spark.sql.{Row, SaveMode, SparkSession}
val spark = SparkSession
.builder()
.appName("Spark Hive Example")
.config("spark.sql.warehouse.dir", "hive_warehouse_hdfs_path")
.enableHiveSupport()
.getOrCreate()
# Python
from pyspark.sql import SparkSession
spark = SparkSession \
.builder \
.appName("Python Spark SQL Hive integration example") \
.config("spark.sql.warehouse.dir", "hive_warehouse_hdfs_path") \
.enableHiveSupport() \
.getOrCreate()
检查可用的数据库:
spark.catalog.listDatabases().show()
我将 HiveContext 与 SparkSQL 一起使用,并且我正在尝试连接到远程 Hive 元存储,设置 Hive 元存储的唯一方法是在类路径中包含 hive-site.xml(或复制它到 /etc/spark/conf/).
有没有办法在不包含 hive-site.xml 的 java 代码中以编程方式设置此参数?如果是这样,要使用的 Spark 配置是什么?
对于 Spark 1.x,您可以设置为:
System.setProperty("hive.metastore.uris", "thrift://METASTORE:9083");
final SparkConf conf = new SparkConf();
SparkContext sc = new SparkContext(conf);
HiveContext hiveContext = new HiveContext(sc);
或
final SparkConf conf = new SparkConf();
SparkContext sc = new SparkContext(conf);
HiveContext hiveContext = new HiveContext(sc);
hiveContext.setConf("hive.metastore.uris", "thrift://METASTORE:9083");
更新如果你的 Hive 是 Kerberized :
尝试在创建 HiveContext 之前设置这些:
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");
在 spark 2.0.+ 中它应该看起来像这样:
Don't forget to replace the "hive.metastore.uris" with yours. This assume that you have a hive metastore service started already (not a 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")
我也遇到了同样的问题,但是已经解决了。只需在 Spark 2.0 版本
中执行此步骤Step1: 将 hive-site.xml 文件从 Hive conf 文件夹复制到 spark conf。
步骤 2: 编辑 spark-env.sh 文件并配置您的 mysql 驱动程序。 (如果您使用 Mysql 作为配置单元元存储。)
或将 MySQL 驱动程序添加到 Maven/SBT(如果使用那些)
第 3 步: 创建 spark 会话时添加 enableHiveSupport()
val spark = SparkSession.builder.master("local").appName("testing").enableHiveSupport().getOrCreate()
示例代码:
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")
}
}
输出:
下面的代码对我有用。对于local metastore我们可以忽略hive.metastore.uris
的配置,spark会在本地的spare-warehouse目录下创建hive对象。
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");
}
}
星火版本:2.0.2
蜂巢版本:1.2.1
下面的 Java 代码让我可以从 Spark 连接到 Hive Metastore:
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://abc123.com:9083")
.config("spark.sql.warehouse.dir", "/apps/hive/warehouse")
.enableHiveSupport()
.getOrCreate();
spark.sql("SELECT * FROM default.survey_data limit 5").show();
}
}
一些类似的问题被标记为重复,这是在不使用 hive.metastore.uris
或单独的 thrift server(9083) 的情况下从 Spark 连接到 Hive 并且不将 hive-site.xml 复制到 SPARK_CONF_DIR.
import org.apache.spark.sql.SparkSession
val spark = SparkSession
.builder()
.appName("hive-check")
.config(
"spark.hadoop.javax.jdo.option.ConnectionURL",
"JDBC_CONNECT_STRING"
)
.config(
"spark.hadoop.javax.jdo.option.ConnectionDriverName",
"org.postgresql.Driver"
)
.config("spark.sql.warehouse.dir", "/user/hive/warehouse")
.config("spark.hadoop.javax.jdo.option.ConnectionUserName", "JDBC_USER")
.config("spark.hadoop.javax.jdo.option.ConnectionPassword", "JDBC_PASSWORD")
.enableHiveSupport()
.getOrCreate()
spark.catalog.listDatabases.show(false)
在 Hadoop 3 中,Spark 和 Hive 目录是分开的:
对于spark-shell(默认情况下带有.enableHiveSupport()
)只需尝试:
pyspark-shell --conf spark.hadoop.metastore.catalog.default=hive
对于 spark-submit 工作创建你这样的 spark session:
SparkSession.builder.appName("Test").enableHiveSupport().getOrCreate()
然后将此 conf 添加到您的 spark-submit 命令中:
--conf spark.hadoop.metastore.catalog.default=hive
但对于 ORC table(以及更普遍的内部 table),建议使用 HiveWareHouse 连接器。
设置 spark.hadoop.metastore.catalog.default=hive 对我有用。
我在不使用 hive-site.xml.
的情况下尝试从 spark 连接到 hive metastore 时观察到一种奇怪的行为一切正常当我们在创建 SparkSession 时在 spark 代码中使用 hive.metastore.uris
属性。
但是,如果我们不在代码中指定,而是在使用带有 --conf
标志的 spark-shell
或 spark-submit
时指定,它将不起作用。
它将抛出如下所示的警告,并且不会连接到远程 Metastore。
Warning: Ignoring non-Spark config property: hive.metastore.uris
一个解决方法是使用下面的 属性.
spark.hadoop.hive.metastore.uris
Spark 3.x:
// Scala
import org.apache.spark.sql.{Row, SaveMode, SparkSession}
val spark = SparkSession
.builder()
.appName("Spark Hive Example")
.config("spark.sql.warehouse.dir", "hive_warehouse_hdfs_path")
.enableHiveSupport()
.getOrCreate()
# Python
from pyspark.sql import SparkSession
spark = SparkSession \
.builder \
.appName("Python Spark SQL Hive integration example") \
.config("spark.sql.warehouse.dir", "hive_warehouse_hdfs_path") \
.enableHiveSupport() \
.getOrCreate()
检查可用的数据库:
spark.catalog.listDatabases().show()