落下カサンドラのためFLINK非同期IO

 

 あなたは、パフォーマンスを犠牲にすることなく、スケーラビリティと高可用性を必要とする場合は、Apache Cassandraの「データベース」の正しい選択です。
 コモディティ・ハードウェアやインフラストラクチャのフォールトトレランスのリニアなスケーラビリティと実績のあるクラウドは、ミッションクリティカルなデータのための完璧なプラットフォームになります。
 複数のデータセンターのレプリケーション間カサンドラ・サポートは、それがユーザーのために低レイテンシーを提供し、その種の最高で、そしてユーザーが後ろに座るとリラックスすることができ、文化の中で生き残る(停電)を中断することができます。

カサンドラ

カサンドラはすぐに中断されない大量のデータを管理することができます。
カサンドラクエリ言語(CQL)で
カサンドラ設定ファイル
DataStaxドキュメント
火花カサンドラ・コネクタ
本番環境の安定バージョン3.11.4。注FLINK -コネクタ-カサンドラクライアントdatastaxバージョン。

ソース

スタンドアローンおよびクラスタ構成

デフォルトの設定ファイル

1
./conf/cassandra.yaml

 

1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21
最小構成:   
CLUSTER_NAME:クラスタ名の
種子:クラスタノード種のコンマ区切りリストとIPアドレス
storage_port:RPC通信のためのクラスタノード間のポート番号。デフォルトの7000には、セキュリティ上の理由から、外部のネットワークにさらされていません。
listen_address:ノードについてノードのIPアドレスは、互いに通信します。あなたもなく、同じ時間とlisten_address設定で、カードの特定の使用を指定listen_interfaceを設定することができます。
native_transport_port:アクセスクライアントポートを使用。

ユーザー名パスワード設定(ユーザーは、一般的に異なる役割を作成し、適切な権限DDLとDMLを割り当てる):   
認証:PasswordAuthenticator 
オーソ:CassandraAuthorizerの

ディレクトリ構成:
data_file_directories:データファイルの保存場所は、複数のディスクなどの1つのまたは複数のディレクトリ、することができ
commitlog_directory:commitlogファイルが置かれている場所、パフォーマンス上の理由から、データファイルやディレクトリは異なるディスク上に保存することができます
saved_caches_directory:キャッシュファイルディレクトリ
hints_directory:ディレクトリのヒント

などJVM_OPTSのようcassandra-env.sh設定ファイルの環境変数、

ログ出力:  
logbackを使用して、編集logback.xmlファイルが変更されます。出力SYSTEM.LOGにINFOデフォルトの出力レベル、DEBUG.LOGにデバッグレベル。カサンドラは、コンソールにフォアグラウンドのINFOレベルのログ出力で実行されます。

クライアントAPIおよびクライアントツール

FLINK-コネクタカサンドラをdatastaxに基づいているジャーを用いFLINK。

API示例代码:
com.datastax.driver.core.querybuilder.Insert
com.datastax.driver.core.querybuilder.Update
com.datastax.driver.core.querybuilder.Select
com.datastax.driver.core.querybuilder.Delete

これは、Navicatはクライアントが使用するRazorSQLに似ているクエリ、編集、検索、およびデータベースの管理します

構築されたテーブル、クエリ、およびプラグインの更新

テーブルを作成するには

1 
2 
3 
4 
5 
6 
7 
8
テーブルexcelsior.tをドロップ。
表excelsior.t(作成
	PK INT、
	T INT、
	S VARCHAR、
	VのVARCHAR、
	主キー(PK、t)を
)。

画像

お問い合わせ

1
excelsior.tから*を選択します。

プラグインのアップデート

1 
2
excelsior.t挿入(PK、T)
の値(5,6)。

画像

1 
2
insert into  excelsior.t (pk, t, s)
values (5,6,'s2');

画像

1
2
insert into  excelsior.t (pk, t, s)
values (5,6,'s5');

画像

1
2
insert into  excelsior.t (pk, t, s)
values (5,6,null);

画像

1
2
insert into  excelsior.t (pk, t, s, v)
values (5,6,'s6','v8');

画像

1
2
insert into  excelsior.t (pk, t, v)
values (5,6,'v9');

画像

异步Job

创建表

画像

