我在集群中有以下代碼:
def main(args: Array[String]) {
val spark = SparkSession.builder.appName("SparkData").getOrCreate()
val sc = spark.sparkContext
sc.setLogLevel("ERROR")
import spark.implicits._
import spark.sql
//----------Write Logic Here--------------------------
//Read csv file
val df = spark.read.format("csv").load("books.csv")//Here i want to accept parameter
df.show()
spark.stop
}
我想將不同的檔案傳遞給spark.read.formatusingspark-submit命令。檔案在我的linux box. 我用過這個:
csv_file="/usr/usr1/Test.csv"
spark2-submit \
--num-executors 30 \
--driver-memory 12g \
--executor-memory 14g \
--executor-cores 4 \
--class driver_class \
--name TTTTTT \
--master yarn \
--deploy-mode cluster \
--files myprop.properties,${csv_file} \
abc.jar
然而,該程式只是嘗試從 hdfs cluseter 的根檔案夾中查找路徑,并說沒有找到例外檔案。任何人都可以幫助我使用我提到的檔案路徑中的檔案。所以我希望我的 spark 程式從我說的路徑中讀取檔案。不是從根本上。
我試過:
def main(args: Array[String]) {
val spark = SparkSession.builder.appName("SparkData").getOrCreate()
val sc = spark.sparkContext
sc.setLogLevel("ERROR")
import spark.implicits._
import spark.sql
val filepath = args(0)
//----------Write Logic Here--------------------------
//Read csv file
val df = spark.read.format("csv").load(filepath)//Here i want to accept parameter
df.show()
spark.stop
}
下面用于提交哪些不起作用:
csv_file="/usr/usr1/Test.csv"
spark2-submit \
--num-executors 30 \
--driver-memory 12g \
--executor-memory 14g \
--executor-cores 4 \
--class driver_class \
--name TTTTTT \
--master yarn \
--deploy-mode cluster \
--files myprop.properties \
abc.jar ${csv_file}
但程式并沒有挑剔。有人可以幫忙嗎?
uj5u.com熱心網友回復:
本地檔案 URL 格式應為:
csv_file="file:///usr/usr1/Test.csv".
請注意,本地檔案也必須可以在所有作業節點上的同一路徑上訪問。將檔案復制到所有作業人員或使用網路安裝的共享檔案系統。
uj5u.com熱心網友回復:
我現在手上沒有集群,所以我無法測驗它。然而:
- 您將代碼提交給紗線,因此它將在集群節點之一上部署 spark 驅動程式。但你不知道是哪個。
- 當讀取以“file://”或沒有開頭的檔案型別路徑時,spark 將在驅動程式運行所在節點的檔案系統上查找檔案。
- 正如您所看到的,使用 sparp-submit --file 會將檔案復制到 spark 驅動程式的起始檔案夾中(因此在主節點上)。路徑是任意之王,你不應該試圖推斷它。
但也許它可以作為引數傳遞給 spark.read 只是讓 spark 驅動程式在其起始檔案夾中查找檔案名(但我沒有檢查):
spark-submit\
...\
--files ..., /path/to/your/file.csv\
abs.jar file.csv
=> 正確/標準的方法是:首先將檔案復制到 hdfs 或 Spark 集群可以訪問的其他分布式檔案系統上。然后,您可以為 spark 應用程式提供要使用的 hdfs 檔案路徑。類似的東西(再次,沒有測驗)
hdfs fs -put /path/to/your/file.csv /user/your/data
spark-submit ... abc.jar hdfs:///user/your/data/file.csv
有關資訊,如果您不知道:要使用 hdfs 命令,您需要在您的機器上安裝 hdfs 客戶端(實際hdfs命令),并使用合適的配置指向 hdfs 集群。此外,通常還需要在集群上進行安全配置,以便客戶端與其進行通信。但是另一個依賴于 hdfs 的問題正在運行(本地,aws,...)
uj5u.com熱心網友回復:
${csv_file}在spark-submit命令末尾替換為basename ${csv_file}:
spark2-submit \
... \
--files myprop.properties,${csv_file} \
abc.jar `basename ${csv_file}`
basename 從完整路徑中去除目錄部分,只留下檔案名:
$ basename /usr/usr1/foo.csv
foo.csv
這樣 Spark 會將檔案復制到暫存目錄,并且驅動程式應該能夠通過其相對路徑訪問它。如果集群配置為在 HDFS 上暫存,則執行程式也可以訪問該檔案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/324520.html
下一篇:選擇串列中每個串列的第一個元素
