背景
很多時候,我們在編寫好Spark應用程序之後,想要讀取Hive表測試一下,但又不想操作 (打jar包——>上傳集羣——>spark-submit) 這些步驟時,那我們就可以在本地直連Hive,直接運行你的Spark應用程序中的main函數即可。代碼如下(版本爲Spark2.0+):
Scala版本
代碼如下:
import org.apache.spark.sql.SparkSession
object SparkDemo {
val spark = SparkSession
.builder()
.appName("Spark to Hive")
.master("local[4]")
.config("hive.metastore.uris", "thrift://bigdata01:9083,thrift://bigdata02:9083")
.enableHiveSupport()
.getOrCreate()
val df = spark.read.table("db.table")
df.show(false)
spark.close()
}
代碼中在創建SparkSession實例時的配置項 “hive.metastore.uris” 的值以個人情況而定,具體配置對應的是你集羣中Hive安裝目錄下的這個文件 …/conf/hive-site.xml 中的 hive.metastore.uris,這個配置表示Hive的Metastore Server所在的節點。
注意:一般來講,bigdata01,bigdata02都是集羣中節點的別名,並不是具體的IP地址,所以你還需要把集羣某個節點下文件 /etc/hosts 中的配置拷貝到你Windows電腦(本人用的Windows)的這個 C:\Windows\System32\drivers\etc\hosts 文件中,這樣才能在本地訪問集羣Hive的元數據服務器節點。具體配置就長下面這個樣子:
10.1.11.10 bigdata01
10.1.11.11 bigdata02
10.1.11.12 bigdata03
...
pyspark版本
代碼如下:
import os
from pyspark.sql import SparkSession
os.environ["SPARK_HOME"] = "F:\App\spark-2.3.1-bin-hadoop2.6"
if __name__ == '__main__':
spark = SparkSession\
.builder \
.appName("Spark to Hive") \
.master("local[4]") \
.config("hive.metastore.uris", "thrift://bigdata01:9083,thrift://bigdata02:9083") \
.enableHiveSupport()\
.getOrCreate()
df = spark.read.table("db.table")
df.show(truncate=False)
spark.stop()
pyspark版本跟Scala不同的地方在於,pyspark運行時會依賴Spark的一些文件,因此需要設置環境變量SPARK_HOME,你可以到Spark官網下載與你所使用Spark相對應的版本,文件名稱類似spark-2.3.3-bin-hadoop2.6.tgz,下載之後,解壓到你電腦指定目錄下即可,最後將解壓後的根目錄作爲SPARK_HOME。