我们正试图在为我们的客户提供通用和特定记录格式之间做出决定
着眼于提供在线模式注册表,客户端可以在模式更新时访问。
我们希望发送以几个字节为前缀的序列化 blob,这些字节表示版本号,因此架构
从我们的注册表中检索可以自动化。
现在,我们遇到了代码示例,说明了通用格式的相对适应性
模式更改,但我们不愿意放弃特定类型提供的类型安全性和易用性
格式。
有没有办法两全其美? IE。我们可以使用和操作特定生成的
内部类,然后让它们在序列化之前自动将它们转换为通用记录?
然后客户端将反序列化通用记录(在查找模式之后)。
此外,客户是否可以将他们收到的这些通用记录稍后转换为特定记录?一些小代码示例会有所帮助!
或者我们是否以错误的方式看待这一切?
最佳答案
您正在寻找的是 Confluent Schema 注册表服务和有助于与此集成的库。
提供一个示例来编写 Serialize De-serialize avro 数据的演变模式。请注意提供来自 Kafka 的样本。
import io.confluent.kafka.serializers.KafkaAvroDeserializer;
import io.confluent.kafka.serializers.KafkaAvroSerializer;
import org.apache.avro.generic.GenericRecord;
import org.apache.commons.codec.DecoderException;
import org.apache.commons.codec.binary.Hex;
import java.util.HashMap; import java.util.Map;
public class ConfluentSchemaService {
public static final String TOPIC = "DUMMYTOPIC";
private KafkaAvroSerializer avroSerializer;
private KafkaAvroDeserializer avroDeserializer;
public ConfluentSchemaService(String conFluentSchemaRigistryURL) {
//PropertiesMap
Map<String, String> propMap = new HashMap<>();
propMap.put("schema.registry.url", conFluentSchemaRigistryURL);
// Output afterDeserialize should be a specific Record and not Generic Record
propMap.put("specific.avro.reader", "true");
avroSerializer = new KafkaAvroSerializer();
avroSerializer.configure(propMap, true);
avroDeserializer = new KafkaAvroDeserializer();
avroDeserializer.configure(propMap, true);
}
public String hexBytesToString(byte[] inputBytes) {
return Hex.encodeHexString(inputBytes);
}
public byte[] hexStringToBytes(String hexEncodedString) throws DecoderException {
return Hex.decodeHex(hexEncodedString.toCharArray());
}
public byte[] serializeAvroPOJOToBytes(GenericRecord avroRecord) {
return avroSerializer.serialize(TOPIC, avroRecord);
}
public Object deserializeBytesToAvroPOJO(byte[] avroBytearray) {
return avroDeserializer.deserialize(TOPIC, avroBytearray);
} }
以下类(class)包含您正在寻找的所有代码。
io.confluent.kafka.serializers.KafkaAvroDeserializer;
io.confluent.kafka.serializers.KafkaAvroSerializer;
请点击链接了解更多详情:
http://bytepadding.com/big-data/spark/avro/avro-serialization-de-serialization-using-confluent-schema-registry/
关于serialization - Avro 特定与通用记录类型 - 哪个最好,或者我可以在两者之间转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33882095/