Sentinel Shuttle - skpdi/sentinel-document GitHub Wiki
Sentinel Schema๋ฅผ ํตํด ์ ์๋ ๊ท๊ฒฉ๋๋ก ๋ก๊ทธ๋ฅผ ๋จ๊ธธ ์ ์๋๋ก Format ์ ๋ด๋นํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์
๋๋ค.
๊ธฐ๋กํด์ผ ํ๋ ์ปฌ๋ผ์ Setter ๋ฉ์๋๋ฅผ ์ด์ฉํด์ ํธ๋ฆฌํ๊ฒ ๋จ๊ธธ ์ ์์ต๋๋ค.
์ผํฐ๋ฌ ํํ์ด์ง์์ ๋ค์ด ๋ฐ์ ์ ์์ต๋๋ค. Shuttle ์ ํฌ๋งท๋ง ๋ด๋นํ๋ฉฐ, ์ ์ก์ ์ํด์๋ ๊ฐ ํ๊ฒฝ์ ๋ง๋ ์ ์๋๊ตฌ์ ๊ฐ์ด ์ฌ์ฉํด์ผ ํฉ๋๋ค. ํ๊ฒฝ๋ณ ์ฌ์ฉ ๊ฐ์ด๋๋ ์๋ ๋ชฉ๋ก์ ์ถ๊ฐ๋ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํด ์ฃผ์ธ์.
- Client์ฉ Shuttle
- Android (Rake Android์ ์ฌ์ฉ)
- iOS (Rake iOS์ ์ฌ์ฉ)
- Javascript (Rake Javascript์ ์ฌ์ฉ)
- Server์ฉ Shuttle
- Java (RakeKafka, LogAgent, Direct-Kafka์ ์ฌ์ฉ)
- ํ๋ ์ด๋ฆ ์คํ๋ฅผ ๋ฐฉ์งํ ์ ์์ต๋๋ค. (IDE ์๋์์ฑ)
- ํ๋ ๊ฐ escaping ์ ์ง์ํฉ๋๋ค. (\n, \r, ๊ธฐํ ์ด์ํ ์์คํค ์ฝ๋๋ฑ)
- ํ๋ ํ์ ๋ถ์ผ์น ๋ฐฉ์ง (Integer ๊ฐ ํ์ํ๋ฐ, String ์ ๋ฃ์ผ๋ฉด ์ปดํ์ผ์ด ๋์ง ์์ต๋๋ค.)
- ๋ก๊ทธ ๋ฒ์ ์๋ ์์ฑ
- ๋ก๊ทธ๋ฒ์ ํ์ : #define์ํธ๋ด์ #version : shuttle version : schema version (๊ณต๋ฐฑ์์ด ":"๋ก concat)
- ๋ก๊ทธ ํ์(JSON/TSV) ์๋ ์์ฑ
- Shuttle ์ ์ค๋ ๋ ์ธ์ดํ ํ์ง ์์ต๋๋ค. ๋ฉํฐ ์ค๋ ๋ ์ด์๊ฐ ์๋ ์์น์์๋ (e.g Controller) ๋งค๋ฒ ์์ฑํ๊ฑฐ๋, ๋ฌด๊ฑฐ์ธ ๊ฒฝ์ฐ ThreadLocal, Spring scope ๋ฑ์ ์ด์ฉํด์ฃผ์ธ์.
- Client ์ฉ Shuttle ์ Android, iOS, Javascript ๋ฒ์ ์ ์ง์ํ๋ฉฐ, ์์กด์ฑ์ด ์์ต๋๋ค.
- Server ์ฉ Shuttle ์ Java ๋ฒ์ ๋ง ์ ๊ณตํฉ๋๋ค. ์์กด์ฑ๋ ์์ผ๋ฉฐ, Shuttle.toString ์ ์ฌ์ฉํด์ ๋ก๊น ํฉ๋๋ค. (toJSONObject ๊ฐ ์๋๋๋ค)
์ฃผ์์ฌํญ 2. Shuttle์ ๋ ๊ฐ ์ด์ ์ฌ์ฉ์
(์๋น์ค์์ ์ฌ์ฉํ๋ Sentinel ๋ก๊ทธ์ ์์๊ฐ 2๊ฐ ์ด์์ธ ๊ฒฝ์ฐ)
- ํด๋น ๊ฒฝ์ฐ Rake ์ธ์คํด์ค์ Shuttle์ ๋งตํ ๊ด๊ณ๊ฐ ์ฌ๋ฐ๋ฅธ์ง ํ์ธํด ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค.
๋ก๊ทธ์ ์์A์ ๋ก๊ทธ ์์ง์ฉ Rake ์ธ์คํด์ค - ๋ก๊ทธ์ ์์A์์ ์์ฑํ Shuttle ์ฌ์ฉ
๋ก๊ทธ์ ์์B์ ๋ก๊ทธ ์์ง์ฉ Rake ์ธ์คํด์ค - ๋ก๊ทธ์ ์์B์์ ์์ฑํ Shuttle ์ฌ์ฉ
- ์๋ ์์งํ๊ณ ์ ํ๋ ์ฑ๋(Sentinel ๋ก๊ทธ์ ์์)์์ ์์ฑ๋ Shuttle์ด ์๋ ๋ค๋ฅธ ์ฑ๋์์ ์์ฑ๋ Shuttle์ ์ฌ์ฉํ ๊ฒฝ์ฐ, ๋ก๊ทธ ์ ์๊ฐ ์ ์์ ์ผ๋ก ๋์ง ์์ต๋๋ค.
Header / Body | Schema Type (= Hive Table Type) | Java Type (๊ดํธ ์์ ๊ธฐ๋ณธ๊ฐ) | Javascript | Objective-C | Swift | Note |
---|---|---|---|---|---|---|
Header / Body | string | String (null) | var | NSString* (nil) | String? (nil) | |
Header / Body | long | Long (null) | var | NSNumber* (nil) | Int? (nil) | |
Header / Body | double | Double (null) | var | NSNumber* (nil) | Double? (nil) | |
Header Only | fixed string(n) | String (null) | var | NSString* (nil) | String? (nil) | |
Body Only | list<long> | List<Long> (new ArrayList<Long>) | var | NSMutableArray* (nil) | [Int]? (nil) | |
Body Only | list<double> | List<Double> (new ArrayList<Double>) | var | NSMutableArray* (nil) | [Double]? (nil) | |
Body Only | list<string> | List<String> (new ArrayList<String>) | var | NSMutableArray* (nil) | [String]? (nil) | |
Body Only | map<string,long> | Map<String, Long> (new LinkedHashMap<String, Long>) | var | NSMutableDictionary* (nil) | [String:Int]? (nil) | |
Body Only | map<string,double> | Map<String, Double> (new LinkedHashMap<String, Double>) | var | NSMutableDictionary* (nil) | [String:Double]? (nil) | |
Body Only | map<string,string> | Map<String, String> (new LinkedHashMap<String, String>) | var | NSMutableDictionary* (nil) | [String:String]? (nil) | |
Body Only | json | JSONObject (null) | var | NSMutableDictionary* (nil) | [String:Any]? (nil) | ์ํธํ ๋ฐ ๊ฒ์ฆ ์ง์ ๋ถ๊ฐ |
Body ์ปฌ๋ผ์ ํ์ ์ผ๋ก JSON ํ์ ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
Body๊ฐ 1 depth ์ด๊ธฐ ๋๋ฌธ์, ์ด ๊ฒฝ์ฐ 2 depth ์ด์์ด ๋ฉ๋๋ค. json ์ depth๊ฐ 2 ์ด์์ธ ๊ฐ์ ๋ํด ๊ฒ์ฆ ๋ฐ ์ํธํ๋ฅผ ์ง์ํ์ง ์์ต๋๋ค.
์ ์ฌํญ์ ๋ํด์ ๊ณ ๋ คํ์๊ณ ์ฌ์ฉํ์ ์ผ ํ๋ฉฐ, ๋ก๊ทธ ์ํธํ๋ ๊ฒ์ฆ ๋ฌธ์ ๋ DAS/DA ์ ์์ํ์ ์ผ ํฉ๋๋ค.
์ฐธ๊ณ ๋ก ์ฌ๋ฌ depth์ json ๊ฐ๋ Hive์ get_json_object() ํจ์๋ฅผ ์ด์ฉํด ์ถ์ถ์ด ๊ฐ๋ฅํฉ๋๋ค.
Field: Header / Body | Shuttle: Client / Server | INPUT: none / null / ""
|
STORAGE: Kafka, HDFS | OUTPUT | note | migration |
---|---|---|---|---|---|---|
Header | Client | none (default value, ์๋ฌด๊ฒ๋ ์ ๋ ฅํ์ง ์์ ๊ฒฝ์ฐ) | Kafka (์ค๊ฐ๋จ๊ณ) | "" |
๋น๊ฐ์ "" ๋ก ํํ |
์ถํ JSONObject.NULL ๋ก ๋ณ๊ฒฝ์์ . JSONObject.NULL ๋ก ๋น๊ฐ์ ํํํ๊ฒ ๋๋ฉด, Client ์
ํ๋ก ์ ์ก๋ ๋ก๊ทธ๋ "" ๋ฅผ HDFS ์์ TSV ๋ก ์ ์ฅํ ๋ '' ๋น ๋ฌธ์๋ก ๋ณ๊ฒฝ๋จ |
Header | Client | null |
Kafka (์ค๊ฐ๋จ๊ณ) | "" |
๋น๊ฐ์ "" ๋ก ํํ |
์ถํ JSONObject.NULL ๋ก ๋ณ๊ฒฝ์์ . JSONObject.NULL ๋ก ๋น๊ฐ์ ํํํ๊ฒ ๋๋ฉด, Client ์
ํ๋ก ์ ์ก๋ ๋ก๊ทธ๋ "" ๋ฅผ HDFS ์์ TSV ๋ก ์ ์ฅํ ๋ '' ๋น ๋ฌธ์๋ก ๋ณ๊ฒฝ๋จ |
Header | Server | null |
Kafka (์ค๊ฐ๋จ๊ณ) | "" |
๋น๊ฐ์ "" ๋ก ํํ |
์๋ฒ ๋ก๊ทธ๋ ์ค๊ฐ ๋จ๊ณ๋ถํฐ TSV ํฌ๋งท |
Header | Server | none (default value, ์๋ฌด๊ฒ๋ ์ ๋ ฅํ์ง ์์ ๊ฒฝ์ฐ) | Kafka (์ค๊ฐ๋จ๊ณ) | "" |
๋น๊ฐ์ "" ๋ก ํํ |
์๋ฒ ๋ก๊ทธ๋ ์ค๊ฐ ๋จ๊ณ๋ถํฐ TSV ํฌ๋งท |
Header | Header |
"" (empty string) |
Kafka (์ค๊ฐ๋จ๊ณ) | "" |
||
Header | Header | ALL | HDFS (์ต์ข ๋จ๊ณ) | '' |
TSV ํฌ๋งท์ผ๋ก ๋ก๊ทธ๋ฅผ ์ ์ฅํ๋ฏ๋ก ์ค๊ฐ๋จ๊ณ์ "" ๊ฐ '' (๋น ๋ฌธ์, ๊ฐ์ด ์์) |
|
Body | Client | none | ALL | ํค ์ญ์ | ๋ฐ๋์์๋ ๋น ๊ฐ์ ํํํ๊ธฐ ์ํด ํด๋น ํค๋ฅผ ์ญ์ | ์ถํ JSONObject.NULL ๋ก ๋ณ๊ฒฝ์์ |
Body | Client | null |
ALL | ํค ์ญ์ | ๋ฐ๋์์๋ ๋น ๊ฐ์ ํํํ๊ธฐ ์ํด ํด๋น ํค๋ฅผ ์ญ์ | ์ถํ JSONObject.NULL ๋ก ๋ณ๊ฒฝ์์ |
Body | Server | none | ALL | ํค ์ญ์ | ๋ฐ๋์์๋ ๋น ๊ฐ์ ํํํ๊ธฐ ์ํด ํด๋น ํค๋ฅผ ์ญ์ | |
Body | Server | null |
ALL | ํค ์ญ์ | ๋ฐ๋์์๋ ๋น ๊ฐ์ ํํํ๊ธฐ ์ํด ํด๋น ํค๋ฅผ ์ญ์ | |
Body | ALL | "" |
ALL | "" |
์ ๋ฆฌํ๋ฉด, ์
ํ์ ๋น ๊ฐ ์ ํํํ๊ธฐ ์ํด null
๊ฐ์ ์ด์ฉํ ์ ์์ผ๋, Header (TSV) ์ Body (JSON) ์์ ๋น ๊ฐ์ด ๋ค๋ฅด๊ฒ ํํ๋๊ณ , ์ ์ฅ๋ ์์น (Kafka ๋๋ HDFS) ์ ๋ฐ๋ผ ๋ค๋ฅด๋ ์๊ณ ์ฌ์ฉํ์๋ฉด ๋ฉ๋๋ค.