运行Nutch爬上EMR(新手)

时间:2013-06-03 04:50:52

标签: amazon-web-services nutch emr

我是第一次使用EMR / Hadoop用户并第一次使用Apache Nutch用户。我正在尝试使用Apache Nutch 2.1进行一些屏幕抓取。我想在hadoop上运行它,但不想设置我自己的集群(一次一个学习曲线)。所以我正在使用EMR。我希望S3用于输出(以及我需要的任何输入)。

我一直在阅读Nutch的设置维基:

http://wiki.apache.org/nutch/NutchTutorial
http://wiki.apache.org/nutch/NutchHadoopTutorial

他们非常乐于帮助我快速掌握荷兰语的基础知识。我意识到我可以从源代码构建nutch,预配置一些正则表达式,然后留下一个hadoop友好的jar:

$NUTCH_HOME/runtime/deploy/apache-nutch-2.1.job

大多数教程最终都会运行一个抓取命令。在Hadoop示例中,它是:

hadoop jar nutch-${version}.jar org.apache.nutch.crawl.Crawl urls -dir crawl -depth 3 -topN 5

在本地部署示例中,它类似于:

bin/nutch crawl urls -dir crawl -depth 3 -topN 5

我的问题如下。我需要做些什么来让我的apache-nutch-2.1.job在EMR上运行?我传递了什么理由?对于上面的hadoop抓取示例,“urls”文件已经在带有种子URL的hdfs上。我如何在EMR上执行此操作?另外,我在命令行中指定什么才能使我的最终输出变为S3而不是HDFS?

1 个答案:

答案 0 :(得分:0)

首先,使用GUI无法实现这一点。相反,我得到了使用AWS Java API的nutch工作。

我的种子文件位于s3中,我将输出转移回s3。

我使用dsdistcp jar将数据从s3复制到hdfs。

这是我的基本步骤配置。 MAINCLASS将成为您的荷兰爬行的包裹细节。类似于org.apach.nutch.mainclass。

    String HDFSDIR = "/user/hadoop/data/";

    stepconfigs.add(new StepConfig()
            .withName("Add Data")
            .withActionOnFailure(ActionOnFailure.TERMINATE_JOB_FLOW)
            .withHadoopJarStep(new HadoopJarStepConfig(prop.getProperty("S3DISTCP"))
            .withArgs("--src", prop.getProperty("DATAFOLDER"), "--dest", HDFSDIR)));

    stepconfigs.add(new StepConfig()
            .withName("Run Main Job")
            .withActionOnFailure(ActionOnFailure.CONTINUE)
            .withHadoopJarStep(new HadoopJarStepConfig(nutch-1.7.jar)
            .withArgs("org.apache.nutch.crawl.Crawl", prop.getProperty("CONF"), prop.getProperty("STEPS"), "-id=" + jobId)));


    stepconfigs.add(new StepConfig()
            .withName("Pull Output")
            .withActionOnFailure(ActionOnFailure.TERMINATE_JOB_FLOW)
            .withHadoopJarStep(new HadoopJarStepConfig(prop.getProperty("S3DISTCP"))
            .withArgs("--src", HDFSDIR, "--dest", prop.getProperty("DATAFOLDER"))));

    new AmazonElasticMapReduceClient(new PropertiesCredentials(new File("AwsCredentials.properties")), proxy ? new ClientConfiguration().withProxyHost("dawebproxy00.americas.nokia.com").withProxyPort(8080) : null)
                .runJobFlow(new RunJobFlowRequest()
                .withName("Job: " + jobId)
                .withLogUri(prop.getProperty("LOGDIR"))
                .withAmiVersion(prop.getProperty("AMIVERSION"))
                .withSteps(getStepConfig(prop, jobId))
                .withBootstrapActions(getBootStrap(prop))
                .withInstances(getJobFlowInstancesConfig(prop)));