3

この単純なアプリは、ヘッダーを含むコンマ delim ファイルを受け取り、Cassandra に挿入します。これは小さなファイルで機能しますが、メモリ不足の例外によってファイルが強制終了されるまで、メモリは増加します。

私は何が欠けていますか?

package com.company;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import me.prettyprint.cassandra.serializers.StringSerializer;
import me.prettyprint.hector.api.Cluster;
import me.prettyprint.hector.api.Keyspace;
import me.prettyprint.hector.api.beans.HColumn;
import me.prettyprint.hector.api.factory.HFactory;
import me.prettyprint.hector.api.mutation.Mutator;

public class QuickLoad {
    public static Keyspace keyspace = null;
    public static void main(String[] args) {
        File file = new File(args[0]);
        String keyspaceName = args[1];
        String columnFamilyName = args[2];
        BufferedReader reader = null;
        try {
            keyspace = GetKeyspace(keyspaceName);
            reader = new BufferedReader(new FileReader(file));
            String fileLine = null;
            String[] headers = null;
            String[] fields = null;
            boolean headerLine = true;

            while ((fileLine = reader.readLine()) != null) {
                if (headerLine){
                    headerLine = false;
                    headers = fileLine.substring(1, fileLine.length()-1).split("\",\"");
                } else {
                    fields = fileLine.substring(1, fileLine.length()-1).split("\",\"");
                    CassandraSave(keyspace, columnFamilyName, headers, fields);
                }
            }
        }
        catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (reader != null) {
                    reader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        System.exit(0);
    }

    public static void CassandraSave(Keyspace keyspace, String columnFamily, String[] headers, String[] columns) 
    {
        try 
        {
            Mutator mutator = HFactory.createMutator(keyspace, StringSerializer.get());
            for (int i = 1; i < headers.length-1; i++)
            {
                if ((columns[i] != null) || (!columns[i].equals("null"))) {
                    if (columns[i].length() > 0) {
                        HColumn<String, String> col = HFactory.createStringColumn(headers[i], columns[i]);
                        mutator.insert(columns[1], columnFamily, col);
                    }
                }
            }
            mutator.execute();
        } catch (Exception e){
            e.printStackTrace();
        }
    }

    public static Keyspace GetKeyspace(String keyspaceName)
    {
        String serverAddress = "localhost:9160";
        Cluster cluster = HFactory.getOrCreateCluster("My Cluster", serverAddress);
        Keyspace keyspace = HFactory.createKeyspace(keyspaceName, cluster);
        return keyspace;
    }

}
4

3 に答える 3

1

入力ファイルの「列」の1つが割り当てられたヒープよりも大きい場合、これが問題になる可能性があります。ミューテーションのサイズに上限を設定することで、これを修正できる場合があります。CassandraSave 関数は、1 回の操作で 100 程度のミューテーションしか行いません。

于 2011-08-26T15:43:54.137 に答える
1

「sun.misc.Launcher$AppClassLoader @ 0x899902f8」によってロードされる「com.ecyrd.speed4j.log.PeriodicalLog」の 1 つのインスタンスは、127,293,432 (99.62%) バイトを占有します。キーワード com.ecyrd.speed4j.log.PeriodicalLog sun.misc.Launcher$AppClassLoader @ 0x899902f8

古いバージョンの hector を使用していて、speed4j がメモリをリークするバグに遭遇しているようです。hector 0.8.0-2 にアップグレードすると、修正されるはずです。

注意すべきことの 1 つは、speed4j が 0.8.0-2 ではデフォルトで無効になっていることです。有効にする場合は、このスレッドを参照してください。

于 2011-08-31T00:53:53.547 に答える
1

シングル スレッドであり、バッチ サイズがかなり小さいという 2 つの点があります。

外部ループを追加して、約 500 行のバッチ サイズでミューテーターに挿入を収集して開始し、それがどのように進行するかを確認します。ストレステストに使用するパフォーマンスミューテーター挿入の例を次に示し ます。

また、少し古いですが、あなたが説明したものと同様に機能する並列化されたローダーへのアプローチの要点を次に示します: https://gist.github.com/397574

于 2011-09-02T15:58:18.807 に答える