【发布时间】:2015-11-18 00:21:02
【问题描述】:
我正在尝试在结构如下的 Hadoop 序列文件中“跟随 tcp-stream”:
一世。时间戳作为键
ii.原始以太网帧作为值
该文件包含单个 TCP 会话,并且由于记录很长,TCP 帧的 sequence-id 溢出(这意味着 seq-id 不一定是唯一的,数据不能按 seq-id 排序,因为那样会被打乱)。
我使用 Apache Spark/Python/Scapy。
要创建 TCP 流,我打算:
1.) 过滤掉任何非 TCP-with-data 帧
2.) 按 TCP-sequence-ID 对 RDD 进行排序(在每个溢出周期内)
3.) 删除所有重复的序列 ID(在每个溢出周期内)
4.) 将每个元素映射到 TCP 数据
5.) 将生成的 RDD 存储为 HDFS 中的 testFile
RDD上的操作说明:
输入:
[(time:100, seq:1), (time:101, seq:21), (time:102, seq:11), (time :103, seq:21), ... , (time:1234, seq=1000), (time:1235, seq:2), (time:1236, seq:30), (time:1237, seq:18 )]
输出:
[(seq:1, time:100), (seq:11, time:102), (seq:21, time:101), .. .,(seq=1000, time:1234), (seq:2, time:1235), (seq:18, time:1237), (seq:30, time:1236)]
步骤 1 和 4 或明显。我想出的解决 2 和 3 的方法需要在 RDD 中的相邻元素之间进行比较,并可以选择返回任意数量的新元素(不一定是 2,当然无需执行任何操作 - 因此代码将并行运行)。有没有办法做到这一点?我几次检查了 RDD 类方法,但没有出现任何问题。
另一个问题是 RDD 的存储(步骤 5)。它是并行完成的吗?每个节点将他的 RDD 部分存储到不同的 Hadoop 块?还是先将数据转发到 Spark 客户端应用程序,然后再存储?
【问题讨论】:
标签: python tcp apache-spark pyspark rdd