我们已经使用kafka火花流一段时间,直到现在我们使用的createStream方法KafkaUtils.
我们刚开始探索createDirectStream和喜欢它有两个原因:
1)更好/更容易"完全一次"语义
2)更好地将kafka主题分区与rdd分区相关联
我注意到它createDirectStream被标记为实验性的.我的问题是(抱歉,如果这不是非常具体):
我们应该探索一下这种createDirectStream方法,如果一次对我们来说非常重要吗?如果你们可以分享你的经验,那将是非常棒的.我们是否有可能不得不处理可靠性等其他问题?
我有两个关于 Spark 性能调优的问题:
我了解在 spark 作业中控制并行性的关键之一是正在处理的 RDD 中存在的分区数量,然后控制处理这些分区的执行程序和内核。我可以假设这是真的吗:
我知道每个执行程序拥有大量内核会对 HDFS 写入之类的事情产生 -ve 影响,但这是我的第二个问题,纯粹从数据处理的角度来看,两者之间有什么区别?例如,如果我有 10 个节点集群,这两个作业之间的区别是什么(假设每个节点有足够的内存来处理所有内容):
5 个执行器 * 2 个执行器核心
2 个执行器 * 5 个执行器核心
假设有无限的内存和 CPU,从性能的角度来看,我们是否应该期望上述两者的性能相同?
我们已经设置了一个 Spark 作业来插入到 Hive 中(使用数据帧)。hive表设置为创建动态分区。只要我们运行一个 Spark 作业将数据插入 Hive,一切都会完美运行。
我们遇到的问题是,我们预计将运行并发 Spark 作业以将数据加载到 Hive 中。这似乎不起作用。我读到动态分区不提供独占锁,而是提供共享锁。在我们的例子中,我们可以看到,如果同时运行 4-5 个 Spark 作业,数据就会损坏,一些记录会丢失。非常容易重现,几乎每次都会发生。
有人解决这个问题了吗?即使用并发作业的动态分区插入到配置单元表中,并且仍然确保不会发生数据损坏。任何意见都非常感谢!
火花代码片段:
// Set hive conf to allow dynamic partitions to be created
sqlContext.setConf("hive.exec.dynamic.partition.mode", "nonstrict")
//Create temp table to load data into Hive
parsedDataDF.registerTempTable("parsedDatatempTable")
//Insert data into Hive, dynamic partitioning
sqlContext.sql("insert into table " + hiveDBToLoad + "." + hiveTableToLoad + " partition (partition_1, partition_2, partition_3) " +
"select * from parsedDatatempTable")
Run Code Online (Sandbox Code Playgroud)