Hive 和 Spark的愛恨情仇恩怨交織
本文轉(zhuǎn)載自微信公眾號「明哥的IT隨筆」,作者IT明哥。轉(zhuǎn)載本文請聯(lián)系明哥的IT隨筆公眾號。
最近在面試一些應(yīng)聘大數(shù)據(jù)崗位的技術(shù)小伙伴時,發(fā)現(xiàn)不少朋友對業(yè)界 所謂的hive on spark和spark on hive分不太清楚;同時在日常工作中,也因為對這兩個技術(shù)術(shù)語的理解不太一致,影響了進一步的技術(shù)交流。所以在這里,明哥想跟大家聊聊 hive 和 spark的愛恨情仇。
hive的定位
hive 官網(wǎng)有描述,“Apache Hive data warehouse software facilitates reading, writing, and managing large datasets residing in distributed storage using SQL.”,hive的定位是數(shù)據(jù)倉庫,其提供了通過 sql 讀寫和管理分布式存儲中的大規(guī)模的數(shù)據(jù),即 hive即負責(zé)數(shù)據(jù)的存儲和管理(其實依賴的是底層的hdfs文件系統(tǒng)或s3等對象存儲系統(tǒng)),也負責(zé)通過 sql來處理和分析數(shù)據(jù)。所以說,hive只用來處理結(jié)構(gòu)化數(shù)據(jù),且只提供了sql的方式來進行分析處理。而且一般來說,hive只能對數(shù)據(jù)進行批處理。(當(dāng)使用hive 的hbase映射表時,有一定的實時能力;同時,flink社區(qū)也在嘗試將hive實時化-這里的實時化指小時級別的實時化,達不到分鐘級別)。
spark的定位
正如 spark官網(wǎng)所說,“Apache spark is a unified analytics engine for large-scale data processing.”,spark是一個通用的處理大規(guī)模數(shù)據(jù)的分析引擎,即 spark 是一個計算引擎,而不是存儲引擎,其本身并不負責(zé)數(shù)據(jù)存儲。其分析處理數(shù)據(jù)的方式,可以使用sql,也可以使用java,scala, python甚至R等api;其分析處理數(shù)據(jù)的模式,既可以是批處理,也可以是流處理;而其分析處理的數(shù)據(jù),可以通過插件的形式對接很多數(shù)據(jù)源,既可以是結(jié)構(gòu)化的數(shù)據(jù),也可以是半結(jié)構(gòu)化甚至分結(jié)構(gòu)化的數(shù)據(jù),包括關(guān)系型數(shù)據(jù)庫RDBMS,各種nosql數(shù)據(jù)庫如hbase, mongodb, es等,也包括文件系統(tǒng)hdfs,對象存儲oss, s3 等等。
hive和spark: 碰撞出的愛恨交織恩怨情仇的火花
通過以上說明,我們可以看到spark和hive本質(zhì)上是沒有關(guān)系的,兩者可以互不依賴。但是在企業(yè)實際應(yīng)用中,經(jīng)常把二者結(jié)合起來使用。而業(yè)界spark和hive結(jié)合使用的方式,主要有以下三種:
- hive on spark。在這種模式下,數(shù)據(jù)是以table的形式存儲在hive中的,用戶處理和分析數(shù)據(jù),使用的是hive語法規(guī)范的 hql (hive sql)。但這些hql,在用戶提交執(zhí)行時(一般是提交給hiveserver2服務(wù)去執(zhí)行),底層會經(jīng)過hive的解析優(yōu)化編譯,最后以spark作業(yè)的形式來運行。事實上,hive早期只支持一種底層計算引擎,即mapreduce,后期在spark 因其快速高效占領(lǐng)大量市場后,hive社區(qū)才主動擁抱spark,通過改造自身代碼,支持了spark作為其底層計算引擎。目前hive支持了三種底層計算引擎,即mr, tez和spark.用戶可以通過set hive.execution.engine=mr/tez/spark來指定具體使用哪個底層計算引擎。
- spark on hive。上文已經(jīng)說到,spark本身只負責(zé)數(shù)據(jù)計算處理,并不負責(zé)數(shù)據(jù)存儲。其計算處理的數(shù)據(jù)源,可以以插件的形式支持很多種數(shù)據(jù)源,這其中自然也包括hive。當(dāng)我們使用spark來處理分析存儲在hive中的數(shù)據(jù)時,這種模式就稱為為 spark on hive。這種模式下,用戶可以使用spark的 java/scala/pyhon/r 等api,也可以使用spark語法規(guī)范的sql ,甚至也可以使用hive 語法規(guī)范的hql 。而之所以也能使用hql,是因為 spark 在推廣面世之初,就主動擁抱了hive,通過改造自身代碼提供了原生對hql包括hive udf的支持(其實從技術(shù)細節(jié)來將,這里把hql語句解析為抽象語法書ast,使用的是hive的語法解析器,但后續(xù)進一步的優(yōu)化和代碼生成,使用的都是spark sql 的catalyst),這也是市場推廣策略的一種吧。
- spark + spark hive catalog。這是spark和hive結(jié)合的一種新形勢,隨著數(shù)據(jù)湖相關(guān)技術(shù)的進一步發(fā)展,這種模式現(xiàn)在在市場上受到了越來越多用戶的青睞。其本質(zhì)是,數(shù)據(jù)以orc/parquet/delta lake等格式存儲在分布式文件系統(tǒng)如hdfs或?qū)ο蟠鎯ο到y(tǒng)如s3中,然后通過使用spark計算引擎提供的scala/java/python等api或spark 語法規(guī)范的sql來進行處理。由于在處理分析時針對的對象是table, 而table的底層對應(yīng)的才是hdfs/s3上的文件/對象,所以我們需要維護這種table到文件/對象的映射關(guān)系,而spark自身就提供了 spark hive catalog來維護這種table到文件/對象的映射關(guān)系。注意這里的spark hive catalog,其本質(zhì)是使用了hive 的 metasore 相關(guān) api來讀寫表到文件/對象的映射關(guān)系(以及一起其他的元數(shù)據(jù)信息)到 metasore db如mysql, postgresql等數(shù)據(jù)庫中。(由于spark編譯時可以把hive metastore api等相關(guān)代碼一并打包到spark的二進制安裝包中,所以使用這種模式,我們并不需要額外單獨安裝hive)。