前言
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,如下圖所示:
SparkSQL相遇
啟動spark-sql命令行氮块,執(zhí)行insert向剛才hive中創(chuàng)建的表插入一條數(shù)據(jù):
發(fā)現(xiàn)在SparkSQL中插入的一條數(shù)據(jù)也存在了內(nèi)存中绍载,如下圖所示:
在SparkSQL中創(chuàng)建一張新表滔蝉,并插入數(shù)據(jù)
查看Alluxio向的緩存情況击儡,如下圖所示,數(shù)據(jù)全部落到HDFS上蝠引,并未存到內(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)存中。
- 我們使用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ù)共享,意義無疑是巨大的共郭。