-
Notifications
You must be signed in to change notification settings - Fork 18
/
wiki.txt
229 lines (188 loc) · 20.9 KB
/
wiki.txt
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
- Общее
- Назначение
- Библиотека и состав
- a) MapReduce описание, API, Алгоритм
- b) Networking описание, API
- приложения
- known issues
- тесты
- TODO
============================================================
Описание
============================================================
-------------------------
Общее
-------------------------
ZEROVM - Виртуальная машина;
ZRT - Библиотека предоставляющая реализацию системных вызовов эмулирующих операционную систему для программ скомпилированных при помощи nacl_sdk glibc; Дополнительно содержит библиотеку отпортированных програмных продуктов, и библиотеки для поддержки работы в составе кластера;
-------------------------
Назначение
-------------------------
Обеспечивает функционирование стандартной библиотеки Си, благодаря поддержке функциональной файловой системы, локализации;
-------------------------
Библиотека и состав
-------------------------
libzrt, libfs, liblua, libsqlite3, libmapreduce, libnetworking
-------------------------
libzrt и libfs : Обязательные для каждого приложения библиотеки,
реализуют:
-------------------------
- Обернутые в файловую систему каналы. Каналы описанные в манифест файле должны иметь имена начинающееся с "/dev/" т.к. для всех каналов точкой монтирования является папка /dev. В случае если имя канала не начинается с /dev/, то такой канал не будет доступен приложению через файловую систему; Все каналы в конечном счете будут представлены в папке /dev, с произвольным уровнем вложенности, как специальные файлы-устройства: character device, block device. Список поддерживаемых устройств может быть расширен в будущих версиях; Дополнительно об использовании каналов см. документацию ZeroVM;
/dev/stdin - stdin character device, fd=0
/dev/stdout - stdout character device, fd=1
/dev/stderr - stderr character device, fd=2
/dev/fstab - канал предназначенный для подключения fstab файла, в котором указывается список образов для монтирования; канал должен быть readable;
/dev/debug - служебный writable character device, используется для логирования ZRT библиотекой; см. также переменную окружения VERBOSITY для задания уровня логирования;
- Файловая система в памяти, которая монтируется в корень "/". При запуске nexe создается полноценная файловая система в памяти, ограничениями использования которой является отсутсвие поддержки chown, uid, gid; однако с точки зрения запускаемого кода эта поддержка не требуется т.к. в условиях изоляции вся файловая система принадлежит единственному приложению.
-------------------------
конфигурация /dev/fstab
fstab функциональность монтирования образов
-------------------------
При задании канала /dev/fstab появляется возможность дополнительного взаимодействия с ZRT:
a) копирование файлов / распаковка TAR архива в указанную папку файловой системы ZRT.
используются записи пар ключ=значение, когда ключ channel указывает имя канала к которому подключен tar файл, а ключ mountpoint тот путь куда содержимое архива будет распаковано.
Используется также для подключения локализации, описано в Known issues;
-------------------------
liblua : библиотека языка программировани LUA версии 5.2.1
-------------------------
Позволяет составлять полнофункциональные программы и выполнять их в zshell;
-------------------------
libsqlite3:
-------------------------
библиотека DBMS sqlite3, используется приложением zshell.
-------------------------
libmapreduce :
-------------------------
библиотека реализации алгоритма mapreduce 32/128, где размер ключа 32байта, размер данных 128 байт; Данные ключей не хранятся в 32битах, вместо этого как ключ на всех этапах используется Hash ключа;
т.к. приложение будет работать в кластере, то подключение и использование libnetworking
необходимо.
- a) MapReduce описание, API, Алгоритм
-------------------------
Map-Reduce API
-------------------------
функции для запуска MapReduce: MapNodeMain, ReduceNodeMain требуют 2 аргумента:
- struct MapReduceUserIf *userif необходимо проинициализировать указателями на
пользовательские функции, и установить типы данных(размеры) ключа и значения, для этого
использовать макрос PREPARE_MAPREDUCE;
struct ChannelsConfigInterface *ch_if объект описывает взаимосвязь каналов кластера
см. документацию libnetworking;
int MapNodeMain(struct MapReduceUserIf *userif, struct ChannelsConfigInterface *ch_if );
int ReduceNodeMain(struct MapReduceUserIf *userif, struct ChannelsConfigInterface *ch_if );
-------------------------
пользовательские функции Map, Combine, Reduce:
Входные данные частями передаются через буфер 'const char* data' размером 'size',
пользовательский алгоритм выделяет из данных ключи и значения, добавляет hash ключа
в массив keys, и данные в массив values; last_chunk признак конца данных.
int Map(const char *data, size_t size, int last_chunk, Buffer *keys, Buffer *values );
Входные данные это keys, values, пользовательский алгоритм применяется к данным и обработанные данные должны быть записаны в reduced_keys, reduced_values; Если пользователь не определил данную функцию то ее вызов пропускается;
int Combine( const Buffer *keys, const Buffer *values, Buffer *reduced_keys, Buffer *reduced_values );
То же что и Combine но после reduce данные должны быть записаны в канал.
int Reduce( const Buffer *keys, const Buffer *values );
--------------------------
Описание алгоритма:
Кластер mapreduce строится с использованием двух типов узлов Map и Reduce; Каждый Map узел имеет входной файл неограниченного размера, а reduce узел имеет канал для вывода. Пользователь имеет возможность задать 3 функции обработки данных: map, reduce, combine. функция combine может быть опущена, если пользовательская задача не требует этого;
MapReduce Engine для каждого запущенного Map узла читает частями входные данные, и передает в пользовательскую функцию Map которая обрабатывает буфер с данными и возвращает ключи и значения. При этом в качестве ключей пользовательская функция возвращает Hash значения ключа равного 4байта. Далее полученные данные сортируются по ключу и к ним применяется функция Combine если определна. Для первого набора данных высчитывается гистограмма на каждом Map узле, и далее каждый Map узел обменивается с каждым Map узлом для получения результирующей гистограммы, которая далее используется на протяжении всей задачи для равномерного распределения данных из Map узлов в Reduce узлы. В случае если у Map узла заканчиваются данные то вместе с последней порцией данных Reduce узел получает флаг MAP_EXCLUDE и далее исключает из цикла ожидания прослушивание этого Map узла. В случае если Map узел отправил флаг MAP_EXCLUDE, то он завершает свою работу. При получении очередной порции данных от всех Map узлов вызывается пользовательская функция Reduce и далее если Map узлы еще не закончили отправку данных то цикл ожидания повторяется. Результаты работы каластерной задачи должны быть записаны в канал вывода каждого Reduce узла.
libnetworking: channels_conf_reader.h, channels_conf.h;
Используется для загрузки конфигурации каналов из манифест файла в структуры данных;
Делится на 2 части:
- загрузка списков каналов из манифеста
- использование каналов
----------------------------------
ChannelsConf API
----------------------------------
Добавить новый канал к конфигурации struct ChannelsConfigInterface *ch_if.
Данные канала:
nodetype - идентификатор типа узла с которым связан канал;
nodeid - номер узла, для каждого нового типа нумерация начинается с 1;
channelfd - ассоциированный с каналом валидный файловый дескриптор
mode - режим работы канала EChannelModeRead или EChannelModeWrite
struct UserChannel *AddChannel( struct ChannelsConfigInterface *ch_if,
int nodetype,
int nodeid,
int channelfd,
ChannelMode mode );
Получение списка каналов из конфигурации struct ChannelsConfigInterface *ch_if, имеющих
тип nodetype. Каналы должны быть добавлены предварительно функцией AddChannel.
nodes_array будет автоматически аллоцирован, и должен будет уничтожен после использования;
функция возвращает количество узлов добавленных в массив
int GetNodesListByType( const struct ChannelsConfigInterface *ch_if,
int nodetype,
int **nodes_array );
Получение канала из конфигурации struct ChannelsConfigInterface *ch_if, соответствующего
запрошенным параметрам: тип узла, идентификатор и режим доступа к каналу.
struct UserChannel *Channel(struct ChannelsConfigInterface *ch_if,
int nodetype,
int nodeid,
int8_t channelmode);
void Free(struct ChannelsConfigInterface *ch_if);
----------------------------------
ChannelsConfReader API
----------------------------------
Загружает в конфигурацию struct ChannelsConfigInterface *ch_if, все сетевые каналы
которые найдены по указанному пути dirpath, имеющих режим доступа channel_mode,
тип узла nodetype, а также при соответствии имени файла в директории указанному в nodename_text;
Возвращает 0 в случае успеха, или -1 если произвошла ошибка добавления канала к конфигурации.
int AddAllChannelsRelatedToNodeTypeFromDir( struct ChannelsConfigInterface *chan_if,
const char *dirpath, int channel_mode, int nodetype, const char* nodename_text );
закрытие файлов соответствующих каналов и освобождение памяти использованной конфигурацией;
void CloseChannels( struct ChannelsConfigInterface *chan_if );
-------------------------
Приложения
-------------------------
Для каждого приложения поставляется Makefile, если поставляется специальный скрипт для запуска необходимо предварительно собрать приложение с помощью make.
samples/zshell - Программа для выполнения LUA, SQL скриптов без перекомпиляции исполняемого файла. Вместе с приложением идут простые примеры на LUA, для запуска используйте скрипт: run_lua_samples.sh; Для запуска примеров работающих с SQLITE базами данных используйте скрипт: run_sqlite_samples.sh;
В режиме выполнения SQL скриптов поддерживает:
a) read-only доступ к базе данных смонтированной на канал последовательного доступа; read-write доступ к БД смонтированной на канал не поддерживается, т.к. на момент написания у zerovm отсутствует поддержка random-write random-read каналов;
b) read-write доступ к БД загруженной через tarimage, все изменения будут потеряны в конце сессии.
samples/disort - Дистрибутивная сортировка, сортирует входной набор данных интерпретируемых как 4хбайтовые целые числа, и сохраняет результат в выходные файлы; Кластер состоит из узлов 3х типов: Узлы источники, Узлы получатели, Узел Менеджер;
Узел источник принимает как аргумент входной файл;
Узел получатель выдает результат сортировки;
Узел Менеджер координирует сортировку, в частности подсчитывает гистограмму;
количество узлов конфигурируется перед запуском кластера;
Запускается с помощью скрипта disort.sh
samples/wordcount - Дистрибутивное приложение, подсчитывает частоту использования слов в входных файлах, как результат записывает список хешей слов и количество совпадений;
Кластер cоcтоит из узлов: Map, Reduce. Определены пользовательские функции Map, Combine, Reduce.
Пример использования алгоритма mapreduce32/128 из библиотеки libmapreduce;
количество узлов конфигурируется перед запуском кластера;
samples/net - Дистрибутивное приложение, используется как пример работы сетевого транспорта;
samples/reqrep - Дистрибутивное приложение, используется как пример работы сетевого транспорта;
samples/tarimage - Пример показывающий что содержимое tar архива добавилось в файловую систему, используя конфигурацию fstab, после запуска.
samples/readdir - Пример показывающий работу функции readdir и системного вызова NACL getdents;
samples/sort_paging - Bitonic sort, реализация сверхбыстрой сортировки с использованием процессорных инструкций intrinstic.
samples/time - Доступ к системному времени операционной системы ZRT, заданного с помощью Timestamp переменной окружения в manifest файле.
samples/hello - простейший пример
-------------------------
Known issues
-------------------------
a) fdopen ftell fread
Не работают из-за отсутствия поддержки в nacl_sdk, могут быть заменены в будущих версиях ZRT на собственную реализацию.
b) Для подключения локализации необходимо добавить fstab файл с конфигурацией:
channel=/dev/mount/lib, mountpoint=/lib
channel=/dev/mount/share, mountpoint=/share
где channel это имя канала, к которому привязан файл на диске; mountpoint в какую папку в ZRT он должен быть распакован.
в итоге в ZRT файловой системе должны получиться 2 папки в корне архива /locale, /share.
c) github zrt Issue #21
https://github.com/zerovm/zrt/issues/21
zrt_test_suite/gtest_bug_staticlink
d) Для использования функции tmpfile, реализованной в библиотеке libzrt.a, необходимо при линковке указывать ее после объектного кода который ее использует, иначе линковщик соберет исполняемый файл с неработающей версией функции из стандартной библиотеки pepper glibc.
----------------------------------
Тестирование
----------------------------------
Для тестирования работоспособности библиотеки ZRT используется набор тестовых инструментов:
- Тесты языка программирования LUA
zrt/tests/lua_test_suite/
для запуска тестов: make
- Тесты стандартной библиотеки glibc
zrt/tests/glibc_test_suite/
Для запуска тестов используется скрипт: run_test.sh
Есть ряд оригинальных glibc тестов которые не подлежат запуску т.к. не поддерживаются платформой.
- Тесты файловой системы pjd-fstest (Не работает с текущим zerovm, требуется поддержка pipe)
zrt/tests/pjd-fstest-20080816/
Для запуска тестов используется скрипт: run_zrtfs_tests.sh
- Функциональные тесты ZRT
zrt/tests/zrt_test_suite/functional/
Для запуска тестов из главной директории: make test
----------------------------------
TODO
----------------------------------
a) fdopen ftell fread не работают, в планах добавить реализацию и функциональные тесты в zrt_test_suite;