樓主的情況是,用自己的幾臺機器搭了spark standalone集群,用來做機器學習:生成可用樣本、特征提取、訓練、預測
第一步中,一批原始檔案經某演算法的處理生成一批可用樣本,而某演算法是用C寫的(有可執行程式和so庫)
那么問題來了:
(1)對于這種需求有什么解決方案嗎?
(2)如果將每個檔案都創建一個RDD,map時使用so庫中的函式作為映射關系,可以實作嗎?
謝謝!
uj5u.com熱心網友回復:
謝邀。不過我沒看懂。不會用spark。uj5u.com熱心網友回復:
不知道你的外部C程式的輸入、輸出是什么?我現在遇到的問題和你類似,我的方法是在rdd.mapPartitions內處理
uj5u.com熱心網友回復:
我的C程式是對一批音頻檔案進行特征提取,在單機上,輸入是音頻檔案路徑,輸出是特征值集合(寫到txt檔案里)。
我的做法是讀取全部的音頻檔案名生成rdd,而不是讀取音頻檔案本身,rdd的單個元素就變成了單個檔案名。
因為我的C程式作用于完整的音頻檔案,如果把檔案資料用于生成rdd,不知道怎樣實作想要的功能...
uj5u.com熱心網友回復:
map內的處理就是呼叫這個C程式,引數就是map得到的行資料,也就是檔案名。等待c程式行程結束后,輸出的檔案資料該咋處理咋處理。重點是這個C程式預先部署到所有work上,路徑一致就好了。
沒驗證,按說可以。
uj5u.com熱心網友回復:
檔案名集合->檔案名rdd->mapToPair(jni呼叫你c函式)->檔案名,特征集合PairRdd重點是你c的函式能不能訪問hdfs,否則你的音頻資料檔案要分發到每臺worker節點上的同一路徑下。
或者改造能接收檔案內容(即位元組陣列)而不是檔案路徑。那么流程就變為:
檔案名集合->檔案名rdd->mapToPair->檔案名,檔案內容位元組陣列RDD->map(jni呼叫你c函式)->檔案名,特征集合PairRdd
uj5u.com熱心網友回復:
對,c函式可以訪問hdfs是很重要的,不過因為c函式是直接so庫拿來用的,我沒有再寫介面讓它可以訪問jhdfs,而是用了很笨拙的方法:map的時候根據本節點分配到的檔案名,從主節點傳輸對應的檔案過來...
感覺這種做法十分失敗,完全沒有用到spark的特性,僅僅利用了rdd的分配...
uj5u.com熱心網友回復:
其實可以把音頻檔案上傳到hdfs,程式運行的時候讓executor拉到本地臨時目錄,讓c去訪問。你這樣會把主節點的網路io占滿,性能很差。最好還是能接受位元組陣列作為引數,或者能直接訪問hdfs
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/74367.html
標籤:Spark
上一篇:Spark監視UI頁面表示內容正常嗎?感覺應該有問,拜托各位幫我看看。
下一篇:hadoop集群建立后啟動不了
