将实时数据从 HDFS 流式传输到 Hive

Streaming live data from HDFS to Hive

我是 Hadoop 生态系统的新手,通过在线文章自学。 我正在做一个非常基础的项目,这样我就可以亲身实践我学到的东西。

我的用例是极端的:想法是我想将登录门户网站的用户位置呈现给应用程序 admin.So,我有一个不断生成日志的服务器,日志有用户 ID、IP 地址, 时间戳。所有字段均以逗号分隔。

我的想法是让 flume 代理流式传输实时日志数据并写入 HDFS。有 HIVE 进程,它将从 HDFS 读取增量数据并写入 HIVE table。使用 scoop 不断地将数据从 HIVE 复制到 RDMBS SQL table 并使用那个 SQL table 来玩。 到目前为止,我已经成功配置了 flume 代理,它从给定位置读取日志并写入 hdfs 位置。但在此之后我很困惑,我应该如何将数据从 HDFS 移动到 HIVE table。我想到的一个想法是拥有一个 MapRed 程序,该程序将读取 HDFS 中的文件并以编程方式写入 Java 中的 HIVE tables。但我也想删除已经处理过的文件,并确保 MapRed 没有读取重复的记录。我在网上搜索并找到了可用于将文件数据复制到 HIVE 的命令,但那是一次手册 activity。在我的用例中,我想在 HDFS 中可用时尽快推送数据。 请指导我如何完成这项任务。链接会有帮助。

我正在开发版本:Cloudera Express 5.13.0


更新一: 我刚刚创建了一个外部 HIVE table 指向 HDFS 位置,其中 flume 正在转储日志。我注意到,一旦 table 创建,我就可以查询 HIVE table 并获取数据。这太棒了。但是如果我暂时停止 flume agent 会发生什么,让应用服务器写日志,现在如果我再次启动 flume 然后 flume 只会读取新日志而忽略日志已经处理了吗?同理,hive会不会读取未处理的新日志而忽略已经处理的日志?

how should I move data from HDFS to HIVE table

这不是 Hive 的工作方式。 Hive 是现有 HDFS 存储之上的元数据层。在 Hive 中,您将在 Flume 将数据写入的任何位置定义一个 EXTERNAL TABLE

当数据到达时,Hive "automatically knows" 有新数据要查询(因为它读取给定路径下的所有文件)


what will happen if I stop flume agent for time being, let app server to write logs, now if I start flume again then will flume only read new logs and ignore logs which are already processed

取决于您的设置方式 Flume。 AFAIK,它将检查所有已处理的文件,并且只选择新文件。

will hive read new logs which are not processed and ignore the ones which it has already processed?

Hive 没有未处理记录的概念。 table 位置中的所有文件将始终在每次新查询时被读取,受您的查询条件限制。


奖励:删除Flume和独家新闻。让您的应用程序生成记录到 Kafka 中。让 Kafka Connect(或 NiFi)从一个位置(Kafka 主题)写入 HDFS 和 RDBMS。如果您确实需要读取日志文件,Filebeat 或 Fluentd 占用的资源少于 Flume(或 Logstash)

奖励 2:删除 HDFS 和 RDBMS,而是使用 Druid 或 Elasticsearch 等更实时的摄取管道进行分析。

奖励 3:Presto / SparkSQL / Flink-SQL 比 Hive 更快(注意:Hive metastore 实际上很有用,因此请保留 RDBMS)