1

作为概念证明,我正在构建这个极其简单的 Twitter Friends 爬虫。下面是它的作用:

  1. 为 Twitter 帐户“twitter-user-1”执行 CrawlJob
  2. 查找“twitter-user-1”的所有朋友
  3. 为“twitter-user-1”的所有好友执行 CrawlJob

这是我的代码到目前为止的样子:

def main( args:Array[String] ) {

  scalar {
    grid.execute(classOf[CrawlTask], "twitter-user-1").get
  }

}

class CrawlTask extends GridTaskNoReduceSplitAdapter[String] {

    def split( gridSize:Int, arg:String): Collection[GridJob] = {
        val jobs:Collection[GridJob] = new ArrayList[GridJob]()
        val initialCrawlJob = new CrawlJob()
        initialCrawlJob.twitterId = arg
        jobs.add(initialCrawlJob)
        jobs
    }

}

class CrawlJob extends GridJob {

  var twitterId:String = new String()

  def cancel() = {
    println("cancel - " + twitterId)
  }

  def execute():Object = {
    println("fetch friends for - " + twitterId)
    // Fetch and execute CrawlJobs for all friends
    return null
  }

}

我为所有 twitter 交互准备了 Java 服务。需要一些示例来弄清楚如何在现有作业中创建新作业并将其与原始任务相关联。

谢谢 | 斯里兰甘

4

1 回答 1

0

我是如何解决这个问题的?

从概念上结合 GridTasks 和 GridJobs。MySpecialGridTask 只能有一个 MySpecialGridJob。

然后,很容易在 Task 或 Job 中执行新的 GridTasks。

在上面的例子中:

class CrawlJob extends GridJob {

  var twitterId:String = new String()

  def cancel() = {
    println("cancel - " + twitterId)
  }

  def execute():Object = {
    println("fetch friends for - " + twitterId)
    // Fetch and execute CrawlJobs for all friends
    // Execute Job Here
    grid.execute(classOf[CrawlTask], "twitter-user-2").get
    grid.execute(classOf[CrawlTask], "twitter-user-3").get
    return null
  }

}
于 2011-03-10T07:14:45.940 回答