鎖屏面試題百日百刷-Spark篇(十五)
鎖屏面試題百日百刷,每個工作日堅持更新面試題。鎖屏面試題app、小程序現(xiàn)已上線,官網(wǎng)地址:https://www.demosoftware.cn。已收錄了每日更新的面試題的所有內(nèi)容,還包含特色的解鎖屏幕復(fù)習(xí)面試題、每日編程題目郵件推送等功能。讓你在面試中先人一步!接下來的是今日的面試題:
1.spark怎么整合hive?
1)將hive的配置文件hive-site.xml復(fù)制到Spark conf目錄下
2)根據(jù)hive的配置參數(shù)hive.metastore.uris的情況,采用不同的集成方式
a. jdbc方式:hive.metastore.uris沒有給定配置值,為空(默認情況),SparkSQL通過hive配置的javax.jdo.option.XXX相關(guān)配置值直接連接metastore數(shù)據(jù)庫直接獲取hive表元數(shù)據(jù), 需要將連接數(shù)據(jù)庫的驅(qū)動添加到Spark應(yīng)用的classpath中
b.metastore服務(wù)方式:hive.metastore.uris給定了具體的參數(shù)值,SparkSQL通過連接hive提供的metastore服務(wù)來獲取hive表的元數(shù)據(jù), 直接啟動hive的metastore服務(wù)即可完成SparkSQL和Hive的集成:
3)使用metastore服務(wù)方式,對hive-site.xml進行配置
<property>
<name>hive.metastore.uris</name>
<value> trhift://mfg-hadoop:9083</value>
</property>
4)啟動hive service metastore服務(wù)
bin/hive --service metastore &
5)啟動spark-sql測試,執(zhí)行 show databases命令,檢查是不是和hive的數(shù)據(jù)庫一樣的。
2.Spark讀取數(shù)據(jù),是幾個Partition呢?
從2方面介紹和回答,一是說下partition是什么,二是說下partition如何建的。
1)spark中的partion是彈性分布式數(shù)據(jù)集RDD的最小單元,RDD是由分布在各個節(jié)點上的partion組成的。partion是指的spark在計算過程中,生成的數(shù)據(jù)在計算空間內(nèi)最小單元,同一份數(shù)據(jù)(RDD)的partion大小不一,
數(shù)量不定,是根據(jù)application里的算子和最初讀入的數(shù)據(jù)分塊數(shù)量決定的,這也是為什么叫“彈性分布式”數(shù)據(jù)集的原因之一。Partition不會根據(jù)文件的偏移量來截取的(比如有3個Partition,1個是頭多少M的數(shù)據(jù),1個是中間多少M的數(shù)據(jù),1個是尾部多少M的數(shù)據(jù)),而是從一個原文件這個大的集合里根據(jù)某種計算規(guī)則抽取符合的數(shù)據(jù)來形成一個Partition的;
2)如何創(chuàng)建分區(qū),有兩種情況,創(chuàng)建 RDD 時和通過轉(zhuǎn)換操作得到新 RDD 時。對于前者,在調(diào)用 textFile 和parallelize 方法時候手動指定分區(qū)個數(shù)即可。例如 sc.parallelize(Array(1, 2, 3, 5, 6), 2) 指定創(chuàng)建得到的 RDD 分區(qū)個數(shù)為 2。如果沒有指定,partition數(shù)等于block數(shù);對于后者,直接調(diào)用 repartition 方法即可。實際上分區(qū)的個數(shù)是根據(jù)轉(zhuǎn)換操作對應(yīng)多個 RDD 之間的依賴關(guān)系來確定,窄依賴子 RDD 由父 RDD 分區(qū)個數(shù)決定,例如 map操作,父 RDD 和子 RDD 分區(qū)個數(shù)一致;Shuffle 依賴則由分區(qū)器(Partitioner)決定,例如 groupByKey(new HashPartitioner(2)) 或者直接 groupByKey(2) 得到的新 RDD 分區(qū)個數(shù)等于 2。
3.spark-submit的時候如何引入外部jar包
方法一:spark-submit –jars
根據(jù)spark官網(wǎng),在提交任務(wù)的時候指定–jars,用逗號分開。這樣做的缺點是每次都要指定jar包,如果jar包少的話可以這么做,但是如果多的話會很麻煩。
命令:spark-submit --master yarn-client --jars ***.jar,***.jar
方法二:extraClassPath
提交時在spark-default中設(shè)定參數(shù),將所有需要的jar包考到一個文件里,然后在參數(shù)中指定該目錄就可以了,較上一個方便很多:
spark.executor.extraClassPath=/home/hadoop/wzq_workspace/lib/*
spark.driver.extraClassPath=/home/hadoop/wzq_workspace/lib/* 需要注意的是,你要在所有可能運行spark任務(wù)的機器上保證該目錄存在,并且將jar包考到所有機器上。這樣
做的好處是提交代碼的時候不用再寫一長串jar了,缺點是要把所有的jar包都拷一遍。