Hive Macros/UDFs - Параллельный / комбинированный / один интерпретатор

Я хотел бы создать расширение Hive (макрос / UDF / шлюз / прокси / фасад или что-то еще), который может

    а) создавать / изменять таблицы БД и

    б) обрабатывать данные.

Проблема здесь в том, что для b) желательна параллельная обработка, что является обычной практикой для UDF, в то время как это должно быть предотвращено для a), например, потому что я не могу добавить один и тот же столбец несколько раз в таблицу. На внешних интерфейсах решение должно оставаться совместимым с коннекторами Hive SAS, SAP, R, Pentaho, т. Е. Оно должно по-прежнему вести себя и использоваться как Hive.

Как бы вы порекомендовали добиться выполнения операторов создания / изменения БД, не сталкиваясь с ошибками дублирующихся команд HQL из-за параллельного выполнения UDF?

Мои идеи:

    1. Использование оболочки JDBC для выполнения а), как описано здесь, и пользовательских функций для б). Проблема: Требуется дополнительное программирование, установка и настройка (на стороне клиента / сервера): http://stackru.com/questions/8293314/is-there-any-lightweight-jdbc-обертка-с-этими-функциями, https://www.redfin.com/blog/2011/03/boilerplate_jdbc_wrapper.html, http://www.javaworld.com/article/2074249 /data-storage/create-your-own-type-3-jdbc-driver--part-1.html, http://jdbc.jcabi.com/

    2. Улей с UDFs + Подключение к парсеру Hive. Внутри хука HQL будет просто выполнен один раз: Проблема: Довольно сложная и требует изменения настроек Hive (возможно, не приемлемо): http://stackru.com/questions/17461932/hive-execution-hook

    3. Улей с макросами. Проблема: Кажется, что она не совсем зрелая, ограниченная (в основном цифры?) И плохо документированная.

    4. Hive с UDF + явный объединитель RESTful service + JDBC/Beeline/HCatalog в качестве командного API Hive. Проблема: SPoF (единая точка отказа).

    5. Hive с использованием UDFs + Hive combiner. Проблема: невозможная или очень сложная: http://stackru.com/questions/10925840/partial-aggregation-vs-combiners-which-one-faster

    6. Используйте агрегированный / комбинированный подход, как описано здесь в конце для UDAF: Проблема: Недостаточно документирована, возможно, неосуществима: http://www.dataiku.com/blog/2013/05/01/a-complete-guide-в-писание улей-udf.html

    7. Извлеките из GenericUDAFEvaluator и внедрите слияние для создания необходимых операторов SQL только один раз в отдельной таблице. Некоторые другие механизмы, такие как макрос Hive, могут выполнять команды, которые накапливаются в этой таблице. Проблема: Комплексная реализация и проблемы макросов Hive.

    8. Использование / расширение реализации шлюза Hive, такого как Knox gateway-service-hive: http://repo1.maven.org/maven2/org/apache/knox/gateway-service-hive/0.8.0/ Проблема: Too Knox-конкретный. Универсальная оболочка JDBC является лучшей основой в большинстве случаев.

Не совсем достаточно:

    9. Добавление "ЕСЛИ НЕ СУЩЕСТВУЕТ" в оператор для операторов HQL, где это поддерживается. Есть и другие механизмы, такие как http://stackru.com/questions/14381895/mysql-add-column-if-not-exist, http://stackru.com/questions/972922/add-column-to-mysql- таблицы, если-это делает, не существовать

    10. https://github.com/jwills/exhibit пользовательские функции на GitHub не совсем достаточны, но интересны.

    11. getExistingHiveConnection () сбивает с толку анализатор Hive; getNewHiveConnection() также не решает проблему нежелательного параллельного выполнения структурных команд HQL, приводящего к ошибкам.

Я заметил, что создание внутри UDF другого соединения с Hive приводит к путанице в синтаксическом анализаторе Hive - понятно. Однако внутри сложного UDF я также заметил, что в этом контексте второй.toString() больше не работает, почему?: public Object evaluate(GenericUDF.DeferredObject[] paramArrayOfDeferredObject) { … for (int i = 0; i < paramLen; i++) { paramObj = paramArrayOfDeferredObject[i].get(); paramObjectArr[i] = this.objConverters[0].convert(paramObj); tableName = paramObjectArr[i].toString(); // works …} потом: String tableName = paramObjectArr[0].toString(); // does NOT work, empty string is assigned, why?

1 ответ

@Thomas_Poetter - здесь вы приводите множество соображений, но мне не совсем понятно, каков ваш реальный вариант использования. Например, почему бы не разделить 1 и 2 полностью и выполнить свои структурные задачи непосредственно в HS2 и поместить обработку в UDF?

Oozie может также предоставить некоторые интересные возможности рабочего процесса для хранения этого отдельного, но выполняемого как единого рабочего процесса.

Обратите внимание, что Knox является только потоковым шлюзом для вызовов JDBC/ODBC на HS2. Расширение его для такого рода вещей не имело бы большого смысла. Однако вы можете предоставить простой пользовательский сервис для предоставления API, который Knox может использовать для вас. Если вам нужно выполнять свои задачи независимо от какого-либо внешнего приложения, это может быть полезно.

Другие вопросы по тегам