Добрый вечер. Прошу суровую критика наших про оценить уровень моих знаний согласно выполнению следующего тз: Вот ТЗ https://docs.google.com/document/d/1cQJ_JJ2nGu-fmpQLi96NqeMTQJ8USIWOi8d0_pJL1Uw/edit Дополнительно делать приложение под нагрузку 100 миллионов записей бесплатно мне влом. Но алгоритм я полагаю должен быть следующим: дописывать приложение под пошаговый разбор текста (То есть парсить текст по кусочкам), соответственно с проверкой на уже отобранные данные. Тогда скорее всего это будет оптимальным решением. Но заморачиваться этой задачей за бесплатно не комильфо. Вот выполнение задания: https://drive.google.com/open?id=1OfUNk59oOXcKy-2-COe43ZQ208euz2Bq Ставите на любой хост и открываете видим на экране результат Прошу оценить.
расскажи этим чувакам про эластик, логсташ и кибану. --- Добавлено --- чувак, ты реально хочешь вот так вот открыть 100кк записей лога и разом распарсить?
Хорошее задание. Тип приложения никак не ограничен в задании, но логи как правило бывают оооочень большие. Как по мне, авторы задания обязательно оценят способно ли твоё изделие на работу с правдоподобно большим объемом. Я бы сфокусировался на консольном "фильтре", которому не принципиально сколько времени понадобится на разбор. Веб-приложение не имеет права долго работать. Вот это вот сразу ставит крест на логичном доводе "парсить текст по кусочкам". PHP: echo json_encode($jsonAccess); Какие в опу кусочки, если ты результат накапливаешь в памяти чтобы выплюнуть за один раз? Досвидания. "Но заморачиваться этой задачей за бесплатно не комильфо." И снова досвидания. Зачем вообще взялся?
Да эластик это тема. Я сделал echo чтобы показать результат работы на экране. Они дали 16 строк я показал что могу его разобрать. Как его складывать? Могу записать файл. Могу записать в бд. А на лету обрабатывать это вообще нельзя если говорить о 100 мультах. А как тогда? --- Добавлено --- нет я так распарсил 16 строк.
Ну и по мелочи: Кодинг стандарт не PSR-2 и вообще непоследовательность в именах - то с большой буквы метод, то с маленькой. Класс зависит от константы из глобального пространства имен. Долго не вникал, ибо лень. Не запускал. Можно. Если это cli приложение и если ты спроектируешь его думая о потоках.
просто изначально в задачи написано про 100 мультов не было. Они написали это после того как я уже сделал... Скажу так это просто модель обработки текста. Текст можно разбить допустим на 10 частей. И поискать в каждой части этой моделью.
Вот этот скелетон делался с реального приложения, обрабатывающего гиги. https://gist.github.com/artoodetoo/f143395965fb4fd2c705 --- Добавлено --- Вывел заголовок Цикл пока есть данные. . . . . Прочел строку, обработал, вывел строку. Вывел подвал
@Chushkin эти 16 строк обрабатываются быстро вопрос в том если 100кк строк то уже file get contents отработает точно не быстро. Мне нравится вариант открыть файл в поток. --- Добавлено --- Я хочу переписать свой код именно на вариант который предложил @artoodetoo
Просто интересно сравнить. Я как-то делал разбор логов (несколько лет назад), - если не запамятовал, там было порядка 10 тыс строк в секунду. Но это был навороченный универсальный парсер. Вероятно, "жёсткий" парсер будет быстрее. По твоей задаче: Если учесть, что средняя длина строки лога 300 байт, то 100М логов это порядка 300 000 строк, что даст около 30 секунд разбора. Хорошо это или плохо, судите сами. п.с. это было на PHP 5.6. На 7-ке не проверял, может будет быстрее немного.
Насколько помню, я использовал fgets() и построчное чтение в цикле. Парсер строк также построчно. **Это так, для информации.
@igordata у меня скоро будет. Я ща устанавливаю его на сервер, и надо умный фильтр переписать на битриксе на нём. Там слишком тяжёлая обработка данных в бд. --- Добавлено --- @Chushkin а ща я попробую как вот арту предложил. И посмотрим чего получится.
Во, вспомнил что тестил раньше: https://php.ru/forum/threads/rabota-s-ochen-bolshim-fajlom.43563/page-2#post-348340 **Это так, для информации.
я ща прогнал код по своему http://wsleonpd.beget.tech Вот можете глянуть на экране.... --- Добавлено --- Тут надо в потоке файл делать и записывать данные в бд. --- Добавлено --- Я просто не знал про fopen я не разу с файлами то не работал.
PHP: //считываем файл if (empty(self::$text)) { $text = file_get_contents(ROOT . $path_to_file); self::$text = $text; } else $text = self::$text; //задаем шаблон регулярного выражения для вычесления $pattern = '/'.self::$pattern.'/'; //вытаскиваем данные в массив matches preg_match_all($pattern, $text, $matches); Плохо.
обычно при правильной настройке они бьются по дням и пишутся не на эту же железку Решений может быть много, какое бы хотел увидеть если бы поставил эту задачу... . Ее бы конечно не поставил, потому что есть Zabbix и вообще мы ж не балбесы, но все-таки... если бы приперли к стенке и под дулом пистолета заставили делать на пыхе: И тем не менее, мы все-равно не идиоты, мы можем реализовать приложение которое бы осуществляло некую логику обработки джейсонов, но конвертировать access-лог в json пыхом, строить на php поисковый индекс не наш метод (но можно: есть вполне себе реализации по алгоритмам апач люсина). Поэтому мы: 1. Просто накатываем модуль который заставит nginx писать лог в json (отдельный вопрос в том должен ли он вообще писаться на апликейшн сервере и нужна ли там нам эта логика? Ответ - нет, нахрен она там не нужна. Мы не полные идиоты чтобы нагружать апы дополнительной логикой помимо основной задачи основных приложений которые они поддерживают. 3. Соответственно, мы должны реализовать (заново изобрести) масштабируемое приложение которое будет способно забирать/получать данные логов с шлюзов и(или) балансиров и(или) серверов приложений и выполнять с ними некоторые определенные действия. Передачу рассматривать не будем, не интересно. перейдем сразу к сервису: 4. предположим что у нас есть доступ (на что как раз хотел показать придумавший эту задачу) к оооочень большому числу файлов и большому объему данных в них. Они у нас уже в нужном формате. Соответственно, что можно нам потребоваться для реализации задачи: 4.1. Нам однозначно потребуется кластер с индексом по обновляемым данным. Строгой необходимости реализовывать его на системах для реализации сложного поиска я не вижу, но тем не менее, при реальных условиях эксплуатации нам совершенно точно может потребоваться поиск конкретных записей (вроде не увидел в ТЗ), помимо агрегированных отфильтрованных каунтов из первичных данных (по сути, аналитика). Второй критерий к реализации уровня данных: поддержка кластеризации и масштабируемость из коробки. Поэтому да, это может быть эластик. Равно как и солр или вообще голый апач люсен который они используют. Тем не менее, следуя условиям задачи, мы можем взять даже самую обычную mongodb, писать в нее получаемые уже в json записи логов и чувствовать все преимущества nosql. 4.2. Приложению осталась всего лишь логика обработки первичных данных. И то она опциональна: мы можем агрегировать данные при их поступлении по фильтрам и в веб-приложении видеть по сути сформированные готовые отчеты (делать это налету неблагодарное дело при больших объемах). На самом деле, решение на эластике справится с этим и для него предназначено . Изящнее это решается периодическим пересчетом данных и формированием готовых отчетов подобно тому как это делают счетчики (метрика и т.п.) и запись агрегированных данных (по всем фильтрам отчетов, прим.: по часам, для каждого фильтра и т.п. в колоночную базу данных) согласно ТЗ. Это исключит необходимость формирования отчетов налету по поступлению запроса и позволит молниеносно показывать результат.
админить - не особо, а так - пользуюсь. --- Добавлено --- к слову, для быстрого анализа логов есть https://goaccess.io/ ставится быстро, настроек не требует, юзается прямо с консоли.
Это для устройства на работу тебя так задрочили? Ты им запилил что-то free, а они тебя не взяли? Так это было? Я с этими козлами кстати работал уже, я про роистат. Мышей не ловят совсем, не понравилась их контора. Вот тут ключевая хрень написана. Им скрипт рабочий не нужен, хотели твой стиль оценить. Может у них главный задрот из стандарт-наци, увидел, что у тебя табами вместо пробелов отступы (или наоборот), \r вместо \n между строчками, методы с большой буквы начинаются, вот и не взяли тебя. Надо было разведку провести сначала. Может он vim любит, пизданул бы ему просто чистый лист, но вот такой: Код (Text): Плюнь на них. Насчет сложных заданий на собеседованиях. Я как-то раз пытался пройти конкурс в KPMG. Аудиторская контора, одна из самых жирных. Там такое жесткое демо задание было, но народ кто в их паблике был подписан все равно бросился решать. Там стояла очень четкая задача по минимизации налоговых платежей иностранному гражданину при устройстве на работе в Россию. Каких там только не было ответов. Моя самооценка тогда сильно пострадала.