Имя: Пароль:
IT
 
Реализация РН на NoSQL c MapReduce
,
0 Garykom
 
гуру
16.06.17
11:27
Пытаюсь на NoSQL базе данных (CouchDB) сделать аналог 1С-ных Регистров накопления (остатки и обороты).

К примеру банальная задача остатков товаров на складах и документов движения (приход/расход).

Если сделать остатки через reduce-функцию то проблема что при добавлении/изменении документа движения будет происходить полный пересчет по всем документам.

В 1С это решали например хранением промежуточных итогов на начало каждого месяца и на лету считаем документы с начала нужного месяца чтобы получить итог на требуемую дату.

Вот как бы красиво извратиться на CoudhDB?
Причем чтобы не потерять возможность распараллеливания (и ускорения) вычислений остатков на нодах кластера?
121 orefkov
 
16.06.17
13:44
(119)
А, понял, ты хочешь чудо-средство, что "я туда только движения пишу, а оно мне вжих, волшебным образом по движениям потом итоги выдавало".
Тогда да, надо будет на десять сервером распаралеливавать, чтобы на-лету остатки считать. Вместо того, чтобы алгоритм хранения продумать, и тогда этой хваленой возможности считать параллельно просто не понадобится, ибо и считать то не надо.
122 orefkov
 
16.06.17
13:49
+(121)
Все думаете, что в NoSql какая-то магия есть. Нет там ничего, обычное хранилище ключ-значение, по-сути откат к старинной Berkley DB, в грамотной маркетинговой обёртке. Вся скорость только за счёт того, что всю базу данных в оперативку засасывает. Ну так можно и sqlite в memory затянуть - там такая скорость будет, закачаешься.
123 orefkov
 
16.06.17
13:54
+(122) *Berkeley DB*
124 Garykom
 
гуру
16.06.17
14:04
(121) (122) Чудо-средство это обычная видяха с GPU ))

Догадайся что будет от распараллеливания?
125 orefkov
 
16.06.17
14:49
(124)
Тут должна быть картинка с Джеки Чаном, хватающимся за голову
Затем картинка facepalm.jpg
Насчёт Лаврова - не знаю, может быть, не хочу никого обижать.
126 Garykom
 
гуру
16.06.17
14:57
(125) Глянь ссылки из Ускорение СУБД с помощью GPU и CUDA, сча еще Map-D появилась
http://www.nvidia.ru/object/blog-big-data-gpu-database-ru.html

GPUDB это дело ближайшего будущего, фишка что обычные реляционные плохо работают исключая случаи сложных запросов, много простых смысла нет.
А вот NoSQL это тема на GPU!
127 Fragster
 
гуру
16.06.17
14:58
(120) только коучдб и прочие носкули так не работают, и по этому оперативных остатков там не бывает
128 Garykom
 
гуру
16.06.17
14:58
129 Garykom
 
гуру
16.06.17
14:59
(127) Если сделать очень-очень быстрый "подсчет остатков" то будет казаться что они вполне оперативные.
130 Вафель
 
16.06.17
15:04
(126) в 2013 году. И где они сейчас?
131 Garykom
 
гуру
16.06.17
15:10
(130) Тут https://www.mapd.com/
132 Fragster
 
гуру
16.06.17
15:11
(131) подожди. это реляционка. и без кластера.
133 orefkov
 
16.06.17
15:12
(126)
Это "ускорение ради ускорения".
Тому, у кого в руках молоток, всё вокруг кажется похожим на гвозди. Твое поведение напоминает неофитов, только что узнавших какую-ту хрень, и носящихся с ней, как с писаной торбой, пытаясь приткнуть её где надо и не надо.
Так вот в этой задаче - не надо. Она прекрасно решается простыми и понятными структурами хранения данных, без всякого топового железа и параллельных алгоритмов.
Вместо того, чтобы тупо при фиксации факта посчитать остаток и ЗАПИСАТЬ посчитанное, ты предлагаешь каждый раз загружать на видеокарту весь массив документов и считать всё сначала?
В чём профит? В том, что ты вместо избавляешься от одной лишней записи в момент проведения? Но ради этого придётся городить целый огород с параллельными расчётами, точно также организовывать запись промежуточных итогов для ускорения, да еще и думать, как это всё синхронизировать? На мой взгляд, крайне сомнительная выгода.
134 Fragster
 
гуру
16.06.17
15:13
(133) после (132) вообще интересно, как автор гуглит...
135 Garykom
 
гуру
16.06.17
15:13
(132) Угу самый идиотизм это пытаться делать виртуальную реляционку и эмуляцию sql на gpu.

Когда там самое то для NoSQL баз, прям просятся.
136 orefkov
 
16.06.17
15:14
(127)
Что значит "NoSql так не работают?" Они не разрешают мне хранить в базе то, что я захочу? Зачем они тогда мне?
137 Fragster
 
гуру
16.06.17
15:14
господи, да параллельный тэйбл скан там...
138 Garykom
 
гуру
16.06.17
15:14
(134) Блин это просто примеры реальных "реляционных" баз данных "ускоренных" на GPU.

Если на GPU запускать NoSQL базы с MapReduce выигрыш в скорости будет просто офигительный!
139 Fragster
 
гуру
16.06.17
15:14
из-за кучи ядер и наличия всего в оперативе получается быстро...
140 Garykom
 
гуру
16.06.17
15:16
(133) >Вместо того, чтобы тупо при фиксации факта посчитать остаток и ЗАПИСАТЬ посчитанное, ты предлагаешь каждый раз загружать на видеокарту весь массив документов и считать всё сначала?

Если внимательно прочитаешь вопрос в (0) то поймешь что как раз хочу этого избежать.
141 Fragster
 
гуру
16.06.17
15:16
вообще стандартные физические sql операторы параллелятся очень хорошо, проблема всегда в блокировках. nosql как раз "избавились от блокировок" путем отказа от оперативности. но и в sql также это есть, версионный режим, когда если запросу не принципиаольно - возвращается предыдущее зафиксированное состояние.
142 Fragster
 
гуру
16.06.17
15:16
nosql - это реально не для бизнеса, это лайки считать.
143 Garykom
 
гуру
16.06.17
15:18
Блин как обычно отклонились от темы и вместо "как это сделать" начинаем "нафига это делать" ))

Короче на данный момент меня не сильно волнует вопрос ускорения на GPU, это дело пока будущего.

Сейчас просто пытаюсь переложить конфу 1С на NoSQL (конкретно CouchDB) БД и все.
144 orefkov
 
16.06.17
15:19
(138)
Тебе пытаются втолковать, что задача подсчета остатков не требует mapreduce.
(140)
Тогда тоже не вижу плюсов от замены на NoSql. Ты в итоге придешь к такой же структуре хранения данных, что и в реляционной базе, только на самодельных костылях. Закат солнца вручную через key-value pairs получится.
145 Garykom
 
гуру
16.06.17
15:22
(144) А те кто пытаются это втолковать хотя бы VIEW в классических SQL серверах/бд используют?

Суть не 1С учетных систем тех же SAP'ов и прочих OEBS/Axapta как раз в полноценном использовании возможностей SQL сервера.

Я же просто пытаюсь использовать полноценно возможности NoSQL сервера.
146 Garykom
 
гуру
16.06.17
15:23
(144) Плюсы есть, и в принципе проблема уже решена еще на 1-й странице и без всяческих "тех же структур".
147 orefkov
 
16.06.17
15:24
Вообще, обычно обсуждение NoSql идёт по одному сценарию:
- Йоу, смотрите как быстро я в неё документ пишу и извлекаю!
- А выберите ка мне всех клиентов, купивших одеколон за месяц на сумму более 10 тыр.
- Ээээ, а зато тут можно всё параллельно
148 Garykom
 
гуру
16.06.17
15:25
(147) Скажи вот у тебя 100 пользователей одновременно запустили отчет который "выберите ка мне всех клиентов, купивших одеколон за месяц на сумму более 10 тыр. "

Что будет? И что будет в NoSQL ?
149 Garykom
 
гуру
16.06.17
15:28
И да я совсем не против обычного SQL, совсем не собираюсь от него отказываться и не призываю это делать других.

Суть применять NoSQL в тех задачах где он лучше работает.
Не выйдет чисто на CouchDB ну заюзаю Posgtres для актуальных остатков, где будут чисто ссылки-гуиды на доки, а сами доки буду в NoSQL хранить.
150 Garykom
 
гуру
16.06.17
15:29
(149) *Postgres
151 orefkov
 
16.06.17
15:31
(148)
Для начала окажется, что клиент не входит в ключ по документам. Потом окажется что вообще, клиент записывается просто строкой в данных документа. И т.д и т.п. Короче, решить можно, но надо неделю на программирование и десять серверов в параллель. Только и всего.
Если ты будешь говорить, что у тебя и документы по клиенту индексированы, и они отдельной сущностью сделаны, с включением в документ только ссылки - то чем это в итоге отличается от SQL баз?
SQL базы - это по сути надстройка над key-value хранилищами, и всё, что можно сделать на NoSql - точно так же можно сделать и в реляционной базе.
152 Garykom
 
