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 directorymount
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
參考文件: