В своих недавних интервью я обнаружил, что проблема, которую многие компании пытаются решить, заключается в масштабируемой конвейерной обработке данных. Я часто получаю вопросы о том, как бы я объединил несколько грязных источников данных или учел отсутствующие данные. После долгих размышлений над этим вопросом я пришел к выводу, что наше стремление к новейшему, лучшему технологическому стеку часто чрезмерно усложняет проблему конвейерной обработки данных — все данные можно разбить на биты и эффективно перемещать только эти биты. Вместо того, чтобы тратить деньги и рабочую силу на создание конвейера данных на языке высокого уровня (Python/NodeJS/Java), почему бы не использовать проверенные в боевых условиях микросервисы UNIX именно для той задачи, для которой они были созданы, чтобы выполнять их оптимально?

Использование утилит UNIX для конвейерной обработки данных накладывает некоторые ограничения на то, как вы обрабатываете данные. Вот некоторые из них, которые пришли мне в голову, я уверен, что есть файл UNIXphilosophy.txt, в котором принципы изложены более подробно и элегантно:

  • Вся информация в данных должна быть явно выражена, а не неявно выражена. Например, если у вас есть CSV-файл, в котором каждая запись имеет индекс , вы должны явно сохранить этот индекс в поле, а не полагаться на порядок записей в CSV-файле. Утилиты UNIX обычно не заботятся о сохранении порядка, в зависимости от конкретной утилиты.
  • Каждая "единица" (запись) данных должна быть однозначно идентифицируемой и выраженной. Это особенно относится к возврату каретки или переводу строки. Давайте возьмем пример большого файла JSON. Красивая полиграфия не допускается. Например:
{
    value: 'Hello'
},
{
    value: 'World'
},
...

было бы неприемлемо, так как это испортило бы такие команды, как diff. Скорее, вы хотели бы сделать что-то вроде:

{ value: 'Hello'},
{ value: 'World'},
...
  • Вся информация должна быть максимально сжата. Это просто общее практическое правило, позволяющее утилитам UNIX работать оптимально. UNIX — это минимализм.
  • Используйте утилиты UNIX в качестве микросервисов такими, какими они были задуманы! Это означает использование всех возможностей современной оболочки (конвейер/перенаправление/и т. д.). Большинство функций, необходимых для конвейерной обработки данных, доступны в отдельных инструментах UNIX. Современные оболочки разрабатывались десятилетиями для оптимизации потока данных между утилитами UNIX. Конвейерная обработка данных может сбивать с толку, если вы позволите ей быть.
  • Доверяйте пользователю. Именно здесь многие, МНОГИЕ решения для конвейерной обработки данных терпят неудачу — они пытаются сделать слишком много. Конвейерная обработка данных никогда не будет шаблонной из-за природы зверя. Вы должны открыть все пользователю вашего решения, а не пытаться все автоматизировать. В некотором смысле, это прекрасно вписывается в философию UNIX по созданию чего-то, что хорошо выполняет одну вещь. Не пытайтесь обработать каждый сценарий в своем решении, иначе все усложнится и вскоре после этого пойдет ужасно неправильно.

Однако я бы сказал, что все эти ограничения должны быть реализованы тем или иным образом, независимо от того, на какой платформе вы строите свою конвейерную обработку данных (если у вас нет хорошо структурированного шаблона для ваших данных, у вас есть чтобы решить эту проблему с помощью дополнительного кода).

Я создал краткое доказательство концепции здесь. Посетите его и запустите пример, чтобы увидеть, насколько простым может быть что-то подобное.