Flink kuduSink開發

碼以致用發表於2020-05-26

1、繼承RichSinkFunction

(1)首先在構造方式傳入kudu的masterAddress地址、預設表名、TableSerializationSchema、KuduTableRowConverter、Properties配置物件

(2)重寫open方法

初始化KuduClient物件操作kudu,KuduSession物件並傳入一堆配置

(3)重寫invoke方法

核心是如果已傳入TableSerializationSchema物件,則通過其serializeTable方法從輸入的json資料裡提取表名,如果未定義則直接取預設表名。拿到表名後就能使用KuduClient物件對其操作了

if (schema != null) {
String serializeTableName = schema.serializeTable(row);
if (serializeTableName == null) return;
table = client.openTable(serializeTableName);
}
else
table = client.openTable(tableName);
insert = table.newInsert();

2、定義KuduTableRowConverter介面,將每一條輸入資料轉換成TableRow物件

public interface KuduTableRowConverter<IN> extends Serializable {
TableRow convert(IN value);
}

定義TableRow類,代表一行資料,key是字串型的鍵名,value是Object型的鍵值

public class TableRow implements Serializable {
private static final long serialVersionUID = 1L;
private Map<String, Object> pairs = new HashMap<>();
public int size() {return pairs.size();}
public Map<String, Object> getPairs() {return pairs;}
public Object getElement(String key) {return pairs.get(key);}
public void putElement(String key, Object value) {pairs.put(key, value);}
}

定義JsonKuduTableRowConverter實現KuduTableRowConverter介面,對於輸入的json資料,通過一系列轉換邏輯轉換成TableRow物件

3、定義TableSerializationSchema介面,從每一條輸入資料裡提取表名

public interface TableSerializationSchema<IN> extends Serializable {
String serializeTable(IN value);
}

定義JsonLogidKeyTableSerializationSchema實現TableSerializationSchema介面,對於輸入的json資料,使用指定key值提取value值,然後再從一個預先獲取的map裡找到這個value對應的表名,然後加上必要的字首與字尾組成impala的表名

相關文章