构造10万条消息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
for (int i = 0; i < 100000; i++) {
    POJO pojo = new POJO();
    int j = random.nextInt(5);
    pojo.setAid("ID000-" + i);
    pojo.setAname("NAME-" + i);
    pojo.setAstyle("STYLE000-" + j);
    pojo.setEnergy(new BigDecimal(random.nextInt(1000)).setScale(2, RoundingMode.HALF_UP));
    pojo.setAge((j == 0 ? 1 : j) * 13);
    long time = System.currentTimeMillis();
    pojo.setTt(new Date(time));
    pojo.setLogTime(time);

    ZoneId shanghaiZoneId = ZoneId.of("Asia/Shanghai");
    ZonedDateTime shanghaiZonedDateTime = ZonedDateTime.now(shanghaiZoneId);

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");

    pojo.setCreateTime(shanghaiZonedDateTime.format(formatter));
    pojo.setUpdateTime(shanghaiZonedDateTime.format(formatter));

    pojo.setAstatus("0" + j);

    String value = gson.toJson(pojo);

    producer.send(new ProducerRecord<String, String>(AsyncCassandraJob.class.getSimpleName(), Integer.toString(i), value));

    System.out.println(value);
}

AsyncCassandraRequest

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
/**
 * AsyncCassandraRequest
 */
public class AsyncCassandraRequest extends RichAsyncFunction<POJOWrapper, String> {

    private static final long serialVersionUID = -3713249881014861537L;

    Logger logger = LoggerFactory.getLogger(AsyncCassandraRequest.class);

    private transient Cluster cluster;
    private transient ListenableFuture<Session> session;

    @Override
    public void open(Configuration parameters) throws Exception {
        // 配置与Cassandra集群之间的Socket连接参数
        SocketOptions so = new SocketOptions()
                // 读取数据超时时间 默认12000
                .setReadTimeoutMillis(30000)
                // 连接超时时间 默认5000
                .setConnectTimeoutMillis(30000);

        // 连接池相关的参数
        PoolingOptions poolingOptions = new PoolingOptions()
                // 每个连接的最大并发请求数 默认-2147483648
                .setMaxRequestsPerConnection(HostDistance.LOCAL, 32768)
                // 每个Cassandra节点多少个连接 核心连接数和最大连接数
                .setConnectionsPerHost(HostDistance.LOCAL, 4, 10)
                // 心跳间隔 默认30秒
                .setHeartbeatIntervalSeconds(60)
                // 连接池超时时间 默认5000
                .setPoolTimeoutMillis(30000);

        // 写数据时的数据一致性级别 QUORUM=至少成功写入Q个复制节点(Q=N/2+1)
        QueryOptions queryOptions = new QueryOptions().setConsistencyLevel(ConsistencyLevel.QUORUM);

        // 重试策略 如果做了预合并 加上Cassandra的插入式更新,可以多尝试几次直到成功
        // DowngradingConsistencyRetryPolicy:会降级的一致性,意思是重试之后的一致性要比初次的一致性级别低,也就是会保证最终一致性
        // 使用LoggingRetryPolicy包装一下
        RetryPolicy retryPolicy = new LoggingRetryPolicy(DowngradingConsistencyRetryPolicy.INSTANCE);

        cluster = Cluster.builder().addContactPoint("127.0.0.1").withSocketOptions(so)
                .withClusterName("Test Cluster")
//                .withCredentials("username", "password")
                .withPoolingOptions(poolingOptions)
                .withQueryOptions(queryOptions)
                .withRetryPolicy(retryPolicy)
                // 负载均衡策略 RoundRobinPolicy Hash取模
                .withLoadBalancingPolicy(new RoundRobinPolicy())
                .withPort(9042).build();

        session = cluster.connectAsync();
    }

    @Override
    public void close() throws Exception {
        if (cluster != null) {
            cluster.close();
        }
    }

    @Override
    public void timeout(POJOWrapper input, ResultFuture<String> resultFuture) {
        logger.info("timeout: " + input);
    }

    @Override
    public void asyncInvoke(POJOWrapper input, ResultFuture<String> resultFuture) throws Exception {
        System.out.println("asyncInvoke: " + Thread.currentThread().getName());

        ListenableFuture<ResultSet> resultSet = Futures.transform(session, new AsyncFunction<Session, ResultSet>() {
            @Override
            public ListenableFuture<ResultSet> apply(Session session) throws Exception {
                System.out.println(CqlHelper.createInsertQuery(input, false));
                return session.executeAsync(CqlHelper.createInsertQuery(input, false));
            }
        });

        Futures.addCallback(resultSet, new FutureCallback<ResultSet>() {
            @Override
            public void onSuccess(@Nullable ResultSet rows) {
                System.out.println("rows: " + rows);
                resultFuture.complete(Arrays.asList("success"));
            } 

            @Override 
            公共ボイドONFAILURE(Throwableをスロー可能){ 
                throwable.printStackTrace()。
            } 
        })。
    } 
}

10万データウェアハウジング

画像

時間

画像

公開された17元の記事 ウォンの賞賛2 ビュー50000 +

おすすめ

転載: blog.csdn.net/u011250186/article/details/103894642