2

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

我一直在阅读 Nutch 的设置 wiki:

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

他们在让我快速了解 nutch 的基础知识方面非常有帮助。我意识到我可以从源代码构建 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?

4

1 回答 1

0

因此,首先,这不能真正使用 GUI 来完成。相反,我使用 AWS Java API 开始工作。

我的种子文件位于 s3 中,然后将输出传输回 s3。

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

这是我的基本步骤配置。MAINCLASS 将是你的 nutch crawl 的包裹细节。类似 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)));
于 2013-08-27T18:44:38.683 回答