當(dāng)SparkSQL遇上Alluxio

前言

Alluxio官方文檔介紹了Hive的配置方法粉寞,也介紹了Spark的配置方法跨蟹,重點介紹了Spark程序如何訪問Alluxio上的文件佛南,但是沒有介紹如何配置SparkSQL(這里指純SQL方式,不是DataFrame編程)表牢,筆者仿照Hive的方式配置SparkSQL隙咸,但數(shù)據(jù)始終無法落到內(nèi)存上(load沐悦、insert都不行)。

本文重點介紹如何為SparkSQL配置Alluxio五督,為SparkSQL插上飛翔的翅膀藏否。

本文的環(huán)境:
Hadoop-2.7.1
Hive-1.2
Spark-2.1.1(剛剛發(fā)布的2.2對SparkSQL又做了大量優(yōu)化(如CBO等)
Alluxio-1.4

啟動Alluxio的用戶

Alluxio默認支持文件系統(tǒng)用戶和權(quán)限檢查。為了確保HDFS中包括用戶充包,組和模式的文件/目錄的權(quán)限信息與Alluxio一致副签,啟動Alluxio master和worker進程的用戶要求是以下任一情況:

  • HDFS超級用戶。即基矮,使用啟動HDFS namenode進程的同一用戶也啟動Alluxio master和worker進程淆储。
  • HDFS超級用戶組的成員。編輯HDFS配置文件hdfs-site.xml并檢查配置屬性dfs.permissions.superusergroup的值家浇。如果使用組(例如本砰,“hdfs”)設(shè)置此屬性,則將用戶添加到此組(“hdfs”)以啟動Alluxio進程(例如钢悲,“alluxio”);如果未設(shè)置此屬性灌具,請將一個組添加到此屬性,其中Alluxio運行用戶是此新添加組的成員譬巫。

注意,上面設(shè)置的用戶只是用于啟動Alluxio master和worker進程督笆。一旦Alluxio服務(wù)器啟動芦昔,就不必使用此用戶運行Alluxio客戶端應(yīng)用程序。

如果Hadoop的超級用戶是hdfs娃肿,而啟動Alluxio的用戶是root咕缎,那么你會遇到各種權(quán)限相關(guān)的異常珠十。
解決方法:將現(xiàn)在啟動alluxio進程root用戶加入hdfs用戶組中。
usermod -a -G hdfs root(注意記得加-a凭豪,否則root會從原來的組移除)

從Hive開始

Hive在Hadoop&Spark生態(tài)中已經(jīng)是不成文的事實標準焙蹭,大部分主流的SQL on Hadoop引擎都會或多或少的依賴Hive或可與Hive共享存儲倉庫和元數(shù)據(jù)庫,如SparkSQL嫂伞、Impala孔厉、Presto、HAWQ帖努、Drill等等撰豺。

配置Hadoop

配置Hive之前需要配置Hadoop(前提是Hive的執(zhí)行引擎是MR)
將以下三個屬性添加到Hadoop的安裝目錄下的conf目錄中的core-site.xml文件中:

<property>
  <name>fs.alluxio.impl</name>
  <value>alluxio.hadoop.FileSystem</value>
</description>
</property>
<property>
  <name>fs.alluxio-ft.impl</name>
  <value>alluxio.hadoop.FaultTolerantFileSystem</value>
</property>
<property>
  <name>fs.AbstractFileSystem.alluxio.impl</name>
  <value>alluxio.hadoop.AlluxioFileSystem</value>
</description>
</property>

該配置使MapReduce識別Alluxio的URI(如alluxio:// )

其次, 在conf目錄中hadoop-env.sh文件中修改$HADOOP_CLASSPATH:

export HADOOP_CLASSPATH=${HADOOP_CLASSPATH}::/opt/alluxio/alluxio-1.4.0/core/client/target/alluxio-core-client-1.4.0-jar-with-dependencies.jar

分發(fā)alluxio-core-client-1.4.0-jar-with-dependencies.jar,有多種方式拼余,可以在跑MR程序時用-libjars指定污桦,也可以放到alluxio每個節(jié)點的置于每個MapReduce節(jié)點的$HADOOP_HOME/lib(由于版本不同也可能是$HADOOP_HOME/share/hadoop/common/lib),如果您使用的Hadoop做了些優(yōu)化匙监,將一些jar包提前放到了HDFS上凡橱,那么需要將該jar包放到hdfs上。筆者重新打包了mapreduced.tar.gz亭姥,并上傳至hdfs的/hdp/apps/2.3.4.0-3485/mapreduce/目錄下

配置Hive

參考官方文檔配置Hive

添加以下配置項到你的Hive安裝目下的conf目錄里的hive-site.xml中:

<property>
   <name>fs.defaultFS</name>
   <value>alluxio://node1:19998</value>
</property>

使用Hive過程中遇到的異常:

Could not setMode for UFS file hdfs://node1.hde.h3c.com:8020/tmp . Aborting the setAttribute operation in Alluxio.

原因是Hive找不到alluxio的jar包稼钩,筆者更新了HDFS上Hive的jar包(/hdp/apps/2.3.4.0-3485/hive/hive.tar.gz),將alluxio-core-client-1.4.0-jar-with-dependencies.jar打到了這個tar包中

在Hive中見表致份,并插入一條數(shù)據(jù)(insert語句)变抽,測試發(fā)現(xiàn)數(shù)據(jù)緩存到了Alluxio,如下圖所示:

數(shù)據(jù)在內(nèi)存中

SparkSQL相遇

啟動spark-sql命令行氮块,執(zhí)行insert向剛才hive中創(chuàng)建的表插入一條數(shù)據(jù):


sparksql中向hive創(chuàng)建的表插入數(shù)據(jù)

發(fā)現(xiàn)在SparkSQL中插入的一條數(shù)據(jù)也存在了內(nèi)存中绍载,如下圖所示:

sparksql向hive中建的表插入數(shù)據(jù),存入內(nèi)存

在SparkSQL中創(chuàng)建一張新表滔蝉,并插入數(shù)據(jù)

建表并插入數(shù)據(jù)

查看Alluxio向的緩存情況击儡,如下圖所示,數(shù)據(jù)全部落到HDFS上蝠引,并未存到內(nèi)存中阳谍。

未存到內(nèi)存中

總結(jié)一下:

  • Hive配置Alluxio成功后,在Hive中建表并插入數(shù)據(jù)螃概,可存入Alluxio內(nèi)存矫夯,在SparkSQL中向這個表插入數(shù)據(jù),也能緩存到內(nèi)存吊洼。
  • 在SparkSQL中建表并插入數(shù)據(jù)训貌,不能緩存到Alluxio的內(nèi)存中。

如何能SparkSQL建表并插入的數(shù)據(jù)緩存到Alluxio的內(nèi)存中呢?

經(jīng)研究發(fā)現(xiàn)配置Hive時递沪,修改的fs.defaultFS配置針對Hive是起作用的豺鼻,但是SparkSQL并不解析這個配置,所以就算在spark-home/conf/hive-site.xml加上這個配置也不會起作用款慨。

幸好儒飒,Hive提供了修改元數(shù)據(jù)屬性的工具metatool,我們可以通過此工具修改fs的類型:

-listFSRoot                           print the current FS root locations
-updateLocation <new-loc> <old-loc>   Update FS root location in the
                                       metastore to new location.Both
                                       new-loc and old-loc should be valid
                                       URIs with valid host names and
                                       schemes.When run with the dryRun
                                       option changes are displayed but
                                       are not persisted. When run with
                                       the serdepropKey/tablePropKey
                                       option updateLocation looks for the
                                       serde-prop-key/table-prop-key that
                                       is specified and updates its value
                                       if found.

修改過程如下所示檩奠,通過此命令將hive的warehouse從hdfs上修改到了alluxio上桩了。

[root@node2 hive]# bin/metatool -listFSRoot
hdfs://node1.hde.h3c.com:8020/apps/hive/warehouse/hmr.db
hdfs://node1.hde.h3c.com:8020/apps/hive/warehouse
[root@node2 hive]# bin/metatool --updateLocation alluxio://node1:19998 hdfs://node1.hde.h3c.com:8020
Updated 12 records in SDS table
[root@node2 hive]# bin/metatool -listFSRoot
alluxio://node1:19998/apps/hive/warehouse/hmr.db
alluxio://node1:19998/apps/hive/warehouse

測試是否管用,新建一張表并插入數(shù)據(jù):

spark-sql> create table test_sparksql2(id int, name string);
Time taken: 1.023 seconds
spark-sql> insert into test_sparksql2 values(1, 'aa');
Time taken: 2.294 seconds
spark-sql> select * from test_sparksql2;
1   aa
Time taken: 0.821 seconds, Fetched 1 row(s)

查看Alluxio的緩存情況笆凌,如下圖所示圣猎,數(shù)據(jù)全部緩存到內(nèi)存中。

數(shù)據(jù)緩存到內(nèi)存
  • 我們使用SparkSQL建表乞而,insert/load操作都能緩存到內(nèi)存中送悔。通過配置Alluxio的存儲策略,大數(shù)據(jù)量的表我們也無需關(guān)心內(nèi)存是否足夠爪模。如果內(nèi)存足夠大欠啤,SparkSQL的性能必將幾何級提升。
  • 不同于SparkSQL提供的cache table語句屋灌,Alluxio的方式存放數(shù)據(jù)不會隨著啟動SparkSQL的進程(或JDBC)的退出而消失洁段,這對于不同進程間的數(shù)據(jù)共享,意義無疑是巨大的共郭。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末祠丝,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子除嘹,更是在濱河造成了極大的恐慌写半,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件尉咕,死亡現(xiàn)場離奇詭異叠蝇,居然都是意外死亡,警方通過查閱死者的電腦和手機年缎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進店門悔捶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人单芜,你說我怎么就攤上這事蜕该。” “怎么了洲鸠?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵蛇损,是天一觀的道長。 經(jīng)常有香客問我,道長淤齐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任袜匿,我火速辦了婚禮更啄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘居灯。我一直安慰自己祭务,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布怪嫌。 她就那樣靜靜地躺著义锥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪岩灭。 梳的紋絲不亂的頭發(fā)上拌倍,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天,我揣著相機與錄音噪径,去河邊找鬼柱恤。 笑死,一個胖子當(dāng)著我的面吹牛找爱,可吹牛的內(nèi)容都是我干的梗顺。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼车摄,長吁一口氣:“原來是場噩夢啊……” “哼寺谤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起吮播,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤变屁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后薄料,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體敞贡,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年摄职,在試婚紗的時候發(fā)現(xiàn)自己被綠了誊役。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡谷市,死狀恐怖蛔垢,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情迫悠,我是刑警寧澤鹏漆,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響艺玲,放射性物質(zhì)發(fā)生泄漏括蝠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一饭聚、第九天 我趴在偏房一處隱蔽的房頂上張望忌警。 院中可真熱鬧,春花似錦秒梳、人聲如沸法绵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽朋譬。三九已至,卻和暖如春兴垦,著一層夾襖步出監(jiān)牢的瞬間徙赢,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工滑进, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留犀忱,地道東北人。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓扶关,卻偏偏與公主長得像阴汇,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子节槐,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內(nèi)容