Skip to content

Latest commit

 

History

History
170 lines (50 loc) · 2.81 KB

aribic-spark-minihash-optmize.md

File metadata and controls

170 lines (50 loc) · 2.81 KB

1. 阿拉伯语文本规范化

阿拉伯语具有多种书写形式和变体,通过规范化可以显著减少冗余,提高去重效率。

​ • 去除变音符号(Diacritics)

import org.apache.spark.sql.functions.udf

val removeDiacritics = udf((text: String) => text.replaceAll("[\u064B-\u0652]", ""))

df = df.withColumn("normalized_text", removeDiacritics(col("original_text")))

​ • 统一字母形式(如将不同形式的Alef统一为“ا”):

val normalizeLetters = udf((text: String) => {

text.replaceAll("[أإآا]", "ا")

.replaceAll("ى", "ي")

.replaceAll("ؤ", "ء")

.replaceAll("ئ", "ء")

})

df = df.withColumn("normalized_text", normalizeLetters(col("normalized_text")))

2. 优化Spark集群配置

确保Spark集群充分利用资源,提升并行处理能力。

​ • 增加并行度:调整 spark.executor.instances、spark.executor.cores和spark.executor.memory,确保集群资源被充分利用。

​ • 合理设置分区数:通常设置为集群总核心数的2-3倍,以避免数据倾斜。例如:

df = df.repartition(300) // 假设集群总核心数为100

3. 使用高效的数据存储格式

选择列式存储格式如Parquet,提升读写性能并减少I/O开销。

​ • 转换为Parquet格式

df.write.parquet("path/to/parquet")

val parquetDF = spark.read.parquet("path/to/parquet")

4. 减少Shuffle操作

Shuffle操作是Spark中性能瓶颈的主要来源,尽量减少其发生。

​ • 使用窄依赖操作:如map和filter,避免使用需要Shuffle的操作(如groupBy)。

​ • 广播小表:对于需要连接的小表,使用广播变量来避免Shuffle。

val broadcastVar = spark.sparkContext.broadcast(smallDataset)

val joinedDF = largeDF.join(broadcastVar.value, "key")

5. 增量处理

每天仅处理新增的200MB数据,避免重复处理整个10TB数据。

​ • 实现增量流水线

​ 1. 处理新增数据:仅对当天新增的200MB数据应用去重逻辑。

​ 2. 合并结果:将新增数据与已有去重结果合并,确保整体数据的唯一性。

这样可以显著减少每日的处理时间和资源消耗。

6. 缓存中间结果

对于需要多次访问的中间数据,使用缓存来减少重复计算。

​ • 缓存规范化后的数据

df.cache()

7. 使用高效的MiniHash LSH实现

确保使用经过优化的MiniHash LSH库,或者基于Spark MLlib的LSH实现进行定制优化。

​ • 利用Spark MLlib的LSH

import org.apache.spark.ml.feature.MinHashLSH

val mh = new MinHashLSH()

.setNumHashTables(5)

.setInputCol("features")

.setOutputCol("hashes")

val model = mh.fit(df)

val hashedDF = model.transform(df)