使用Spark MLLib聚类(K-Means)进行网络异常检测

时间:2016-11-16 00:28:29

标签: python apache-spark apache-spark-mllib

我有一大堆网络数据,我一直用它来集群练习Spark和MLLib。我已经将数据规范化为一组向量,表示一天中的时间,方向(进出网络),发送的字节数,接收的字节数以及每个连接的持续时间。共有七个维度。

使用KMeans,使用此数据构建模型非常容易。使用该模型,每个输入向量被“分类”并且距离被计算为最近的质心。最后,RDD(现在用距离标记)按距离排序,并提取最极端值。

我的数据中的一个输入列是连接uuid(唯一的字母数字标识符)。我希望通过模型传递这些数据(保留每个输入向量唯一标记),但是当列无法转换为浮点时会触发异常。

这里的问题是:“我如何最有效地将异常值与原始输入数据联系起来?”输入数据严重标准化,与原始输入不同。此外,源和目标IP地址已丢失。我没有在KMeans中看到任何界面告诉它在构建模型时要考虑(或相反地忽略)哪些列。

我的代码看起来像这样:

def get_distance(clusters):
    def _distance_map(record):
        cluster = clusters.predict(record)
        centroid = clusters.clusterCenters[cluster]
        dist = np.linalg.norm(np.array(record) - np.array(centroid))
        return (dist, record)
    return _distance_map

def parseMap(row):
    # parses rows of data out of the input strings

def conMap(row):
    # normalizes the values to be used in building the model

rdd = sc.textFile('/data2/network/201610').filter(lambda r: r[0] != '#')
tcp = rdd.map(parseMap).filter(lambda r: r['proto'] == 'tcp')
cons = tcp.map(conMap)  # this normalizes connection data

model = KMeans.train(cons, (24 * 7), maxIterations=25,
                     runs=1, initializationMode = "random")

data_distance = cons.map(get_distance(model)).sortByKey(ascending=False)
print(data_distance.take(10))

1 个答案:

答案 0 :(得分:0)

由于K-means对异常值敏感,这意味着异常数据通常仅在集群中结束。

您需要按键(群集)计算数据点,以找出捕获异常值的群集并过滤掉这些点。