版本: 2.3.3
Hive on Spark為Hive提供了Apache Spark作為執(zhí)行引擎。
set hive.execution.engine=spark;
Hive 1.1+以上版本提供Hive on Spark 剥汤。它在“ spark ”和“spark2”分支中仍處于發(fā)展階段椭盏,并且定期合并到Hive的“主”分支中年栓。
參見 HIVE-7292 及其子任務和相關問題纺腊。
版本兼容性
Hive on Spark僅用特定版本的Spark進行測試畔师,因此給定版本的Hive只能保證與Spark的特定版本兼容娶靡。Spark的其他版本可能與給定版本的Hive一起使用,但不能保證看锉。以下是Hive版本及其相應兼容Spark版本的列表姿锭。
Hive版本 | Spark版本 |
---|---|
master | 2.3.0 |
2.3.x | 2.0.0 |
2.2.x | 1.6.0 |
2.1.x | 1.6.0 |
2.0.x | 1.5.0 |
1.2.x | 1.3.1 |
1.1.x | 1.2.0 |
Spark 安裝
按照說明安裝Spark:
YARN模式:http : //spark.apache.org/docs/latest/running-on-yarn.html
獨立模式:https: //spark.apache.org/docs/latest/spark-standalone.html
Hive on Spark 默認支持 Spark on YARN模式。
對于安裝執(zhí)行以下任務:
- 安裝Spark(或者下載預先構建的Spark伯铣,或者從源代碼構建程序集)呻此。
- 安裝/構建兼容版本。Hive root
pom.xml
的<spark.version>定義了它構建/測試的Spark版本腔寡。 - 安裝/構建兼容的發(fā)行版焚鲜。Spark的每個版本都有幾個發(fā)行版,與不同版本的Hadoop相對應。
- 一旦安裝了Spark忿磅,找到并記錄<spark-assembly - *.jar>位置糯彬。
- 請注意,您必須擁有不包含Hive jar 的Spark版本 葱她。這意味著不是用Hive配置文件構建的撩扒。如果您將使用Parquet tables,建議啟用“parquet-provided” profile 吨些。否則搓谆,Parquet依賴性可能會發(fā)生沖突。要從安裝中刪除Hive jar锤灿,只需使用Spark的以下命令:
- 安裝/構建兼容版本。Hive root
在Spark 2.0.0之前:
./make-distribution.sh --name "hadoop2-without-hive" --tgz "-Pyarn,hadoop-provided,[hadoop-2.4,parquet-provided](https://cwiki.apache.org/confluence/display/Hive/hadoop-2.4,parquet-provided)"
從Spark 2.0.0起:
./dev/make-distribution.sh --name "hadoop2-without-hive" --tgz "-Pyarn,hadoop-provided,hadoop-2.7,parquet-provided"
由Spark 2.3.0起:
./dev/make-distribution.sh --name "hadoop2-without-hive" --tgz "-Pyarn,hadoop-provided,hadoop-2.7,parquet-provided,orc-provided"
- 啟動Spark群集
- 記下<Spark Master URL>挽拔。這可以在Spark master WebUI中找到。
配置YARN
公平調度程序是必需的但校,而不是容量調度程序螃诅。這在YARN集群中公平地分配了相同份額的資源。
yarn.resourcemanager.scheduler.class = org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler
配置Hive
-
要將Spark依賴添加到Hive状囱,請執(zhí)行以下操作:
- 在Hive 2.2.0之前术裸,將spark-assembly jar鏈接到
HIVE_HOME/lib
。 - 由于Hive 2.2.0亭枷,Hive on Spark 使用Spark 2.0.0及以上版本運行袭艺,它沒有assembly jar。
- 要以YARN模式(yarn-client or yarn-cluster)運行叨粘,請將以下jars 鏈接到
HIVE_HOME/lib
猾编。- scala-library
- spark-core
- spark-network-common
- 要以LOCAL模式運行(僅用于調試),除上述以外升敲,還要連接下列jars 到
HIVE_HOME/lib
答倡。- chill-java chill jackson-module-paranamer jackson-module-scala jersey-container-servlet-core
- jersey-server json4s-ast kryo-shaded minlog scala-xml spark-launcher
- spark-network-shuffle spark-unsafe xbean-asm5-shaded
- 要以YARN模式(yarn-client or yarn-cluster)運行叨粘,請將以下jars 鏈接到
- 在Hive 2.2.0之前术裸,將spark-assembly jar鏈接到
配置Hive執(zhí)行引擎以使用Spark:
set hive.execution.engine=spark;
有關配置Hive和遠程Spark驅動程序的其他屬性,請參閱Hive配置屬性的Spark部分驴党。
- 為Hive配置Spark應用程序配置瘪撇。請參閱:http : //spark.apache.org/docs/latest/configuration.html。這可以通過將這些屬性的文件“spark-defaults.conf”添加到Hive類路徑中港庄,或者通過將它們設置為Hive配置(
hive-site.xml
)來完成倔既。例如:
set spark.master=<Spark Master URL>
set spark.eventLog.enabled=true;
set spark.eventLog.dir=<Spark event log folder (must exist)>
set spark.executor.memory=512m;
set spark.serializer=org.apache.spark.serializer.KryoSerializer;
配置屬性細節(jié)
* `spark.executor.memory`: 每個執(zhí)行程序進程使用的內存量。
* `spark.executor.cores`:每個執(zhí)行者的核心數(shù)量鹏氧。
* `spark.yarn.executor.memoryOverhead`:在yarn上運行Spark時渤涌,為每個執(zhí)行程序分配的堆內存量(以兆字節(jié)為單位)。這些內存用于把还,VM overheads 实蓬,interned strings稿存,其他本地overheads等等。除了執(zhí)行程序的內存外瞳秽,啟動執(zhí)行程序的容器需要一些額外的系統(tǒng)進程內存,就是這種開銷率翅。
* `spark.executor.instances`:分配給每個應用程序的執(zhí)行程序的數(shù)量练俐。
* `spark.driver.memory`:分配給遠程Spark上下文(RSC)的內存量。我們推薦4GB冕臭。
* `spark.yarn.driver.memoryOverhead`:我們推薦400(MB)腺晾。
-
允許Yarn緩存節(jié)點上必需的Spark依賴性JAR,以便每次應用程序運行時不需要分發(fā)它辜贵。
- 在Hive 2.2.0之前悯蝉,將spark-assembly jar上傳到hdfs文件(例如:hdfs://xxxx:8020/spark-assembly.jar
)并在hive-site.xml中添加以下內容
- 在Hive 2.2.0之前悯蝉,將spark-assembly jar上傳到hdfs文件(例如:hdfs://xxxx:8020/spark-assembly.jar
<property>
<name>spark.yarn.jar</name>
<value>hdfs://xxxx:8020/spark-assembly.jar</value>
</property>
- Hive 2.2.0,將$SPARK_HOME/jars中的所有jar上傳到hdfs文件夾(例如:hdfs:///xxxx:8020/spark-jars
)托慨,并在hive-site.xml中添加以下內容
<property>
<name>spark.yarn.jars</name>
<value>hdfs://xxxx:8020/spark-jars/*</value>
</property>
配置Spark
設置執(zhí)行程序的內存大小要比簡單地設置為盡可能大要復雜鼻由。有幾件事情需要考慮:
更多的執(zhí)行器內存意味著它可以為更多的查詢啟用mapjoin優(yōu)化。
另一方面厚棵,更多的執(zhí)行者內存從GC的角度來看變得很笨拙蕉世。
一些實驗表明,HDFS客戶端不能很好地處理并發(fā)寫婆硬,因此如果執(zhí)行者核心太多狠轻,它可能會面臨競爭狀態(tài)。
以下設置需要針對群集進行調整彬犯,這些設置也可能適用于在Spark之外的Hive上提交Spark作業(yè):
屬性 | 建議 |
---|---|
spark.executor.cores | 在5-7之間向楼,請參閱調優(yōu)細節(jié)部分 |
spark.executor.memory | yarn.nodemanager.resource.memory-mb *(spark.executor.cores / yarn.nodemanager.resource.cpu-vcores) |
spark.yarn.executor.memoryOverhead | spark.executor.memory的15-20% |
spark.executor.instances | 取決于spark.executor.memory + spark.yarn.executor.memoryOverhead,請參閱調整詳細信息部分谐区。 |
調整細節(jié)
在Spark on YARN 時湖蜕, 我們通常建議將spark.executor.cores設置 為5,6或7,具體取決于可以被節(jié)點整除卢佣。例如重荠,如果 yarn.nodemanager.resource.cpu-vcores是19,那么6是更好的選擇(所有執(zhí)行者只能擁有相同數(shù)量的內核虚茶,如果我們選擇5戈鲁,那么每個執(zhí)行者只能獲得3個內核;如果我們選擇了7,那么只有2個執(zhí)行者被使用嘹叫,5個核心將被浪費)婆殿。如果是20,那么5是更好的選擇(因為這樣你會得到4個執(zhí)行者罩扇,并且沒有核心被浪費)婆芦。
對于spark.executor.memory
怕磨,我們推薦計算 yarn.nodemanager.resource.memory-mb *(spark.executor.cores / yarn.nodemanager.resource.cpu-vcores), 然后拆分spark.executor.memory和消约。根據(jù)我們的實驗肠鲫,我們建議設置 為總內存的15-20%左右。 spark.yarn.executor.memoryOverhead``spark.yarn.executor.memoryOverhead
在決定每個執(zhí)行程序接收多少內存之后或粮,您需要決定將多少執(zhí)行程序分配給查詢导饲。在GA版本中,將支持Spark動態(tài)執(zhí)行程序分配氯材。但是渣锦,對于這個測試版,只能使用靜態(tài)資源分配氢哮。根據(jù)每個節(jié)點的物理內存的配置 spark.executor.memory
和spark.yarn.executor.memoryOverhead
袋毙,你需要選擇實例和組的數(shù)量spark.executor.instances
。
現(xiàn)在是一個真實世界的例子 假設每個節(jié)點具有12個虛擬內核的10個節(jié)點具有64GB的內存冗尤,例如听盖, yarn.nodemanager.resource.cpu-vcores=12
。一個節(jié)點將被用作主節(jié)點裂七,因此集群將有9個從節(jié)點媳溺。我們將配置spark.executor.cores
為6.鑒于64GB的內存yarn.nodemanager.resource.memory-mb
將為50GB。我們將確定每個執(zhí)行程序的內存量如下:50GB *(6/12)= 25GB碍讯。我們將分配20%spark.yarn.executor.memoryOverhead
悬蔽,或5120和80%spark.executor.memory
,或20GB捉兴。
在這個9節(jié)點集群上蝎困,每個主機都有兩個執(zhí)行者。因此倍啥,我們可以配置spark.executor.instances
2到18之間的某個值禾乘。值為18將利用整個群集。
常見問題(綠色已解決虽缕,將從此列表中刪除)
https://cwiki.apache.org/confluence/display/Hive/Hive+on+Spark%3A+Getting+Started
推薦配置
有關這些設置的詳細信息始藕,請參閱HIVE-9153。
mapreduce.input.fileinputformat.split.maxsize=750000000
hive.vectorized.execution.enabled=true
hive.cbo.enable=true
hive.optimize.reducededuplication.min.reducer=4
hive.optimize.reducededuplication=true
hive.orc.splits.include.file.footer=false
hive.merge.mapfiles=true
hive.merge.sparkfiles=false
hive.merge.smallfiles.avgsize=16000000
hive.merge.size.per.task=256000000
hive.merge.orcfile.stripe.level=true
hive.auto.convert.join=true
hive.auto.convert.join.noconditionaltask=true
hive.auto.convert.join.noconditionaltask.size=894435328
hive.optimize.bucketmapjoin.sortedmerge=false
hive.map.aggr.hash.percentmemory=0.5
hive.map.aggr=true
hive.optimize.sort.dynamic.partition=false
hive.stats.autogather=true
hive.stats.fetch.column.stats=true
hive.vectorized.execution.reduce.enabled=false
hive.vectorized.groupby.checkinterval=4096
hive.vectorized.groupby.flush.percent=0.1
hive.compute.query.using.stats=true
hive.limit.pushdown.memory.usage=0.4
hive.optimize.index.filter=true
hive.exec.reducers.bytes.per.reducer=67108864
hive.smbjoin.cache.rows=10000
hive.exec.orc.default.stripe.size=67108864
hive.fetch.task.conversion=more
hive.fetch.task.conversion.threshold=1073741824
hive.fetch.task.aggr=false
mapreduce.input.fileinputformat.list-status.num-threads=5
spark.kryo.referenceTracking=false
spark.kryo.classesToRegister=org.apache.hadoop.hive.ql.io.HiveKey,org.apache.hadoop.io.BytesWritable,org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch
有關其他屬性氮趋,請參閱配置頁面的Spark部分伍派。