гуру
16.06.17
15:33
(151) Документы да отдельная сущность, вот их содержимое нет, внутри.
153 orefkov
 
16.06.17
15:36
(152)
То есть чтобы отобрать все доки по конкретному клиенту нужно все доки перебрать?
154 Fragster
 
гуру
16.06.17
15:37
(153) параллельно!!!111одиодин в кластере!!!одинодин
155 Garykom
 
гуру
16.06.17
15:38
(153) Не нужно, они уже все заранее отобраны и сложены во view.

(154) Очень смешно...
156 Garykom
 
гуру
16.06.17
15:40
Прикольно когда обсирают осуждают нечто слыша об этом по верхам ))
157 drumandbass
 
16.06.17
15:42
(0) я тут маленькую базку писал, с sqlite уткнулся в транзакции параллельно записать не получается. Открыто соединение должно быть только в 1 месте и если идет команда sql происходит блокировка.

Короче перевел на MS SQL LocalDB
Зачем велосипед изобретать..
NoSQL только для хранения документов,картотек, не для вычислений и тем более уж параллельных.
158 Fragster
 
гуру
16.06.17
15:42
(155) да понятно, что по факту создается еще одна табличка по типу олапа, в которую демоны складывают периодически данные. эта периодичность в общем случае непрогнозируема. место, занимаемое данными - растет прямо пропорционально основным табличкам и в геометрической прогрессии по количеству разрезов информации.
159 Garykom
 
гуру
16.06.17
15:46
(158) Угадал, но "код демона" пишется на том же языке что и и сама система ))
160 orefkov
 
16.06.17
15:48
(159)
Это я как-раз и называю - "закат солнца вручную на костылях вокруг key-value pairs".
161 Garykom
 
гуру
16.06.17
15:49
(160) Главную фишку знаешь? "Программисту" не обязательно будет нуна учить SQL ))
162 Вафель
 
16.06.17
15:53
(161) не уж то это так сложно?
163 Вафель
 
16.06.17
15:54
(162)  не ужто какой нибудь LINQ проще чем селект на обычном SQL?
164 orefkov
 
16.06.17
15:55
(157)
В sqlite в один момент может писать только один писатель, блокируется вся база. Хотя, если для записи использовать только один процесс, которому другие шлют запросы на запись, и включить WAL - он пишет с охренительной скоростью. На своей машинке Corei5 3.2GHz с SATA винтом делал тест - начать транзакцию, записать десять строк в таблицу с тремя полями, зафиксировать транзакцию - в среднем 70000 транзакций в секунду. Периодически, когда скидывало кэш на диск, падало до 3000 транзакций в секунду.
При этом в WAL режиме записывающие не мешают читающим нисколько, то есть запросы других клиентов на чтение выполнялись во время транзакций записи.
165 Fragster
 
гуру
16.06.17
15:57
166 Fragster
 
гуру
16.06.17
15:58
167 Garykom
 
гуру
16.06.17
15:58
(162) (163) Никаких LINQ'ов обычный JavaScript код.
168 Fragster
 
гуру
16.06.17
15:59
169 Fragster
 
гуру
16.06.17
16:00
170 Fragster
 
гуру
16.06.17
16:01
ну и к вопросу о сложности...
171 Garykom
 
гуру
16.06.17
16:01
(165) Блин я им про фому а они мне про ерёму...

Не считайте меня дурным и не знающим про "индексы".

Никакой "индекс" не поможет когда у вас данные новые колбасят и тут же хотят видеть остатки, пускай и не совсем актуальные но быстро-быстро, еще быстрее...
И если тыщщи юзеров в одной базе.
172 Garykom
 
гуру
16.06.17
16:05
(170) (170) Эээ к вопросу о сложности а кто понял что справа вообще то много независимых штук?

1. есть функция MAP
2. есть функция REDUCE которая работает по результатам MAP но ей глубоко пофиг что там внутри, лишь бы структуру получить верную по полям
3. есть финализе которому тоже пофиг что там ранее
4. ну и фильтр на входе который можно менять не трогая функции!
173 Garykom
 
гуру
16.06.17
16:06
(172)+ Короче любую часть можно независимо переписать (это разные модули и они выполняются независимо и даже на разных нодах) и оно будет работать!!!

А терь попробуйте исправить запросик SQL...
174 Вафель
 
16.06.17
16:08
(173) У тебя js головного мозга. Как у одного товарища с .net
175 Garykom
 
гуру
16.06.17
16:11
(174) Инструмент/технологию товарища с .Net вполне успешно использую. А вы?
176 lock19
 
16.06.17
16:12
(175) А нам-то зачем?
177 Fragster
 
гуру
16.06.17
16:12
(173) по факту, то же самое можно сделать и со скулем в виде
mysql.query("select dim1,dim2").then((queryresult)=>{ result = queryresult.filter(/*тут то, что в where*/).map(/* тут преобразования полей из select*/).reduce(/* тут аггрегация*/).filter(/*тут фильтр having*/); return resolve(result)});

и никакой большой заслуги именно nosql движка тут нет. при этом map и filter параллелятся и так. reduce по сути своей однопоточен, так что преимуществ никаких у nosql нет
178 Fragster
 
гуру
16.06.17
16:15
не, когда я изучал js и дошел там до методов массива - я в очередной раз пожалел, что в 1с нет лямбд, да. но наличие map/reduce никак нельзя признавать "киллер фичей"
179 orefkov
 
16.06.17
16:16
(157)
sqlite - это кстати не NoSql. Это самая натуральная встраиваемая реляционная БД.
180 Fragster
 
гуру
16.06.17
16:18
тем более, что далеко не факт, что map и reduce функции исполняются сервером субд, а не клиентским приложением ;)
181 Garykom
 
гуру
16.06.17
16:19
(176) Действительно "а зачем?"

(177) У CouchDB из коробки отказоустойчивость кластера.

Попробуй на SQL взять допустим 10 компов (без выделенного главного/сервера) и на них поднять шустро работающую учетную систему.
Которая продолжает работать пока хотя бы один комп включен и ускоряет работу когда они назад включаются/добавляются.
182 Garykom
 
гуру
16.06.17
16:21
(181)+ Суть что то что 1С получается путем написания сервера 1С с разворачиванием кластера и т.д. тут все работает из коробки на "бесплатных" технологиях.

Короче для неких ниш решение вполне оптимальное и наилучшее. Представьте кассы которые без сервера шустро-шустро пашут без тормозов.
183 lock19
 
16.06.17
16:21
(181) Вот.
184 Garykom
 
гуру
16.06.17
16:22
(183) "Вам" не зачем )) Зачем мне это моя дело )))
185 orefkov
 
16.06.17
16:24
(181)
Даже не знаю, как еще объяснить. Ты пытаешься оправдать вещь возможностью самой вещи, не пытаясь подумать, а ценна ли эта возможность сама по себе?
Что например, если сделать традиционную бд с грамотно организованным хранилищем, то сама необходимость в кластере из десяти серверов отпадёт?
Ты же не знаешь, как внутри их кластер реализован?
Поэтому, допустим, чем он отличается от десятка серверов с MS-SQL с настроенной авто-репликацией - не сможешь объяснить?
186 orefkov
 
16.06.17
16:26
(182)
У меня на работе кассы шустро-шустро пашут без тормозов.
Без NoSql и кластеров. На sqlite :)
187 Garykom
 
гуру
16.06.17
16:32
(186) И скажи если взять сначала пробить на всех кассах а потом через пару минут все кроме одной вырубить, одна оставшаяся будет сообщать о продажах всех остальных?

Тут это "из коробки".
188 Garykom
 
гуру
16.06.17
16:32
(187)+ Отдельного сервера кроме касс нету
189 lock19
 
16.06.17
16:35
(187) Ты хочешь базу между клиентами распределять?
190 orefkov
 
16.06.17
16:36
Ты немного не понимаешь требования к кассам. Она не должна отчитываться за других. Она должна человеку чек пробить, даже если сеть пропала. А когда сеть есть, скинуть продажу в учётную систему. Или у тебя это магия и при отсутствии сети работает? Через астрал?
191 Fragster
 
гуру
16.06.17
16:36
(187) ну потеряются часть транзакций, да и буй с ним, да...
192 lock19
 
16.06.17
16:37
"оставшаяся будет сообщать о продажах" - в этом месте предвидится затык
193 orefkov
 
16.06.17
16:38
(189)
Ага. Всю базу всех продаж реплицировать на каждую кассу. Понял, да. На каждой кассе поставим Xeon + 128Gb RAM + 1TB винт :)
194 Garykom
 
гуру
16.06.17
16:41
"В качестве домашнего задания можете провести такой эксперимент. Уроните одну ноду. Убедитесь, что документ можно обновить, используя только оставшиеся две ноды. Затем поднимите упавшую ноду и быстро-быстро запросите с нее документ. Убедитесь, что никакого конфликта не происходит и вы получаете последнюю ревизию."
http://eax.me/couchdb/

Это если кто по английски не может
195 orefkov
 
16.06.17
16:41
+(193)
А, еще крутой GPU нужен, обязательно. Будет остатки в паралель считать. А когда затишье, кассир в думчик поиграет :)
196 Garykom
 
гуру
16.06.17
16:43
(193) 4 а лучше 16 Gb RAM хватит за глаза
https://developer.couchbase.com/documentation/server/current/install/pre-install.html
197 lock19
 
16.06.17
16:43
(194) Это всё хорошо. Ноды у тебя где будут?
198 Garykom
 
гуру
16.06.17
16:46
(197) на планшетах/мобильных кассах
199 Fragster
 
гуру
16.06.17
16:46
(194) для одного документа и локальной сети - предполагаю, что время синхронизации пренебрежимо мало.
а теперь представь ситуацию нарушения связности между нодами вместо падения, с одновременным исправлением одних данных в двух нодах. или когда канал между нодами - не 1гбит сеть, да и данных с сотню мегабайт накопилось
200 Garykom
 
гуру
16.06.17
16:46
(198)+ и еще на ТСД по складу бегать... и стоять на десктопах менагеров
201 Вафель
 
16.06.17
16:47
(196) На каждую кассу по 16 гиг?
202 Fragster
 
гуру
16.06.17
16:47
сферические примеры кластеров в вакууме часто разбиваются о реальность каналов связи
203 Вафель
 
16.06.17
16:48
И на ТСД держать реплику все базы????
204 Garykom
 
гуру
16.06.17
16:48
(199) Сетка не локалка между нодами даже не рассматриваю пока, при плохих каналах согласен что синхронизация будет очень долгой.

Блин мне нужна некая технология, я ее нашел и пытаюсь заюзать как нуна. Так как 1С без плясок с бубнами и разного программного шаманства не позволяет.
205 Garykom
 
гуру
16.06.17
16:49
(203) Шутки сча понимать надо, в будущем это будет не шутка
206 Fragster
 
гуру
16.06.17
16:49
(204) получение оперативных данных - это не "как нуна"
207 Garykom
 
гуру
16.06.17
16:50
(206) Если мы знаем что "вот эти данные не оперативные" то легко можем подождать или сделать спецзапрос оперативных.
208 Вафель
 
16.06.17
16:50
(204) Ну чтож дерзай, как сделаешь расскажешь
209 Garykom
 
гуру
16.06.17
16:51
У меня такое подозрение что адепты FTP спорят с любителем торрентов...
210 lock19
 
16.06.17
16:51
В теме слишком мало блокчейнов...
211 Fragster
 
гуру
16.06.17
16:52
(210) ты сделал мой день!
212 Вафель
 
16.06.17
16:52
(209) Только вот по фтп каждый берет ровно свой файлик в 100к, а через торренты вся база мигрирует в 100г
213 Garykom
 
гуру
16.06.17
16:53
(210) (211) шшш тут нельзя про это...
214 Fragster
 
гуру
16.06.17
16:53
(207) а как ты поймешь, что данные не оперативные при нарушении связности?
215 Garykom
 
гуру
16.06.17
16:53
(212) Странно... почему я через торренты беру (и раздаю) только тот файлик хоть пару байт (на самом деле захватываю и соседние ибо блоки) а?
216 Fragster
 
гуру
16.06.17
16:59
(215) да нет, при запросе select from where ты получишь только нужные тебе данные, при репликации - ты вынужден получить все + постоянно отслеживать изменения. это на самом деле большая проблема. например при попытке изменить одновременно документ в двух местах, когда тебе пофиг, все хорошо, а вот "объект уже захвачен для редактирования" когда не пофиг, уже не получится.
217 Garykom
 
гуру
16.06.17
17:05
(214) Там немного интереснее и проще есть встроенный механизма разрешения конфликтов с сохранением конфликтующих копий
http://guide.couchdb.org/draft/conflicts.html
218 Garykom
 
гуру
16.06.17
17:12
(217)+ И да нарушение связности так же легко определяется и можно это вручную отработать уже.

Но блин это полезли в моменты которые пока даже не думал, мне бы пока просто падение 1-2 серверов исключить.

Кстати! Там же через http прокси обращение к CouchDB работает, короче что кластер развалится на несколько "работающих" групп нод маловероятно.
Суть что да можно настроить напрямую на ноды связь, а можно через прокси который нагрузку между нодами разруливает
219 Fragster
 
гуру
16.06.17
17:19
(218) ну так тогда нафиг этот "кластер", если прокся упадет?
220 Garykom
 
гуру
16.06.17
17:22
(219) проксю легко и на лету поменять же прямо из клиента
Программист всегда исправляет последнюю ошибку.