加载大文件

时间:2015-11-02 21:58:19

标签: java csv timeout jobs apache-flink

我在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,

1 个答案:

答案 0 :(得分:4)

来自Robert Meztger(apache flink开发者):

  

我可以解释为什么你的第一种方法不起作用:

     

您试图将Flink客户端的CSV文件发送到   使用我们的RPC系统(Akka)的集群。当你向Flink提交工作时,   我们序列化用户创建的所有对象(映射器,源,...)   并将其发送到群集。有一种方法   StreamExecutionEnvironment.fromElements(..)允许用户使用   序列化一些对象以及作业提交。但金额   您可以像这样传输的数据受Akka帧大小的限制。   在我们的例子中,我认为默认值是10兆字节。在那之后,Akka会   可能只是删除或拒绝部署消息。

解决方案是使用富运算符而不是常规运算符(例如RichMapFunction而不是MapFunction),重写open()方法并在该方法中加载CSV文件。

谢谢罗伯特!