kafka可以通过自定义Sink的方式实现数据搜集并写入各种LOTP数据库,下面的例子是通过自定义Source实现数据写入分布式K-V数据库Aerospike.
1. 自定义Sink代码如下
package kafka_sink.asd;
import java.io.IOException;
import java.net.ConnectException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import org.apache.flume.Channel;
import org.apache.flume.Constants;
import org.apache.flume.Context;
import org.apache.flume.Event;
import org.apache.flume.EventDeliveryException;
import org.apache.flume.Transaction;
import org.apache.flume.conf.Configurable;
import org.apache.flume.sink.AbstractSink;
import com.aerospike.client.AerospikeException;
import com.aerospike.client.Bin;
import com.aerospike.client.Key;
import com.aerospike.client.Record;
import com.aerospike.client.async.AsyncClient;
import com.aerospike.client.listener.RecordListener;
import com.aerospike.client.listener.WriteListener;
import com.aerospike.client.policy.WritePolicy;
import com.aerospike.client.async.AsyncClientPolicy;
import com.aerospike.client.policy.Policy;
import com.aerospike.client.Host;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Asdsink extends AbstractSink implements Configurable {
//private String myProp;
public static final String TOPIC_HDR = "topic";
public static final String KEY_HDR = "key";
//private String mz_tag_topic;
//private AerospikeClient asd_client;
private String ASD_HOST1;
private String ASD_HOST2;
private int ASD_PORT;
private String ASD_NAME_SPACE = "cm";
private String MZ_SET_NAME;
private String MZ_BIN_NAME;
private int batchSize;// 一次事务的event数量,整体提交
private WritePolicy write_policy;
private Policy policy;
//Async Read and Write
private AsyncClient asd_async_client;
private AsyncClientPolicy async_client_policy;
private boolean completed;
@Override
public void configure(Context context) {
//String myProp = context.getString("myProp", "defaultValue");
// Process the myProp value (e.g. validation)
// Store myProp for later retrieval by process() method
//this.myProp = myProp;
ASD_HOST1 = context.getString("asd_host1", "127.0.0.1");
ASD_HOST2 = context.getString("asd_host2", "127.0.0.1");
ASD_PORT = context.getInteger("asd_port",3000);
SET_NAME = context.getString("set_name", "xxx");
BIN_NAME = context.getString("bin_name", "xxx");
batchSize = context.getInteger("batchSize",1000);
System.out.printf("ASD_HOST1:%s\n",ASD_HOST1);
System.out.printf("ASD_HOST2:%s\