powered by simpleCommunicator - 2.0.48     © 2025 Programmizd 02
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Bigdata :: опция splittable для архивов
16 сообщений из 16, страница 1 из 1
Bigdata :: опция splittable для архивов
    #40083147
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прочитал заметку что некоторые архивы (*.lz0, *.bzip2, *.lz4) поддерживают опцию разделяемости (splittable)
для содержимого архивного файла.

Причем это не много-томный архив как RAR а свойства одного конкретнного файла-архива.

Интересно как сервисы bigdata этим пользуются? Если взять во внимание что структурированные файлы
(AVRO, ORC, Parquet) и так имеют эту опцию как часть спецификации.

Тогда получается что сжатие применимо к не-структурированным потокам (CSV, Json e.t.c.) которые сжаты
LZO/Bzip. Но как с ними работает парсер?

Каким образом достигается splittable? Вводится таблица индексов? Или в stream вводятся метки
как в видео-форматах для перемотки?

Спасибо.
...
Рейтинг: 0 / 0
Bigdata :: опция splittable для архивов
    #40083181
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Питонщики есть? Что за баг?

Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
$ python3 -VV
Python 3.8.10 (default, Jun  2 2021, 10:49:15) 
[GCC 9.4.0]

$ pip show lzo-indexer
Name: lzo-indexer
Version: 0.0.1
Summary: Library for indexing LZO compressed files
Home-page: https://github.com/duedil-ltd/python-lzo-indexer
Author: Tom Arnfeld
Author-email: tom@duedil.com
License: Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/
Location: /home/mayton/.local/lib/python3.8/site-packages
Requires: 
Required-by: 



Код: python
1.
2.
3.
4.
5.
$ lzo-indexer 1.2billion.txt.lzo
  File "/home/mayton/.local/bin/lzo-indexer", line 39
    print "Skipping indexing of %s" % (lzo_path)
          ^
SyntaxError: invalid syntax



/home/mayton/.local/bin/lzo-indexer

Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
     1	#!/usr/bin/python3
     2	
     3	import sys
     4	import os
     5	import struct
     6	import argparse
     7	
     8	# Add the project directory to the python path
     9	sys.path.append(os.path.join(os.path.dirname(__file__), "../"))
    10	
    11	import lzo_indexer
    12	
    13	
    14	def parse_args(argv):
    15	
    16	    parser = argparse.ArgumentParser()
    17	    parser.add_argument("--verbose", "-v", default=False, action="store_true",
    18	                        help="Enable verbose logging")
    19	    parser.add_argument("--force", "-f", default=False, action="store_true",
    20	                        help="Force re-creation of an index even if it exists")
    21	    parser.add_argument("lzo_files", type=str, nargs="+",
    22	                        help="List of LZO files to index")
    23	
    24	    # Parse the arguments
    25	    return parser.parse_args(argv)
    26	
    27	
    28	def main():
    29	    args = parse_args(sys.argv[1:])
    30	
    31	    for lzo_path in args.lzo_files:
    32	        if not lzo_path.endswith(".lzo"):
    33	            raise Exception("Invalid LZO file given")
    34	        index_path = "%s.index" % (lzo_path)
    35	
    36	        with open(lzo_path, "r") as lzo_file:
    37	            if not args.force:
    38	                if os.path.isfile(index_path):
    39	                    print "Skipping indexing of %s" % (lzo_path)


...
Рейтинг: 0 / 0
Bigdata :: опция splittable для архивов
    #40083182
SpringMan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
К примеру у bzip2 есть последовательность байт 0x314159265359, которые определяют начало bzip-блока, которых может быть много.
На примере хадупа (с некоторыми упрощениями): маппер начинает читать сплит сначала и все, что до начала bzip-блока отбрасывает. Если какой-то bzip-блок заканчивается в другом сплите, то маппер залазит в последующий сплит
...
Рейтинг: 0 / 0
Bigdata :: опция splittable для архивов
    #40083185
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ага. Похоже на число Пи.

Правильно ли я понял следующее?

Тоесть если у меня есть к примеру толстый текстовый файлик. И я его положил в bzip2.

