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
Hadoop 读卡夫卡的书,写拼花地板的hdfs_Hadoop_Apache Spark_Apache Kafka_Hdfs_Parquet - Fatal编程技术网

Hadoop 读卡夫卡的书,写拼花地板的hdfs

Hadoop 读卡夫卡的书,写拼花地板的hdfs,hadoop,apache-spark,apache-kafka,hdfs,parquet,Hadoop,Apache Spark,Apache Kafka,Hdfs,Parquet,我是大数据生态系统的新手,有点开始了 我读过几篇关于使用spark流媒体阅读卡夫卡主题的文章,但想知道是否可以使用spark作业而不是流媒体阅读卡夫卡主题? 如果是的话,你们能帮我指出一些能让我开始学习的文章或代码片段吗 问题的第二部分是以拼花形式向hdfs写信。 一旦我读了卡夫卡,我想我会有一个rdd。 将此rdd转换为数据帧,然后将数据帧作为拼花文件写入。 这是正确的方法吗 谢谢你的帮助 感谢您使用Spark Batch job(火花批处理作业)而不是流式处理从Kafka读取数据并将其以拼花

我是大数据生态系统的新手,有点开始了

我读过几篇关于使用spark流媒体阅读卡夫卡主题的文章,但想知道是否可以使用spark作业而不是流媒体阅读卡夫卡主题? 如果是的话,你们能帮我指出一些能让我开始学习的文章或代码片段吗

问题的第二部分是以拼花形式向hdfs写信。 一旦我读了卡夫卡,我想我会有一个rdd。 将此rdd转换为数据帧,然后将数据帧作为拼花文件写入。 这是正确的方法吗

谢谢你的帮助


感谢您使用Spark Batch job(火花批处理作业)而不是流式处理从Kafka读取数据并将其以拼花格式写入HDFS,您可以使用

结构化流媒体是一种可扩展且容错的流处理引擎,它构建在Spark SQL引擎上。您可以用表示静态数据上的批处理计算的相同方式来表示流计算。Spark SQL引擎将负责以增量和连续方式运行它,并在流数据继续到达时更新最终结果。您可以使用Scala、Java、Python或R中的Dataset/DataFrame API来表示流聚合、事件时间窗口、流到批连接等。计算在同一个优化的Spark SQL引擎上执行。最后,该系统通过检查点和预写日志确保端到端完全一次容错。简言之,结构化流提供了快速、可扩展、容错、端到端一次流处理,用户无需对流进行推理

它与卡夫卡一起作为内置源提供,也就是说,我们可以从卡夫卡轮询数据。它与Kafka broker版本0.10.0或更高版本兼容

为了在批处理模式下从Kafka提取数据,可以为定义的偏移范围创建数据集/数据帧

// Subscribe to 1 topic defaults to the earliest and latest offsets
val df = spark
  .read
  .format("kafka")
  .option("kafka.bootstrap.servers", "host1:port1,host2:port2")
  .option("subscribe", "topic1")
  .load()
df.selectExpr("CAST(key AS STRING)", "CAST(value AS STRING)")
  .as[(String, String)]

// Subscribe to multiple topics, specifying explicit Kafka offsets
val df = spark
  .read
  .format("kafka")
  .option("kafka.bootstrap.servers", "host1:port1,host2:port2")
  .option("subscribe", "topic1,topic2")
  .option("startingOffsets", """{"topic1":{"0":23,"1":-2},"topic2":{"0":-2}}""")
  .option("endingOffsets", """{"topic1":{"0":50,"1":-1},"topic2":{"0":-1}}""")
  .load()
df.selectExpr("CAST(key AS STRING)", "CAST(value AS STRING)")
  .as[(String, String)]

// Subscribe to a pattern, at the earliest and latest offsets
val df = spark
  .read
  .format("kafka")
  .option("kafka.bootstrap.servers", "host1:port1,host2:port2")
  .option("subscribePattern", "topic.*")
  .option("startingOffsets", "earliest")
  .option("endingOffsets", "latest")
  .load()
df.selectExpr("CAST(key AS STRING)", "CAST(value AS STRING)")
  .as[(String, String)]
源中的每一行都具有以下架构:

| Column           | Type          |
|:-----------------|--------------:|
| key              |        binary |
| value            |        binary |
| topic            |        string |
| partition        |           int |
| offset           |          long |
| timestamp        |          long |
| timestampType    |           int |
现在,要将数据写入拼花地板格式的HDFS,可以编写以下代码:

df.write.parquet("hdfs://data.parquet")
有关Spark结构化流媒体+卡夫卡的更多信息,请参阅以下指南-


我希望有帮助

使用卡夫卡流。SparkStreaming用词不当(它是引擎盖下的小批量,至少高达2.2)


关于这个话题,你已经有了几个很好的答案

只是想强调一下——小心直接流到拼花地板桌上。 当拼花地板的行组大小足够大(为简单起见,您可以说文件大小应该在64-256Mb左右)时,拼花地板的性能会大放异彩,以利用字典压缩、bloom过滤器等。(一个拼花地板文件中可以有多个行块,通常每个文件中都有多个行块;尽管行块不能跨越多个拼花地板文件)

如果您直接将数据流传输到拼花地板表,那么您很可能会得到一堆微小的拼花地板文件(取决于Spark streaming的小批量大小和数据量)。查询此类文件可能非常慢。例如,拼花可能需要读取所有文件的标题以协调架构,这是一个很大的开销。如果是这种情况,则需要有一个单独的过程,例如,作为一种解决方法,读取旧文件,然后将其写入“合并”(这不是一个简单的文件级合并,一个过程实际上需要读取所有拼花数据并溢出较大的拼花文件)

这种变通方法可能会扼杀数据“流”的最初目的。你也可以看看其他技术,比如ApacheKudu、ApacheKafka、ApacheDruid、Kinesis等,它们在这里工作得更好

更新:由于我发布了这个答案,现在这里有一个新的强大玩家-三角洲湖。如果你习惯了拼花地板,你会发现三角洲非常有吸引力(实际上,三角洲是建立在拼花地板层+元数据之上)。三角洲湖提供:

Spark上的ACID事务:

  • 可序列化的隔离级别确保读者永远不会看到不一致的数据
  • 可扩展元数据处理:利用Spark的分布式处理能力,轻松处理PB级表和数十亿文件的所有元数据
  • 流式处理和批处理统一:Delta Lake中的表是一个批处理表,也是一个流式源和汇。流式数据接收、批处理历史回填、交互式查询都是现成的
  • 模式强制:自动处理模式变化,以防止在接收过程中插入坏记录
  • 时间旅行:数据版本控制支持回滚、完整的历史审核跟踪和可复制的机器学习实验
  • 升级和删除:支持合并、更新和删除操作,以支持复杂用例,如更改数据捕获、缓慢更改维度(SCD)操作、流式升级等

这个答案有用吗?谢谢Himanshu,这很有用。似乎这需要Spark 2.2,在Spark 2.0等较低版本中是否有其他方法可以做到这一点。该库解决了该帖子中Avro到Spark行的问题: