我们的Hadoop集群有20个节点。 16核,128G内存/节点。
我们需要对HDFS中的日志记录数据集(hive)进行复杂分析,我们使用Parquet + Snappy进行压缩,并将2个月的日志加载到RDD,这是5亿条记录,HDFS大约需要40G。从性能角度来看,SparkSql在它上面运行得很好。
我们基本上是这样做的:
select host, ip from logs where t1<time<t2,
select host, ip from logs where t3<time<t4,
select host, ip from logs where t5<time<t6,
select host, ip from logs where t7<time<t8,
然后我们合并了4组结果并尝试找出主机/ IP在四个时隙中处于活动状态。真实情况更复杂,但就目前而言,这个例子都可以。
2年的记录是近50亿条记录,300~G。我们试图将它全部加载到RDD,SaprkSql的工作速度非常慢,显然,我们遇到了“内存不足”的问题。经常(我们为每个Spark节点分配了30G内存)。只是想知道这种问题有什么最佳实践吗?例如保留Spark的最新2个月数据,而旧数据以不同方式处理?或者Spark可能不适合这个?