Databricks 第5篇:Databricks檔案系統(DBFS)

悅光陰發表於2021-01-12

Databricks 檔案系統 (DBFS,Databricks File System) 是一個裝載到 Azure Databricks 工作區的分散式檔案系統,可以在 Azure Databricks 群集上使用。 一個儲存物件是一個具有特定格式的檔案,不同的格式具有不同的讀取和寫入的機制。

DBFS 是基於可縮放物件儲存的抽象,可以根據使用者的需要動態增加和較少儲存空間的使用量,Azure Databricks中裝載的DBFS具有以下優勢:

  • 裝載(mount)儲存物件,無需憑據即可無縫訪問資料。
  • 使用目錄和檔案語義(而不是儲存 URL)與物件儲存進行互動。
  • 將檔案儲存到物件儲存,因此在終止群集後不會丟失資料。

Azure Databricks是一個分散式的計算系統,Cluster提供算力資源,包括CPU、記憶體和網路等資源,而DBFS提供資料和檔案的儲存空間、對檔案的讀寫能力,它是Azure Databricks中一個非常重要基礎設施。

一,DBFS根

DBFS 中預設的儲存位置稱為 DBFS 根(root),以下 DBFS 根位置中儲存了幾種型別的資料:

  • /FileStore:匯入的資料檔案、生成的繪圖以及上傳的庫
  • /databricks-datasets:示例公共資料集,用於學習Spark或者測試演算法。
  • /databricks-results:通過下載查詢的完整結果生成的檔案。
  • /tmp:儲存臨時資料的目錄
  • /user:儲存各個使用者的檔案
  • /mnt:(預設是不可見的)裝載(掛載)到DBFS的檔案,寫入裝載點路徑(/mnt)中的資料儲存在DBFS根目錄之外。

在新的工作區中,DBFS 根具有以下預設資料夾:

DBFS 根還包含不可見且無法直接訪問的資料,包括裝入點後設資料(mount point metadata)和憑據(credentials )以及某些型別的日誌。

DBFS還有兩個特殊根位置是:FileStore 和 Azure Databricks Dataset。

  • FileStore是一個用於儲存檔案的儲存空間,可以儲存的檔案有多種格式,主要包括csv、parquet、orc和delta等格式。
  • Dataset是一個示例資料集,使用者可以通過該示例資料集來測試演算法和Spark。

訪問DBFS,通常是通過pysaprk.sql 模組、dbutils和SQL。

二,使用pyspark.sql模組訪問DBFS

使用pyspark.sql模組時,通過相對路徑"/temp/file" 引用parquet檔案,以下示例將parquet檔案foo寫入 DBFS /tmp 目錄。

#df.write.format("parquet").save("/tmp/foo",mode="overwrite")
df.write.parquet("/tmp/foo",mode="overwrite")

並通過Spark API讀取檔案中的內容:

#df =  spark.read.format("parquet").load("/tmp/foo")
df = spark.read.parquet("/tmp/foo")

三,使用SQL 訪問DBFS

對於delta格式和parquet格式的檔案,可以在SQL中通過 delta.`file_path`  或 parquet.`file_path`來訪問DBFS:

select *
from delta.`/tmp/delta_file`

select *
from parquet.`/tmp/parquet_file`

注意,檔案的格式必須跟擴充套件的命令相同,否則報錯;檔案的路徑不是通過單引號括起來的,而是通過 `` 來實現的。

四,使用dbutils訪問DBFS

dbutils.fs 提供與檔案系統類似的命令來訪問 DBFS 中的檔案。 本部分提供幾個示例,說明如何使用 dbutils.fs 命令在 DBFS 中寫入和讀取檔案。

1,檢視DBFS的目錄

在python環境中,可以通過dbutils.fs來檢視路徑下的檔案:

display(dbutils.fs.ls("dbfs:/foobar"))

2,讀寫資料

在 DBFS 根中寫入和讀取檔案,就像它是本地檔案系統一樣。

# create folder
dbutils.fs.mkdirs("/foobar/")

# write data
dbutils.fs.put("/foobar/baz.txt", "Hello, World!")

# view head
dbutils.fs.head("/foobar/baz.txt")

# remove file
dbutils.fs.rm("/foobar/baz.txt")

# copy file
dbutils.fs.cp("/foobar/a.txt","/foobar/b.txt")

3,命令的幫助文件

dbutils.fs.help()

dbutils.fs 主要包括兩跟模組:操作檔案的fsutils和裝載檔案的mount

fsutils

cp(from: String, to: String, recurse: boolean = false): boolean -> Copies a file or directory, possibly across FileSystems
head(file: String, maxBytes: int = 65536): String -> Returns up to the first 'maxBytes' bytes of the given file as a String encoded in UTF-8
ls(dir: String): Seq -> Lists the contents of a directory
mkdirs(dir: String): boolean -> Creates the given directory if it does not exist, also creating any necessary parent directories
mv(from: String, to: String, recurse: boolean = false): boolean -> Moves a file or directory, possibly across FileSystems
put(file: String, contents: String, overwrite: boolean = false): boolean -> Writes the given String out to a file, encoded in UTF-8
rm(dir: String, recurse: boolean = false): boolean -> Removes a file or directory

mount

mount(source: String, mountPoint: String, encryptionType: String = "", owner: String = null, extraConfigs: Map = Map.empty[String, String]): boolean -> Mounts the given source directory into DBFS at the given mount point
mounts: Seq -> Displays information about what is mounted within DBFS
refreshMounts: boolean -> Forces all machines in this cluster to refresh their mount cache, ensuring they receive the most recent information
unmount(mountPoint: String): boolean -> Deletes a DBFS mount point

 

 

參考文件:

Databricks 檔案系統 (DBFS)

相關文章