Код: sql
1.
2.
3.
4.
5.
-rw-r--r-- 1 mayton mayton  9693007872 Jul 10 22:41 1.2billion.sequence
-rw-r--r-- 1 mayton mayton    75722752 Jul 10 22:41 .1.2billion.sequence.crc
-rw-rw-r-- 1 mayton mayton  8129486942 Jul 10 14:11 1.2billion.txt.bz2
-rw-rw-r-- 1 mayton mayton 13556247325 Jul 10 14:34 1.2billion.txt.lz4
-rw-r--r-- 1 mayton mayton 13300260941 Jul 10 23:51 1.2billion.txt.lzo



И хочу сделать некую текстовую агрегацию в Hadoop. И известно что у меня к примеру
есть 4 workers. Тогда они должны (грубо) разделить 8129486942 на 4 части. Сделать
seek в нужные позиции. И дальше - найдя число "Пи" приступить к процессингу своего
сплита. И на подходе к границе следующего сплита нужно также обработать хвостик
своей строки которую соседний worker не обработал потому-что мы попали "внахлёст".

И тут у меня - еще один вопрос. А как быть с самой природой тех данных которые мы обрабатываем?
Мне повезло. У меня *.CSV файлик с одной колонкой. Небольшого размера. До 100 символов.

А если-бы у меня был JSON документ где некоторые сущности мелкие а некоторые могут и половину
исходного документа занимать? Есть ли тут ограничения?


P.S. И кажется мне что этот БЗип2 блок должен быть кратным блоку HDFS. Сколько там? 128 Мб кажется.
Какие вообще требования к размеру сплита?
...
Рейтинг: 0 / 0
Bigdata :: опция splittable для архивов
    #40083196
SpringMan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton

И хочу сделать некую текстовую агрегацию в Hadoop. И известно что у меня к примеру
есть 4 workers. Тогда они должны (грубо) разделить 8129486942 на 4 части. Сделать
seek в нужные позиции. И дальше - найдя число "Пи" приступить к процессингу своего
сплита. И на подходе к границе следующего сплита нужно также обработать хвостик
своей строки которую соседний worker не обработал потому-что мы попали "внахлёст".

Да, это сам hadoop все сделает

mayton

P.S. И кажется мне что этот БЗип2 блок должен быть кратным блоку HDFS. Сколько там? 128 Мб кажется.
Какие вообще требования к размеру сплита?

1) Есть размер hdfs блока - он обычно 64/128
2) Есть размер сплита - он по-умолчанию равен размеру блока (размер сплита определяет количество сплитов, количество сплитов определяет количество мапперов)
3) Есть размер БЗип2 блока - он не привязан ни к чему, только к алгоритму сжатия (тут как его менять хз - надо смотреть как алгоритм работает и что туда прокидывать). На сколько я понимаю этот размер много меньше 64/128 мегабайт
Эти параметры практически никогда менять не надо. А если надо, то это обычно на практике определяется

mayton

И тут у меня - еще один вопрос. А как быть с самой природой тех данных которые мы обрабатываем?
Мне повезло. У меня *.CSV файлик с одной колонкой. Небольшого размера. До 100 символов.

А если-бы у меня был JSON документ где некоторые сущности мелкие а некоторые могут и половину
исходного документа занимать? Есть ли тут ограничения?

Всем обычно везет) Если один json влезет на несколько сплитов, то надо понимать, что его будет обрабатывать только один маппер. Это все на практике надо смотреть будет ли вообще с этим проблема, и как ее исправлять. Может менять размер блоков, сплитов, форматов или выносить большие структуры в отдельные задачи и т.п.
...
Рейтинг: 0 / 0
Bigdata :: опция splittable для архивов
    #40083201
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Питонщики есть? Что за баг?

Код написан для Питона 2.
...
Рейтинг: 0 / 0
Bigdata :: опция splittable для архивов
    #40083234
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky
mayton
Питонщики есть? Что за баг?

Код написан для Питона 2.

Спасиб. Час от часу не легче. Теперь для легаси-версии тоже нужно ставить пакеты.

