Потоковая передача данных из HDFS в Hive - PullRequest
0 голосов
/ 20 января 2020

Я новичок в экосистеме oop и самостоятельно изучаю ее через онлайн-статьи. Я работаю над очень базовым c проектом, чтобы я мог получить практические знания о том, что я узнал.

Мой пример использования чрезвычайно важен: идея в том, чтобы я хотел представить местоположение пользователя, который входит в портал Приложение Admin. Итак, у меня есть сервер, который постоянно генерирует журналы, журналы имеют идентификатор пользователя, IP-адрес, отметку времени. Все поля разделены запятыми.

Моя идея состоит в том, чтобы иметь Flume Agent для потоковой передачи данных журналов и записи в HDFS. Инициируйте процесс HIVE, который будет считывать дополнительные данные из HDFS и записывать в таблицу HIVE. Используйте s coop для непрерывного копирования данных из HIVE в таблицу RDMBS SQL и используйте эту таблицу SQL для воспроизведения. До сих пор я успешно настроил Flume Agent, который читает журналы из заданного местоположения и записывает в местоположение hdfs. Но после этого я запутался, как перенести данные из HDFS в таблицу HIVE. Одна идея, которая приходит мне в голову, - это иметь программу MapRed, которая будет читать файлы в HDFS и программно записывать в таблицы HIVE в Java. Но я также хочу удалить файлы, которые уже обработаны, и убедиться, что MapRed не читает дублирующиеся записи. Я искал в Интернете и нашел команду, которую можно использовать для копирования файловых данных в HIVE, но это своего рода руководство, когда вы выполняете какое-то действие. В моем случае я хочу собрать данные sh, как только они появятся в HDFS. Пожалуйста, объясните мне, как решить эту задачу. Ссылки будут полезны.

Я работаю над версией: Cloudera Express 5.13.0


Обновление 1: я только что создал внешнюю таблицу HIVE, указывающую на местоположение HDFS, куда поток записывает журналы. Я заметил, что как только таблица создана, я могу запросить таблицу HIVE и получить данные. Это круто. Но что произойдет, если я остановлю Flume Agent на некоторое время, разрешу серверу приложений записывать журналы, а теперь, если я снова запустите Flume, то будет ли Flume читать только новые журналы и игнорировать журналы, которые уже обработаны? Аналогично, будет ли hive читать новые журналы, которые не были обработаны, и игнорировать те, которые он уже обработал?

1 Ответ

1 голос
/ 21 января 2020

как мне перенести данные из HDFS в таблицу HIVE

Это не так, как работает Hive. Hive - это слой метаданных поверх существующего хранилища HDFS. В Hive вы определяете EXTERNAL TABLE везде, куда Flume записывает ваши данные.

По мере поступления данных Hive "автоматически знает", что есть новые данные для запроса (так как он читает все файлы по указанному пути)


что произойдет, если Я временно остановлю Flume Agent, разрешу серверу приложений записывать журналы, теперь, если я снова запустлю Flume, тогда Flume будет только читать новые журналы и игнорировать журналы, которые уже обработаны

Зависит от того, как вы настроили Flume. AFAIK, он будет проверять все обработанные файлы и подбирать только новые.

будет ли hive читать новые журналы, которые не были обработаны, и игнорировать те, которые он уже обработал?

Hive не имеет понятия необработанные записи. Все файлы в расположении таблицы всегда будут читаться, ограниченные условиями вашего запроса, при каждом новом запросе.


Бонус : Удалить Flume и S coop. Заставьте ваше приложение создавать записи в Kafka. Попросите Kafka Connect (или NiFi) записывать как HDFS, так и ваши СУБД из одного места (Kafka topi c). Если вам действительно нужно прочитать файлы журнала, Filebeat или Fluentd потребляют меньше ресурсов, чем Flume (или Logsta sh)

Bonus 2 : удалите HDFS и RDBMS и вместо этого используйте более реальную время приема пищи, как Druid или Elasticsearch для аналитики.

Бонус 3 : Presto / Spark SQL / Flink- SQL быстрее, чем Hive (примечание: Hive metastore действительно полезен, поэтому сохраняйте RDBMS для этого)

...