2017-10-19 196 views
0

不确定用于以下数据的体系结构。原始日志的Hadoop体系结构,但也包含点击和视图

我在看下面的数据格式和容量:在查询字符串持有信息

  • 生API Apache日志(每天约15G)
  • JSON点击和浏览的广告 - 约每天3m条目。

这导致我寻找设置HDFS集群并使用fluentd或flume加载apache日志的选项。这一切看起来不错,但我不明白的是何时或如何解析apache日志以从查询字符串和路径中提取信息。例如:“/ home/category1 /?user = XXX & param1 = YYY & param2 = ZZZ”应该标准化为关于用户“XXX”的一些信息(他在访问“category1”的同时具有相应的参数)。我如何看到我的选择是直接存储日志,然后在所有群集上运行mapreduce作业来解析每个日志行,并将其存储在hdfs上。这不是浪费资源,因为操作每次都在整个集群中进行?如何将结果存储在Hbase中?

然后有数据是JSON描述某些广告的点击和视图。应该存储在同一个地方并被查询。

查询情况:

  • 什么特定的用户在过去的一天访问
  • 所有用户提供“参数1”在过去的X小时

有这么多的工具可用,我不确定哪些可能会有帮助,也许你可以用外行人的话来描述一些。

回答

0

尽管存储使用率很高,但以原始(或几乎原始)格式存储日志的一个显着优点是它能够处理未来的需求。您不会被在特定上下文中决定的严格架构阻止。这种方法也被称为Schema on Read策略。你可以在这个主题上找到很多文章。这里是一个:

[https://www.techopedia.com/definition/30153/schema-on-read]

现在,关于json的操作,我建议你看看星火,因为它提供了非常方便的机制这一点。在几行代码中,您可以轻松地将您的json文件加载到数据框中:模式将自动从数据中推断出来。然后,可以将此数据框注册为Spark SQL上下文中的表并使用SQL直接查询。比原始的json操作更容易。

val df = spark.read.json(<your file>) 
df.printSchema() // inspect the schema 
df.registerTempTable ("mytable") 
val df2 = sqlContext.sql("SELECT * form mytable") 

希望得到这个帮助!

相关问题