|
@@ -0,0 +1,85 @@
|
|
|
+package com.winhc.bigdata.flink.java.sink;
|
|
|
+
|
|
|
+import com.alibaba.hologres.client.HoloClient;
|
|
|
+import com.alibaba.hologres.client.Put;
|
|
|
+import com.winhc.bigdata.flink.java.entity.PutDataCollection;
|
|
|
+import com.winhc.bigdata.flink.java.utils.HoloUtils;
|
|
|
+import org.apache.commons.logging.Log;
|
|
|
+import org.apache.commons.logging.LogFactory;
|
|
|
+import org.apache.flink.configuration.Configuration;
|
|
|
+import org.apache.flink.runtime.state.FunctionInitializationContext;
|
|
|
+import org.apache.flink.runtime.state.FunctionSnapshotContext;
|
|
|
+import org.apache.flink.streaming.api.checkpoint.CheckpointedFunction;
|
|
|
+import org.apache.flink.streaming.api.functions.sink.RichSinkFunction;
|
|
|
+import org.apache.hadoop.hbase.client.BufferedMutator;
|
|
|
+import org.apache.hadoop.hbase.client.RetriesExhaustedWithDetailsException;
|
|
|
+import org.postgresql.model.TableSchema;
|
|
|
+
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+import java.util.concurrent.atomic.AtomicReference;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @author π
|
|
|
+ * @Description:
|
|
|
+ * @date 2021/10/22 10:37
|
|
|
+ */
|
|
|
+public class HoloPojoSink extends RichSinkFunction<PutDataCollection> implements CheckpointedFunction, BufferedMutator.ExceptionListener {
|
|
|
+
|
|
|
+ static Log log = LogFactory.getLog(HoloPojoSink.class);
|
|
|
+
|
|
|
+ private HoloClient holoClient = null;
|
|
|
+
|
|
|
+ private AtomicReference<Throwable> failureThrowable =new AtomicReference<Throwable>();
|
|
|
+
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void open(Configuration parameters) throws Exception {
|
|
|
+ log.info("init holo..");
|
|
|
+ holoClient = HoloUtils.init();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void invoke(PutDataCollection data, Context context) throws Exception {
|
|
|
+ for (Map.Entry<String, List<Map<String, Object>>> entry : data.getData().entrySet()) {
|
|
|
+ String tableName = entry.getKey();
|
|
|
+ List<Map<String, Object>> list = entry.getValue();
|
|
|
+ TableSchema tableSchema = holoClient.getTableSchema(tableName);
|
|
|
+
|
|
|
+ List<Put> puts = list.stream().map(m -> {
|
|
|
+ Put put = new Put(tableSchema);
|
|
|
+ m.forEach(put::setObject);
|
|
|
+ return put;
|
|
|
+ }).collect(Collectors.toList());
|
|
|
+ holoClient.put(puts);
|
|
|
+ holoClient.flush(); //强制提交所有未提交put请求
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void close() throws Exception {
|
|
|
+ if (holoClient != null) {
|
|
|
+ holoClient.close();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private void checkErrorAndRethrow() {
|
|
|
+ Throwable throwable = failureThrowable.get();
|
|
|
+ if (throwable != null) throw new RuntimeException("An error occurred in HoloPojoSink.", throwable);
|
|
|
+ }
|
|
|
+ @Override
|
|
|
+ public void snapshotState(FunctionSnapshotContext context) throws Exception {
|
|
|
+ checkErrorAndRethrow();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void initializeState(FunctionInitializationContext context) throws Exception {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void onException(RetriesExhaustedWithDetailsException e, BufferedMutator bufferedMutator) throws RetriesExhaustedWithDetailsException {
|
|
|
+ failureThrowable.compareAndSet(null, e);
|
|
|
+ }
|
|
|
+}
|