我是Hadoop生态系统的新手,可以通过在线文章自学它。我正在从事一个非常基础的项目,以便可以动手实践所学到的知识。
我的用例非常极端:我想显示要登录到应用程序管理员门户的用户的位置。因此,我有一台服务器不断生成日志,日志中包含用户ID,IP地址,时间戳。所有字段用逗号分隔。
我这样做的想法是让水槽代理流实时日志数据并写入HDFS。实施HIVE流程,该流程将从HDFS读取增量数据并将其写入HIVE表。使用独家新闻将数据从HIVE连续复制到RDMBS SQL表,然后使用该SQL表进行播放。到目前为止,我已经成功配置了flume代理,该代理从给定位置读取日志并写入hdfs位置。但是在此之后,我很困惑如何将数据从HDFS移到HIVE表。我想到的一个想法是要有一个MapRed程序,该程序将以HDFS格式读取文件并以Java编程方式写入HIVE表。但是我也想删除已经处理过的文件,并确保MapRed不会读取重复的记录。我在网上搜索并找到了可用于将文件数据复制到HIVE的命令,但这只是一次手动操作。在我的用例中,我想尽快将数据推送到HDFS中。请指导我如何完成此任务。链接会有所帮助。
我正在使用版本:Cloudera Express 5.13.0
更新1:我刚刚创建了一个外部HIVE表,该表指向HDFS在水槽中转储日志的位置。我注意到,一旦创建了表,就可以查询HIVE表并获取数据。这太棒了。但是,如果我暂时停止水槽代理,让应用服务器写入日志,现在如果我再次启动水槽,那么水槽将仅读取新日志并忽略已处理的日志会发生什么?同样,配置单元是否会读取未处理的新日志,并忽略其已处理的日志?
我应该如何将数据从HDFS移到HIVE表中
这不是Hive的工作方式。 Hive是现有HDFS存储上的元数据层。在Hive中,无论Flume将数据写入到哪个位置,都将定义一个EXTERNAL TABLE
。
[当数据到达时,Hive“自动知道”有新数据要查询(因为它读取了给定路径下的所有文件)
如果暂时停止Flume Agent,让应用程序服务器写入日志,现在如果我再次启动Flume,那么它将仅读取新的日志,而忽略已处理的日志,这会发生什么
取决于您如何设置Flume。 AFAIK,它将检查所有已处理的文件,并仅拾取新文件。
配置单元会读取未处理的新日志,并忽略它已处理的日志吗?
Hive没有未处理记录的概念。在每次新查询时,将始终根据您的查询条件来读取表位置中的所有文件。
Bonus:移除水槽和水瓢。使您的应用将记录生成到Kafka中。让Kafka Connect(或NiFi)从一个位置同时写入HDFS和RDBMS(Kafka主题)。如果您实际上需要读取日志文件,则Filebeat或Fluentd占用的资源少于Flume(或Logstash)]
Bonus 2:删除HDFS和RDBMS,而是使用更实时的摄取管道(例如Druid或Elasticsearch)进行分析。
Bonus 3:Presto / SparkSQL / Flink-SQL比Hive快(注意:Hive metastore实际上很有用,因此请保留RDBMS)