SparkSQL整合Alluxio實操

前言

在前面的文章我做了一個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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章