Код: python
1.
2.
3.
4.
5.
$ python2 /home/mayton/.local/bin/lzo-indexer
Traceback (most recent call last):
  File "/home/mayton/.local/bin/lzo-indexer", line 11, in <module>
    import lzo_indexer
ImportError: No module named lzo_indexer
...
Рейтинг: 0 / 0
Bigdata :: опция splittable для архивов
    #40083267
H5N1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Прочитал заметку что некоторые архивы (*.lz0, *.bzip2, *.lz4) поддерживают опцию разделяемости (splittable)
для содержимого архивного файла.

Причем это не много-томный архив как RAR а свойства одного конкретнного файла-архива.

Интересно как сервисы bigdata этим пользуются? Если взять во внимание что структурированные файлы
(AVRO, ORC, Parquet) и так имеют эту опцию как часть спецификации.

на сколько я помню внутри parquet файла bzip2, соответственно мапперы могут прочесть hdfs блок и понять что кусок строки ушел в следующий блок и что необходимо еще один блок прочесть что бы вытянуть недостающий кусочек.

mayton

Тогда получается что сжатие применимо к не-структурированным потокам (CSV, Json e.t.c.) которые сжаты
LZO/Bzip. Но как с ними работает парсер?


в csv тупо вокруг \n символа все крутиться. сплит посреди строки не бывает. если есть json реадер в MR, думаю там так же, \n должен отделять целостные куски, какие можно разным маперам скармливать
...
Рейтинг: 0 / 0
Bigdata :: опция splittable для архивов
    #40083270
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм... CSV не запрещает перевод строки если он внутри литерала с кавычками.
Вроде тут пишут https://datatracker.ietf.org/doc/html/rfc4180

Тоесть парсер должен быть терпелив и не реагировать на первый попавшийся
CR | LF.
...
Рейтинг: 0 / 0
Bigdata :: опция splittable для архивов
    #40083271
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
H5N1

на сколько я помню внутри parquet файла bzip2, соответственно мапперы могут прочесть hdfs блок и понять что кусок строки ушел в следующий блок и что необходимо еще один блок прочесть что бы вытянуть недостающий кусочек.

К паркету у меня нет вопросов. Это структурированный документ где есть колонки. И есть размер сегмента или блока.

Меня какраз интересовали non-structured/semi-structured документы вроде CSV/Json в архиве со сплитом.
...
Рейтинг: 0 / 0
Bigdata :: опция splittable для архивов
    #40083272
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
del
...
Рейтинг: 0 / 0
Bigdata :: опция splittable для архивов
    #40083311
H5N1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Хм... CSV не запрещает перевод строки если он внутри литерала с кавычками.
Вроде тут пишут https://datatracker.ietf.org/doc/html/rfc4180

Тоесть парсер должен быть терпелив и не реагировать на первый попавшийся
CR | LF.

бигдата тулы типа hive или mr может и уважают кавычки, но я сильно сомневаюсь что архиваторы там считают кавычки
...
Рейтинг: 0 / 0
Bigdata :: опция splittable для архивов
    #40083459
SpringMan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В хадупе разархивирование происходит на уровне mr. Но да, оригинальные данные должны быть разделены делиметером (новая строка по-умолчанию). Т.е если хочется обрабатывать \n в кавычках, то придется самому реализовывать свой парсер
...
Рейтинг: 0 / 0
Bigdata :: опция splittable для архивов
    #40084722
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сгенерил AVRO-файл со сплитами по 128К. Без опции сжатия.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
            DatumWriter<GeoIpCityAvroEntityV1> writer = new SpecificDatumWriter<>(GeoIpCityAvroEntityV1.getClassSchema());
            DataFileWriter<GeoIpCityAvroEntityV1> dataFileWriter = new DataFileWriter<>(writer);
            dataFileWriter.setCodec(codec);
            dataFileWriter.setSyncInterval(syncInterval);
            String syncString = RandomStringUtils.random(32, "0123456789abcdef");
            logger.info("sync = {}", syncString);
            byte[] sync = fromHexString(syncString);
            dataFileWriter.create(GeoIpCityAvroEntityV1.getClassSchema(), outputStreamAvro, sync);



