簡體   English   中英

加載大文件時Flink作業掛起提交

[英]Flink job hangs on submission when loading big file

我用Java編寫了一個Flink流作業,該作業加載一個包含訂戶數據(4列)的csv文件,然后從套接字流中讀取數據,同時與訂戶數據進行匹配。

最初,我使用的是一個小的csv文件(8 MB),並且一切正常。

# flink run analytics-flink.jar 19001 /root/minisubs.csv /root/output.csv
loaded 200000 subscribers from csv file
11/02/2015 16:36:59 Job execution switched to status RUNNING.
11/02/2015 16:36:59 Socket Stream -> Flat Map -> Filter -> Map -> Stream Sink(1/1) switched to SCHEDULED 
11/02/2015 16:36:59 Socket Stream -> Flat Map -> Filter -> Map -> Stream Sink(1/1) switched to DEPLOYING 
11/02/2015 16:36:59 Socket Stream -> Flat Map -> Filter -> Map -> Stream Sink(1/1) switched to RUNNING

我將csv文件切換到了一個更大的文件(〜45 MB),現在我看到的是:

# flink run analytics-flink.jar 19001 /root/subs.csv /root/output.csv
loaded 1173547 subscribers from csv file

請注意,上面的訂戶數是文件中的行數。 我試圖在Flink配置中查找任何超時,但找不到任何超時。

任何幫助是極大的贊賞!

編輯:通過使用commons-csv 1.2庫,使用此方法加載CSV:

private static HashMap<String, String> loadSubscriberGroups(
            String referenceDataFile) throws IOException {
        HashMap<String,String> subscriberGroups = new HashMap<String, String>();

        File csvData = new File(referenceDataFile);
        CSVParser parser = CSVParser.parse(csvData, Charset.defaultCharset(), CSVFormat.EXCEL);
        for (CSVRecord csvRecord : parser) {
            String imsi = csvRecord.get(0);
            String groupStr = csvRecord.get(3);

            if(groupStr == null || groupStr.isEmpty()) {
                continue;
            }
            subscriberGroups.put(imsi, groupStr);
        }

        return subscriberGroups;
    }

這是文件的示例(我知道結尾處有一個逗號,現在最后一列為空):

450000000000001,450000000001,7752,Tier-2,
450000000000002,450000000002,1112,Tier-1,
450000000000003,450000000003,6058,Tier-2,

來自Robert Meztger(Apache Flink開發人員):

我可以解釋為什么您的第一種方法不起作用:

您試圖使用我們的RPC系統(Akka)將CSV文件從Flink客戶端發送到群集。 當您向Flink提交作業時,我們會序列化用戶創建的所有對象(映射器,源等)並將其發送到集群。 有一種方法StreamExecutionEnvironment.fromElements(..),它允許用戶序列化一些對象以及作業提交。 但是,您可以像這樣傳輸的數據量受Akka幀大小的限制。 在我們的情況下,我認為默認值為10兆字節。 之后,Akka可能只是丟棄或拒絕部署消息。

解決方案是使用富運算符代替常規運算符(例如,RichMapFunction代替MapFunction),覆蓋open()方法並在該方法內部加載CSV文件。

謝謝羅伯特!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM