hive_format

μ €μž₯ 포맷

  • ν•˜μ΄λΈŒλŠ” 두 개의 차원, 즉 둜우 포맷과 파일 포맷으둜 ν…Œμ΄λΈ” μ €μž₯μ†Œλ₯Ό κ΄€λ¦¬ν•©λ‹ˆλ‹€.

  • 둜우 포맷은 ν–‰κ³Ό νŠΉμ • ν–‰μ˜ ν•„λ“œκ°€ μ €μž₯된 방식을 μ§€μ‹œν•©λ‹ˆλ‹€. 직렬자-μ—­μ§λ ¬μž(Serializer-Deserializer)λ₯Ό ν˜Όν•©ν•œ ν•˜μ΄λΈŒ μ „λ¬Έ μš©μ–΄μΈ SerDe둜 μ •μ˜λ©λ‹ˆλ‹€.

  • ν…Œμ΄λΈ”μ„ μ§ˆμ˜ν•˜λŠ” κ²½μš°μ™€ 같이 μ—­μ§ˆλ ¬ν™”λ₯Ό μˆ˜ν–‰ν•  λ•Œ SerDeλŠ” νŒŒμΌμ— μ €μž₯된 λ°”μ΄νŠΈμ˜ 데이터행을 ν•˜μ΄λΈŒμ—μ„œ λ‚΄λΆ€μ μœΌλ‘œ μ‚¬μš©λ˜λŠ” 객체둜 μ—­μ§€λ ¬ν™”ν•˜μ—¬ κ·Έ 데이터에 λŒ€ν•œ 연산을 μˆ˜ν–‰ν•©λ‹ˆλ‹€.

  • 파일 포맷

    • Text File

      • ν…μŠ€νŠΈ 파일 포맷은 ν”Όκ·Έλ‚˜ grep,sed,awk와 같은 μœ λ‹‰μŠ€ ν…μŠ€νŠΈ 도ꡬ λ“±κ³Ό 데이터λ₯Ό κ³΅μœ ν•˜κΈ° νŽΈλ¦¬ν•©λ‹ˆλ‹€. 파일의 λ‚΄μš©μ„ 직접 보고 μˆ˜μ •ν•˜κΈ° μ‰¬μ›€λ‹ˆλ‹€.

      • ν…μŠ€νŠΈ 포맷은 λ°”μ΄λ„ˆλ¦¬ 포맷과 λΉ„κ΅ν•˜λ©΄ μ €μž₯ 곡간을 효과적으둜 μ‚¬μš©ν•˜μ§€λŠ” λͺ»ν•©λ‹ˆλ‹€. 압좕을 μ‚¬μš©ν•  μˆ˜λ„ μžˆμ§€λ§Œ λ°”μ΄λ„ˆλ¦¬ 포맷을 μ‚¬μš©ν•¨μœΌλ‘œμ¨ ν…μŠ€νŠΈ 포맷보닀 더 ν–₯μƒλœ λ””μŠ€ν¬ I/O와 효과적인 λ””μŠ€ν¬ 곡간 μ‚¬μš©ν•©λ‹ˆλ‹€.

    • SequenceFile

      • μ‹œν€€μŠ€νŒŒμΌμ€ λ°”μ΄λ„ˆλ¦¬ ν‚€-κ°’μœΌλ‘œ κ΅¬μ„œλœ ν”Œλž« 파일(flat file - 계측적 ꡬ쑰λ₯Ό κ°–μ§€ μ•Šκ³  λ‹¨μˆœνžˆ 같은 ν˜•μ‹μ˜ λ ˆμ½”λ“œμ˜ λͺ¨μž„μœΌλ‘œ μ΄λ£¨μ–΄μ‘ŒμŠ΅λ‹ˆλ‹€). ν•˜μ΄λΈŒλŠ” 쿼리λ₯Ό λ§΅λ¦¬λ“€μŠ€ 작으둜 λ³€ν™˜ν•  λ•Œ λ ˆμ½”λ“œλ‘œ μ‚¬μš©ν•˜κΈ° μœ„ν•œ μ λ‹Ήν•œ ν‚€-κ°’ μŒμ„ μ •ν•©λ‹ˆλ‹€.

      • μ‹œν€€μŠ€νŒŒμΌμ€ λΈ”λŸ­κ³Ό λ ˆμ½”λ“œ μˆ˜μ€€μ—μ„œ 압좕이 κ°€λŠ₯ν•˜λ―€λ‘œ λ””μŠ€ν¬ 곡간 ν™œμš©κ³Ό I/Oλ₯Ό μ΅œμ ν™”ν•  수 있고 병렬 처리λ₯Ό μœ„ν•œ 블둝 λ‹¨μœ„ 파일 뢄할도 κ°€λŠ₯ν•©λ‹ˆλ‹€.

      • image

      • image

        • https://towardsdatascience.com/new-in-hadoop-you-should-know-the-various-file-format-in-hadoop-4fcdfa25d42b

      • ν•˜λ‘‘μ΄ μ§€μ›ν•˜λŠ” μ‹œν€€μŠ€νŒŒμΌ 포맷은 νŒŒμΌμ„ λΈ”λ‘μœΌλ‘œ λ‚˜λˆŒ 수 있고 μ„ νƒμ μœΌλ‘œ 블둝을 μ••μΆ•ν•  수 μžˆμŠ΅λ‹ˆλ‹€. CREATE TABLE μ ˆμ— STORED AS SEQUENCEFILE μ ˆμ„ μΆ”κ°€ν•˜λ©΄ λ©λ‹ˆλ‹€.

      • No compression은 데이터λ₯Ό μ••μΆ•ν•˜μ§€ μ•Šκ³  κ·ΈλŒ€λ‘œ μ €μž₯ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€. 이 방식은 μ••μΆ• 방식을 μ‚¬μš©ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ λ””μŠ€ν¬ 곡간을 적게 μ‚¬μš©ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜, 큰 νŒŒμΌμ„ μ²˜λ¦¬ν•  λ•Œ μž…μΆœλ ₯ 속도가 느렀질 수 μžˆμŠ΅λ‹ˆλ‹€.

      • Record compression은 λ°μ΄ν„°μ˜ 각 λ ˆμ½”λ“œ(ν‚€-κ°’ 쌍)λ₯Ό μ••μΆ•ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€. 이 방식을 μ‚¬μš©ν•˜λ©΄ λ°μ΄ν„°μ˜ 크기가 쀄어듀어 λ””μŠ€ν¬ 곡간을 μ ˆμ•½ν•  수 μžˆμŠ΅λ‹ˆλ‹€. Record compression은 deflate, gzip, bzip2 λ“±μ˜ μ••μΆ• 방식을 μ§€μ›ν•©λ‹ˆλ‹€.

      • Block compression은 데이터λ₯Ό 블둝 λ‹¨μœ„λ‘œ μ••μΆ•ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€. 이 방식은 Record compressionκ³Ό 달리 데이터λ₯Ό 블둝 λ‹¨μœ„λ‘œ μ²˜λ¦¬ν•˜λ―€λ‘œ 블둝 λ‹¨μœ„λ‘œ μž…μΆœλ ₯이 μˆ˜ν–‰λ˜μ–΄ 처리 속도가 λΉ¨λΌμ§‘λ‹ˆλ‹€. Block compression은 deflate, gzip, bzip2, LZO, Snappy λ“±μ˜ μ••μΆ• 방식을 μ§€μ›ν•©λ‹ˆλ‹€.

    • RCFile

      • image

        • https://towardsdatascience.com/new-in-hadoop-you-should-know-the-various-file-format-in-hadoop-4fcdfa25d42b

      • Hive의 Record Columnar File은 λ¨Όμ € 데이터λ₯Ό ν–‰ λ‹¨μœ„λ‘œ Row Group으둜 λ‚˜λˆ„κ³  Row Group 내뢀에 데이터λ₯Ό μ—΄λ‘œ μ €μž₯ν•˜λŠ” ν˜•μ‹μ˜ 파일으둜 MapReduce 기반 데이터 μ›¨μ–΄ν•˜μš°μŠ€ μ‹œμŠ€ν…œμš©μœΌλ‘œ μ„€κ³„λœ 데이터 배치 κ΅¬μ‘°μž…λ‹ˆλ‹€

      • RCFile은 ν–‰ μ €μž₯μ†Œμ™€ μ—΄ μ €μž₯μ†Œμ˜ μž₯점을 κ²°ν•©ν•˜μ—¬ λΉ λ₯Έ 데이터 λ‘œλ“œ 및 쿼리 처리, μŠ€ν† λ¦¬μ§€ κ³΅κ°„μ˜ 효율적인 μ‚¬μš© 및 맀우 동적인 μ›Œν¬λ‘œλ“œ νŒ¨ν„΄μ— λŒ€ν•œ 적응성에 λŒ€ν•œ μš”κ΅¬λ₯Ό μΆ©μ‘±ν•©λ‹ˆλ‹€.

      • λŒ€λΆ€λΆ„ ν•˜λ‘‘κ³Ό ν•˜μ΄λΈŒ μ €μž₯ 곡간은 둜우 기반이며 μ΄λŠ” λŒ€λΆ€λΆ„ νš¨κ³Όμ μž…λ‹ˆλ‹€. 파일의 블둝 λ‹¨μœ„ 압좕은 λ°˜λ³΅λ˜λŠ” 데이터λ₯Ό λ‹€λ£¨λŠ” 데 효율적이고 둜우 기반의 데이터λ₯Ό 잘 λ‹€λ£° 수 μžˆλŠ” μ—¬λŸ¬ ν…μŠ€νŠΈ 처리 λ„κ΅¬λ‚˜ 디버깅 도ꡬ(more,head,awk)와 잘 λ§žμŠ΅λ‹ˆλ‹€.

      • ν…Œμ΄λΈ”μ΄ 수백 개의 μ»¬λŸΌμ„ κ°€μ§€κ³  있고 λŒ€λΆ€λΆ„ μΏΌλ¦¬μ—μ„œ 그쀑 λͺ‡ 개만 μ‚¬μš©ν•œλ‹€λ©΄ 데이터λ₯Ό κ°€μ§€κ³  였기 μœ„ν•΄ 전체 둜우λ₯Ό μŠ€μΊ”ν•˜λŠ” 방식은 λ‚­λΉ„μž…λ‹ˆλ‹€. λŒ€μ‹ μ— 데이터가 μ»¬λŸΌμ„ κΈ°μ€€μœΌλ‘œ μ €μž₯λ˜μ–΄ μžˆλ‹€λ©΄ ν•„μš”ν•œ 데이터 컬럼만 읽을 수 있기 λ•Œλ¬Έμ— μ„±λŠ₯이 ν–₯상될 κ²ƒμž…λ‹ˆλ‹€.

      • ν•˜μ΄λΈŒμ˜ κ°•λ ₯ν•œ μž₯점 쀑 ν•˜λ‚˜λŠ” μ„œλ‘œ λ‹€λ₯Έ 두 데이터 포맷을 κ°„λ‹¨νžˆ λ³€ν™˜ν•˜λŠ” λŠ₯λ ₯으둜 μ €μž₯ μ •λ³΄λŠ” ν…Œμ΄λΈ”μ˜ 메타데이터에 μ €μž₯ν•©λ‹ˆλ‹€.

        • ν–‰ μ§€ν–₯

          • image

            • https://towardsdatascience.com/new-in-hadoop-you-should-know-the-various-file-format-in-hadoop-4fcdfa25d42b

        • μ—΄ μ§€ν–₯

          • image

            • https://towardsdatascience.com/new-in-hadoop-you-should-know-the-various-file-format-in-hadoop-4fcdfa25d42b

    • Avro Files

      • image

        • https://www.oreilly.com/library/view/operationalizing-the-data/9781492049517/ch04.html

      • 원격 ν”„λ‘œμ‹œμ € 호좜 및 데이터 직렬화 ν”„λ ˆμž„μ›Œν¬μž…λ‹ˆλ‹€.

      • Apache의 Hadoop ν”„λ‘œμ νŠΈ λ‚΄μ—μ„œ κ°œλ°œλ˜μ—ˆμœΌλ©° JSON을 μ‚¬μš©ν•˜μ—¬ 데이터 μœ ν˜• 및 ν”„λ‘œν† μ½œμ„ μ •μ˜ν•˜κ³  데이터λ₯Ό κ°„λ‹¨ν•œ 이진 ν˜•μ‹μœΌλ‘œ μ§λ ¬ν™”ν•©λ‹ˆλ‹€

    • ORC Files

      • image
        • https://www.oreilly.com/library/view/operationalizing-the-data/9781492049517/ch04.html

      • μ—΄ ν˜•μ‹μœΌλ‘œ μ €μž₯된 ν–‰ 데이터와 ν•¨κ»˜ ν•˜λ‚˜μ˜ νŒŒμΌμ— ν–‰ λͺ¨μŒμ„ μ €μž₯ν•©λ‹ˆλ‹€

      • ν΄λŸ¬μŠ€ν„° μ „μ²΄μ—μ„œ ν–‰ λͺ¨μŒμ„ λ³‘λ ¬λ‘œ μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ—΄ λ ˆμ΄μ•„μ›ƒμ΄ μžˆλŠ” 각 νŒŒμΌμ€ 압좕에 μ΅œμ ν™”λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

      • 데이터와 열을 κ±΄λ„ˆλ›°λ©΄ 읽기 및 μ••μΆ• ν•΄μ œ λ‘œλ“œκ°€ λͺ¨λ‘ μ€„μ–΄λ“­λ‹ˆλ‹€.

    • Parquet

      • image
        • https://www.oreilly.com/library/view/operationalizing-the-data/9781492049517/ch04.html

      • Hadoop용 μ˜€ν”ˆ μ†ŒμŠ€ μ—΄ μ§€ν–₯ μŠ€ν† λ¦¬μ§€ ν˜•μ‹μž…λ‹ˆλ‹€.

      • ParquetλŠ” λ³΅μž‘ν•œ 데이터λ₯Ό λŒ€λŸ‰μœΌλ‘œ μž‘μ—…ν•˜λ„λ‘ μ΅œμ ν™”λ˜μ–΄ 있으며 효율적인 데이터 μ••μΆ• 및 인코딩 μœ ν˜•μ„ μœ„ν•œ 방법을 ν¬ν•¨ν•©λ‹ˆλ‹€.

    • ORC, Parquet 및 Avro의 ν’ˆμ§ˆ

      • ORC
        Parquet
        Avro

        Row or column

        Column

        Column

        Row

        Compression

        Great

        Great

        Good

        Speedup (compared to text file)

        10–100x

        10–100x

        10x

        Schema evolution

        Good

        Better

        Best

        Platforms

        Hive, Spark, Presto

        Hive, Spark, Presto

        Hive, Spark

        Splittability

        Best

        Best

        Better

        File statistics

        Yes

        Yes

        No

        Indexes

        Yes

        Yes

        No

        Bloom filters

        Yes

        No

        No

    • Custom INPUTFORMAT and OUTPUTFORMAT

      • ν•˜μ΄λΈŒλŠ” ν•˜λ‘‘μ˜ μž…λ ₯ 포맷(InputFormat) APIλ₯Ό μ΄μš©ν•΄ ν…μŠ€νŠΈ 파일, μ‹œν€€μŠ€νŒŒμΌ, μ‚¬μš©μž μ •μ˜ 파일과 같은 λ‹€μ–‘ν•œ μ†ŒμŠ€λ‘œλΆ€ν„° 데이터λ₯Ό μ½μŠ΅λ‹ˆλ‹€. 좜λ ₯ 포맷(OutputFormat) APIλ₯Ό μ΄μš©ν•˜λ©΄ λ‹€μ–‘ν•œ 포맷으둜 데이터λ₯Ό μ“Έ μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

      • μž…λ ₯ 포맷(Input Format)은 주둜 파일 ν˜•νƒœμ˜ μž…λ ₯ μŠ€νŠΈλ¦Όμ„ λ ˆμ½”λ“œ λ‹¨μœ„λ‘œ λΆ„ν• λ˜λŠ” 방법을 κ²°μ •ν•©λ‹ˆλ‹€. SerDeλŠ” λ ˆμ½”λ“œλ₯Ό 컬럼 λ‹¨μœ„λ‘œ λΆ„μ„ν•˜κ³  μ»€μŠ€ν…€ μž…λ ₯ 포맷은 INPUTFORMAT 문을 μ΄μš©ν•΄ ν…Œμ΄λΈ”μ„ 생성할 λ•Œ μ„ μ–Έν•  수 μžˆμŠ΅λ‹ˆλ‹€. κΈ°λ³Έ STORED AS TEXTFILE λͺ…μ„Έμ˜ μž…λ ₯ 포맷은org.apache.hadoop.mapreduce.lib.input.TextInputFormat으둜 μžλ°” 객체둜 κ΅¬ν˜„λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

      • 좜λ ₯ 포맷(Output Format)은 좜λ ₯ 슀트림(보톡은 파일)에 μ–΄λ–»κ²Œ λ ˆμ½”λ“œλ₯Ό κΈ°λ‘ν•˜λŠ”μ§€ κ²°μ •ν•©λ‹ˆλ‹€. SerDeλŠ” κ°œλ³„ λ ˆμ½”λ“œλ₯Ό μ μ ˆν•œ λ°”μ΄νŠΈ 슀트림으둜 μ§λ ¬ν™”ν•˜κ³  μ‚¬μš©μž μ •μ˜ 좜λ ₯ 포맷은 OUTPUTFORMAT문을 μ΄μš©ν•΄ ν…Œμ΄λΈ”μ„ 생성할 λ•Œ μ„ μ–Έν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • μ‚¬μš©μž μ •μ˜ ν•¨μˆ˜(UDF), μ‚¬μš©μž μ •μ˜ 집계 ν•¨μˆ˜(user-defined aggregate function - UDAF), μ‚¬μš©μž μ •μ˜ ν…Œμ΄λΈ” 생성 ν•¨μˆ˜(user-defined table-generating function - UDTF) λ“± μ„Έ μ’…λ₯˜μ˜ UDFλ₯Ό μ§€μ›ν•©λ‹ˆλ‹€. μ„Έ μ’…λ₯˜μ˜ 차이점은 μž…λ ₯으둜 λ°›λŠ” ν–‰κ³Ό 좜λ ₯λ˜λŠ” ν–‰μ˜ κ°œμˆ˜κ°€ λ‹€λ₯΄λ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

    • μ •κ·œ UDFλŠ” 단일 행을 μ²˜λ¦¬ν•œ ν›„ 단일 행을 좜λ ₯ν•˜λ©° μˆ˜ν•™ ν•¨μˆ˜λ‚˜ λ¬Έμžμ—΄ ν•¨μˆ˜μ™€ 같은 λŒ€λΆ€λΆ„μ˜ ν•¨μˆ˜κ°€ 여기에 ν•΄λ‹Ήν•©λ‹ˆλ‹€.

    • UDAFλŠ” λ‹€μˆ˜μ˜ μž…λ ₯ 행을 μ²˜λ¦¬ν•œ ν›„ 단일 행을 좜λ ₯ν•˜λ©° COUNTλ‚˜ MAX같은 집계 ν•¨μˆ˜κ°€ 여기에 ν•΄λ‹Ήν•©λ‹ˆλ‹€.

    • UDTFλŠ” 단일 둜우λ₯Ό μ²˜λ¦¬ν•œ ν›„ λ‹€μˆ˜μ˜ ν–‰(ν…Œμ΄λΈ”)을 좜λ ₯ν•¨ν•©λ‹ˆλ‹€.

Reference

  • https://www.amazon.com/Programming-Hive-Warehouse-Language-Hadoop/dp/1449319335

  • https://www.amazon.com/Hadoop-Definitive-Guide-Tom-White/dp/1449311520

  • https://www.oreilly.com/library/view/operationalizing-the-data/9781492049517/ch04.html

  • https://cwiki.apache.org/confluence/display/Hive/FileFormats

Last updated