Код: sql
1.
2.
3.
codec = CodecFactory.nullCodec()
syncInterval = 128K
sync = e7811bc5493a2f8387913fe594b964b4



file.avro
Код: sql
1.
2.
3.
4.
5.
00000140  65 63 08 6e 75 6c 6c 00  e7 81 1b c5 49 3a 2f 83  |ec.null.....I:/.|
00000150  87 91 3f e5 94 b9 64 b4  ac 56 96 80 10 80 80 80  |..?...d..V......|
....
00020160  75 69 73 76 69 6c 6c 65  e7 81 1b c5 49 3a 2f 83  |uisville....I:/.|
00020170  87 91 3f e5 94 b9 64 b4  98 4d a2 80 10 80 a0 aa  |..?...d..M......|


Примечательно что магические синк-маркеры можно менять. По дефолту они рандомные. Но видимо предметная область
позволяет придумать что-то похлеще что уж наверняка сбоя синхронизации не было.

Посмотрел из строчных форматов - thrift, protobuf, binaryxml (ebml). Они такого не поддерживают на прикладном уровне.

Ну а мою идею совокупления архиватора и прикладного формата надо выкинуть.
Или только архиватор + json. Или нормальный AVRO со встроенным независимым сжатием
каждого сплита отдельно.

От добра - добра не ищут.
...
Рейтинг: 0 / 0
Bigdata :: опция splittable для архивов
    #40084792
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для сжатия snappy расстояние межну синками стало меньше.

Код: sql
1.
2.
scala> ((0x00008b00 + 11) - (0x00000140 + 10)) / 1024
val res2: Int = 34



Задавал

codec=CodecFactory.snappyCodec()
syncInterval = 64K
sync = 2e04be7c94a01381b508ac656bb1aadb


Код: sql
1.
2.
3.
4.
5.
6.
    
    // 00000140  65 63 0c 73 6e 61 70 70  79 00 2e 04 be 7c 94 a0  |ec.snappy....|..|
    // 00000150  13 81 b5 08 ac 65 6b b1  aa db fa 2a d8 a6 04 86  |.....ek....*....|
    // ...
    // 00008b00  14 42 61 72 6f 6e 65 a1  cf ed 8c 2e 04 be 7c 94  |.Barone.......|.|
    // 00008b10  a0 13 81 b5 08 ac 65 6b  b1 aa db b2 2b da b8 04  |......ek....+...|



Кстати этот алгоритм snappy - приятно порадовал. 34 килобайта на блок вместо 64. Работает быстрее чем известные мне архиваторы. Он вобщем
быстрее даже чем отсутсвие сжатия. Хорошая минимизация I/O.

Сравнение времени с архиваторами bzip2, xz с сжатием = 5 (это кажется дефолтная настройка). При диапазоне от 1 до 9.
Код: sql
1.
2.
3.
4.
5.
6.
+ Profiler [Avro BinaryEncoder]
|-- elapsed time [GeoIPCity V1 avro]           20.375  seconds.
|-- elapsed time [GeoIPCity V1 avro snappy]    19.660  seconds.
|-- elapsed time [GeoIPCity V1 avro bzip2]     35.972  seconds.
|-- elapsed time [GeoIPCity V1 avro XZ]        30.497  seconds.
|-- Total        [Avro BinaryEncoder]         106.504  seconds.



И размеры

Код: sql
1.
2.
3.
4.
-rw-rw-r-- 1 mayton   mayton   161725269 Jul 19 18:30 GeoIPCity-v1.avro
-rw-rw-r-- 1 mayton   mayton    41311849 Jul 19 18:30 GeoIPCity-v1-bzip2.avro
-rw-rw-r-- 1 mayton   mayton    77587804 Jul 19 18:30 GeoIPCity-v1-snappy.avro
-rw-rw-r-- 1 mayton   mayton    35534051 Jul 19 18:31 GeoIPCity-v1-xz.avro
...
Рейтинг: 0 / 0
Bigdata :: опция splittable для архивов
    #40090712
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По поводу lz4. Выкидываем его вообще из обсуждения. Судя по всему splittable не поддерживается.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Bigdata :: опция splittable для архивов
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]