Avro Schema Evolution
schema evolution不知道中文官方翻譯是什么,schema演化?進化?不管了,懂意思就好。本篇文章主要介紹一下Avro Schema進化后的一些兼容性問題。
Schema Evolution有4種:
Backward: 向后兼容,用新schema可以讀取舊數據,有些字段沒有數據,就用default值
Forward: 向前兼容,用舊schema可以讀取新數據,avro將忽略新加的字段
Full: 全兼容,支持向前兼容,向后兼容
Breaking: 不兼容
1. Backward Compatible change
Backward: 向后兼容,用新schema可以讀取舊數據,有些字段沒有數據,就用default
- 由於有了默認值,我們可以使用新schema讀取舊數據。如果字段不存在,Avro將使用默認值
- 如果要向后兼容,新schema的新增欄位必須要有默認值
2. Forward Compatible change
- Forward: 向前兼容,用舊schema可以讀取新數據,avro將忽略新加的字段
- 如果要向前兼容,刪掉的欄位必須要有默認值
3. Fully Compatible change
Full: 全兼容,支持向前兼容,向后兼容
想要全兼容要做到以下兩點:
- 只添加有默認值的字段
- 只移除有默認值的字段
4. Not Compatible change
下面的一些改變會導致不兼容:
- 從枚舉中添加/刪除元素
- 更改字段數據類型(例如:string à int)
- 重命名必需的字段(字段沒有默認值)
編寫Avro schema時的一些建議:
1.Make your primary key required
2.Give default values to all the fields that could be removed in the future
3.Be very careful when using Enums as they can’t evolve over time
4.Don’t rename fields. You can add aliases instead (other names)
5.When evolving a schema, ALWAYS give default values
6.When evolving a schema, NEVER delete a required field