Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark HDFS的批量分析_Apache Spark_Hadoop_Hive_Hdfs_Batch Processing - Fatal编程技术网

Apache spark HDFS的批量分析

Apache spark HDFS的批量分析,apache-spark,hadoop,hive,hdfs,batch-processing,Apache Spark,Hadoop,Hive,Hdfs,Batch Processing,我通常使用Spark结构化流媒体、Kafka、HBase等进行实时分析。我没有开发任何批量分析作业/系统。我想学习批量分析设计和开发。为此,我试图理解lambda架构,但我不知道一些事情 让我们回顾一下假设 我正在实时获取clickstream数据。所有发送到卡夫卡接受的数据 速度层:我们可以使用Spark Streaming/Flink等实时分析clickstream数据中的会话。然后我们可以将分析结果发送给HBase、Cassandra等。这是lambda体系结构的速度层。我通常知道这一层

我通常使用Spark结构化流媒体、Kafka、HBase等进行实时分析。我没有开发任何批量分析作业/系统。我想学习批量分析设计和开发。为此,我试图理解
lambda架构
,但我不知道一些事情


让我们回顾一下假设

我正在实时获取clickstream数据。所有发送到卡夫卡接受的数据

速度层:我们可以使用Spark Streaming/Flink等实时分析clickstream数据中的会话。然后我们可以将分析结果发送给HBase、Cassandra等。这是
lambda体系结构的速度层。
我通常知道这一层(我也在这一层工作)


批处理层:我们可以使用Apache Nifi、Kafka Connect等将数据从Kafka发送到HDFS。这里的第一个问题

问题1:我如何向HDFS发送数据?HDFS具有一次写入多次读取的概念。我是否应该将数据以批处理格式从Kafka发送到HDFS(例如,每5或10分钟发送一次)?文件格式应该是什么?JSON、拼花、文本、CSV等

将数据发送到HDFS后,假设使用配置单元或Spark SQL对其进行分析。我为此每30分钟配置一次作业。此作业通常与流式分析相同。但它每30分钟运行一次,并分析用户会话(用户行为)

问题2:如何仅从HDFS获取新数据(在上一批之后接收到的数据)

问题3:假设我想访问当前批次分析中上一批次的会话分析结果,如何合并当前批次分析和上一批次分析结果

问题4:我应该将数据作为分区格式写入HDFS吗?例如,每个clickstream数据都有时间戳。因此,我应该按年、日、时、分等写吗

现在非常感谢你

有些答案是主观的。你可以考虑什么最适合你的需要。这些只是我过去使用过的观察或技术

问题1:如何向HDFS发送数据?HDFS有写一次读多个概念。我是否应该将数据以批处理格式从Kafka发送到HDFS(例如,每5或10分钟发送一次)?文件格式应该是什么?JSON、拼花、文本、CSV等

根据您使用的源,您可以选择将数据流式传输到HDFS或Hive,甚至像HBase这样的层(取决于您可以在线+离线共享存储的用例)。我有大型卡夫卡管道,我将数据流传输到Hive(ORC),我过去使用过Storm,但图层由您选择。您可以选择任何适合您处理需要的柱状格式(ORC、拼花地板、Avro都是流行的选择)

将数据发送到HDFS后,假设使用配置单元或Spark SQL对其进行分析。我为此每30分钟配置一次作业。此作业通常与流式分析相同。但它每30分钟运行一次,并分析用户会话(用户行为)

同样,根据存储方式,可以使用HiveQL或Spark SQL进行分析。我个人更喜欢spark,因为我发现编程运算符比HiveQL上类似SQL的运算符更方便。操作符的支持集也很大

问题2:如何仅从HDFS获取新数据(在上一批之后接收到的数据)

如果您对数据进行流处理,这个问题就会得到解决。如果read也是批处理,则您可能希望在故障安全或具有冗余(例如Zookeeper)的系统上更好地维护一些偏移管理(例如Kafka或Azure事件中心等)。您可以从典型的数据仓库技术如何解决这个问题中得到一个线索:在数据摄取上有一个时间维度,然后使用一个一行一列的表,该表说明您处理了什么时间戳。我更喜欢在运行中处理的最大时间上使用一个简单的历元。在下一次运行中,使用SQL操作符,您可以在其中说出IngestionTS>的位置,这将检索增量

问题3:假设我想访问当前批次分析中上一批次的会话分析结果,如何合并当前批次分析和上一批次分析结果

这里必须有一个数据策略。您是否有可能延迟的限时数据。我将告诉您一个实际的场景,我们分析的交易可能会延迟2天!。根据规则,我们有时会忽略它们,有时会重新计算聚合并保存它们。如果必须重新计算,一种方法是创建时间版本记录。根据批处理的运行时间,我们曾经有一个滑动窗口来容纳2天的数据(计算成本很高,帮不上忙),甚至为这些延迟的数据记录提供了特殊的表&重新计算数据,然后向计算记录添加一个版本。当批处理运行时,这可以是一个简单的历元时间。然后,您可以选择具有最大“版本”的聚合

问题4:我应该将数据作为分区格式写入HDFS吗?例如,每个clickstream数据都有时间戳。因此,我应该按年、日、时、分等写吗

是的,你应该。您计划如何对数据进行分段,您可以在此基础上选择一种分区策略。我们在某些情况下使用事务类型,在某些情况下使用日期时间。它们总是由您如何选择和操作数据来引导。例如,您可以有一个按天计算聚合的策略,然后删除原始数据的分区

正如你们所看到的,我上面的回答只是主观的,基于我所做的用例。在这些方面有很多变化,您可以应用于您的数据!。快乐数据工程

有些答案是主观的。你可以考虑什么最适合你的需要。这些只是我过去使用过的观察或技术

问题1:我如何向t发送数据