前言
在前面的文章我做了一個hive整合alluxio的文章,Hive整合Alluxio實操那部分其實是爲了SparkSQL的整合做基礎。
整合思路
- SparkSQL的目標其實就是實現表的讀寫都在alluxio內就可以,這個只要是表的location指向alluxio的路徑就可以。
- 若需要新建的表也在放在alluxio的路徑時,我需要調整庫的默認路徑
環境準備
alluxio的包自然是要引入的,我們在 spark-defaults.conf 中加入配置:
spark.driver.extraClassPath /<PATH_TO_ALLUXIO>/client/alluxio-2.2.0-client.jar
spark.executor.extraClassPath /<PATH_TO_ALLUXIO>/client/alluxio-2.2.0-client.jar
其實對於spark本身而言,這樣子一配置就算是集成alluxio了,因爲spark只是計算框架,不需要做存儲,從實現上來說也只是作爲客戶端可以對alluxio讀寫就可以。
我們做了配置之後需要同步到各個節點,我們然後在spark-shell下面可以測試一把:
先搞點數據進去,alluxio目錄下面:
./bin/alluxio fs copyFromLocal LICENSE /Input
spark-shell --master --master spark://daas-service-01:7077
輸入我們的計算任務:
val s = sc.textFile("alluxio://daas-service-01:19998/Input")
val double = s.map(line => line + line)
double.saveAsTextFile("alluxio://daas-service-01:19998/Output")
執行完成之後我們可以在alluxio中查看到生成的數據了。
SparkSql中表的操作
對錶的操作其實很簡單,我們只需要把表的location調整成alluxio的地址就行,這個和hive中是一樣的:
hive> desc formatted t3;
Database: default
Owner: hdfs
CreateTime: Sun Mar 29 16:42:50 CST 2020
LastAccessTime: UNKNOWN
Retention: 0
Location: alluxio://daas-service-01:19998/bip/hive_warehouse/t3
Table Type: MANAGED_TABLE
......
我們去spark-sql的客戶端進行操作:
spark-sql --master spark://daas-service-01:7077
我們試着像我們的t3表中寫入數據:
insert into t3 values(6);
從日誌中我們可以看到數據是寫入了alluxio中:
......
20/03/30 23:20:38 INFO [main] Hive: Renaming src: alluxio://daas-service-01:19998/bip/hive_warehouse/t3/.hive-staging_hive_2020-03-30_23-20-38_175_3335724859179367294-1/-ext-10000/part-00000-ca31676c-c4a5-43a4-b55a-1299264496dd-c000, dest: alluxio://daas-service-01:19998/bip/hive_warehouse/t3/part-00000-ca31676c-c4a5-43a4-b55a-1299264496dd-c000
......
庫的默認路徑修改
我們創建一個新表t4:
create table t4(id int);
spark-sql> desc formatted t4;
......
Database default
Table t4
Owner hdfs
Created Time Mon Mar 30 23:25:03 CST 2020
Last Access Thu Jan 01 08:00:00 CST 1970
Created By Spark 2.3.2
Location hdfs://daas-service-01/bip/hive_warehouse/t4
......
我們看到新建的表其實還是在t4下面,這個時候效果就是,如果我們執行類似create table t4 as select * from t1這種操作的時候t4還是會在我們的hdfs路徑中。當然,我們一樣可以執行命令:
alter table t4 set location "alluxio://daas-service-01:19998/bip/hive_warehouse/t4"
還有一種思路,我們的hive其實有庫級別的默認路徑的,使用hive的工具可以查詢:
爲了說明問題,我們先建立一個庫csdn:
create database csdn;
我們執行命令:
${HIVE_HOME}/bin/metatool -listFSRoot
我們可以查看我們的庫對應的根路徑:
hdfs://daas-service-01/bip/hive_warehouse/csdn.db
hdfs://daas-service-01/bip/hive_warehouse/temp.db
hdfs://daas-service-01/bip/hive_warehouse
alluxio://daas-service-01:19998/bip/hive_warehouse/alluxio.db
有個alluxio是之前做實驗生成的,我們切可以看到每一個路徑其實就是對應我們庫路徑來着,我們也看到csdn的路徑,我們把這個路徑調整爲alluxio的路徑:
${HIVE_HOME}/bin/metatool --updateLocation alluxio://daas-service-01:19998/bip/hive_warehouse/csdn.db hdfs://daas-service-01/bip/hive_warehouse/csdn.db
再次執行:
${HIVE_HOME}/bin/metatool -listFSRoot
我們可以看到csdn下面的路徑已經更新爲alluxio的路徑了:
Listing FS Roots..
alluxio://daas-service-01:19998/bip/hive_warehouse/csdn.db
hdfs://daas-service-01/bip/hive_warehouse/temp.db
hdfs://daas-service-01/bip/hive_warehouse
alluxio://daas-service-01:19998/bip/hive_warehouse/alluxio.db
我們在csdn下面建表:
spark-sql> use csdn;
spark-sql> create table t5(id int);
我們查看t5的信息:
spark-sql> desc formatted t5;
Table t5
Owner hdfs
Created Time Mon Mar 30 23:42:24 CST 2020
Last Access Thu Jan 01 08:00:00 CST 1970
Created By Spark 2.3.2
Type MANAGED
Provider hive
Table Properties [transient_lastDdlTime=1585582944]
Location alluxio://daas-service-01:19998/bip/hive_warehouse/csdn.db/t5
我們看到t5已經在alluxio下面了。我們可以想得到,csdn下面的表其實都會在alluxio裏面,我再來一張t6:
create table t6 as select id from default.t3;
我想,到了這裏,應該明白了這個規律了~~
spark-sql> desc formatted t6;
......
Location alluxio://daas-service-01:19998/bip/hive_warehouse/csdn.db/t6
直接指定
直接指定路徑其實和hive中是一樣的,在SparkSql中完全沒有問題的
CREATE TABLE u_user (
userid INT,
age INT,
gender CHAR(1),
occupation STRING,
zipcode STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '|'
STORED AS TEXTFILE
LOCATION 'alluxio://daas-service-01:19998/ml-100k';
小總結
- SparkSQL操作的精髓其實就是操作表的location就可以了,從hive到SparkSQL是一樣的,我們其實可以聯想到presto上面也是一回事。
- 生產環境也不會清一色的把表都放在alluxio,一個是也沒那麼多內存,另外來說也沒必要,我們把經常讀的表放在alluxio就可以了
- 通過指定庫路徑的方式可以讓新建的表也是alluxio的路徑,這樣有時候不需要來回操作location