public static void main(String[] args) throws Exception {
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setParallelism(1);
DataStreamSource<Event> stream = env.addSource(new ClickSource());
HashSet<InetSocketAddress> addresses = new HashSet<>();
addresses.add(new InetSocketAddress(HOST_NAME,6380)); // 这里一定要是hostname,不是IP!!!
addresses.add(new InetSocketAddress(HOST_NAME,6381));
addresses.add(new InetSocketAddress(HOST_NAME,6382));
FlinkJedisClusterConfig config = new FlinkJedisClusterConfig.Builder()
.setNodes(addresses)
.build();
// 写入redis
stream.addSink(new RedisSink<>(config, new MyRedisMapper()));
env.execute();
}
// 自定义类实现RedisMapper接口
public static class MyRedisMapper implements RedisMapper<Event>{
@Override
public RedisCommandDescription getCommandDescription() {
return new RedisCommandDescription(RedisCommand.HSET, "clicks");
}
@Override
public String getKeyFromData(Event event) {
return event.user;
}
@Override
public String getValueFromData(Event event) {
return event.url;
}
}
需要注意的是,连接redis的时候,写的一定是hostname,而不是IP地址!!!
FlinkJedisClusterConfig这个类是不支持setPassword,所以搭建redis集群的时候最好不要设置密码。也可以重写这个类,手动支持setPassword,网上有资料,这里不多赘述。