При отправке в Google Dataproc Hadoop Job не найден файл потоковой передачи Hadoop? - PullRequest
0 голосов
/ 02 января 2019

При попытке передать задание Hadoop MapReduce программно (из приложения Java, использующего библиотеку dataproc), задание сразу завершается неудачей.Когда вы отправляете ту же самую работу через пользовательский интерфейс, она работает нормально.

Я пытался использовать SSHing для кластера Dataproc, чтобы подтвердить, что файл существует, проверить разрешения и изменил ссылку на jar-файл.Ничего еще не сработало.

Я получаю ошибку:

Exception in thread "main" java.lang.ClassNotFoundException: file:///usr/lib/hadoop-mapreduce/hadoop-streaming-2.8.4.jar
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:264)
at com.google.cloud.hadoop.services.agent.job.shim.HadoopRunClassShim.main(HadoopRunClassShim.java:18)
Job output is complete

Когда я клонирую неудачное задание в консоли и смотрю на эквивалент REST, вот что я вижу:

POST /v1/projects/project-id/regions/us-east1/jobs:submit/
{
  "projectId": "project-id",
  "job": {
    "reference": {
      "projectId": "project-id",
      "jobId": "jobDoesNotWork"
    },
    "placement": {
      "clusterName": "cluster-name",
      "clusterUuid": "uuid"
    },
    "submittedBy": "service-account@project.iam.gserviceaccount.com",
    "jobUuid": "uuid",
    "hadoopJob": {
      "args": [
        "-Dmapred.reduce.tasks=20",
        "-Dmapred.output.compress=true",
        "-Dmapred.compress.map.output=true",
        "-Dstream.map.output.field.separator=,",
        "-Dmapred.textoutputformat.separator=,",
        "-Dmapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec",
        "-Dmapreduce.input.fileinputformat.split.minsize=268435456",
        "-Dmapreduce.input.fileinputformat.split.maxsize=268435456",
        "-mapper",
        "/bin/cat",
        "-reducer",
        "/bin/cat",
        "-inputformat",
        "org.apache.hadoop.mapred.lib.CombineTextInputFormat",
        "-outputformat",
        "org.apache.hadoop.mapred.TextOutputFormat",
        "-input",
        "gs://input/path/",
        "-output",
        "gs://output/path/"
      ],
      "mainJarFileUri": "file:///usr/lib/hadoop-mapreduce/hadoop-streaming-2.8.4.jar"
    }
  }
}

Когда я отправляю задание через консоль, оно работает.REST-эквивалент этой работы:

POST /v1/projects/project-id/regions/us-east1/jobs:submit/
{
  "projectId": "project-id",
  "job": {
    "reference": {
      "projectId": "project-id,
      "jobId": "jobDoesWork"
    },
    "placement": {
      "clusterName": "cluster-name,
      "clusterUuid": ""
    },
    "submittedBy": "user_email_account@email.com",
    "jobUuid": "uuid",
    "hadoopJob": {
      "args": [
        "-Dmapred.reduce.tasks=20",
        "-Dmapred.output.compress=true",
        "-Dmapred.compress.map.output=true",
        "-Dstream.map.output.field.separator=,",
        "-Dmapred.textoutputformat.separator=,",
        "-Dmapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec",
        "-Dmapreduce.input.fileinputformat.split.minsize=268435456",
        "-Dmapreduce.input.fileinputformat.split.maxsize=268435456",
        "-mapper",
        "/bin/cat",
        "-reducer",
        "/bin/cat",
        "-inputformat",
        "org.apache.hadoop.mapred.lib.CombineTextInputFormat",
        "-outputformat",
        "org.apache.hadoop.mapred.TextOutputFormat",
        "-input",
        "gs://input/path/",
        "-output",
        "gs://output/path/"
      ],
      "mainJarFileUri": "file:///usr/lib/hadoop-mapreduce/hadoop-streaming-2.8.4.jar"
    }
  }
}

Я вставил в коробку и подтвердил, что файл на самом деле присутствует.Единственное отличие, которое я действительно вижу, это «submitBy».Один работает, другой нет.Я предполагаю, что это вещь разрешения, но я не могу сказать, откуда взялись разрешения в каждом сценарии.В обоих случаях кластер Dataproc создается с одной и той же учетной записью службы.

Глядя на разрешения для этого jar в кластере, я вижу:

-rw-r--r-- 1 root root  133856 Nov 27 20:17 hadoop-streaming-2.8.4.jar
lrwxrwxrwx 1 root root      26 Nov 27 20:17 hadoop-streaming.jar -> hadoop-streaming-2.8.4.jar

Я попытался изменить mainJarFileUri, чтобы он не указывал явно на версионный jar на ссылку (так как он имел открытые разрешения),но на самом деле не ожидал, что это сработает.И это не так.

Кто-нибудь с большим опытом работы с Dataproc знает, что здесь происходит, и как я могу решить эту проблему?

1 Ответ

0 голосов
/ 10 января 2019

Одна распространенная ошибка, которую легко сделать в коде, - это вызвать setMainClass , когда вы намеревались вызвать setMainJarFileUri или наоборот.java.lang.ClassNotFoundException, который вы получили, указывает, что Dataproc пытался представить эту строку jarfile как имя класса, а не как jarfile, поэтому где-то в пути Dataproc думал, что вы установили main_class.Возможно, вы захотите еще раз проверить свой код, чтобы увидеть, является ли это ошибкой, с которой вы столкнулись.

Причина использования «задания клона» в графическом интерфейсе скрывает эту проблему в том, что графический интерфейс пытается быть более удобным для пользователя.предлагая одно текстовое поле для установки main_class или main_jar_file_uri и определяя, является ли это jarfile, посмотрев на расширение файла.Таким образом, если вы отправляете задание с URI jarfile в поле main_class, и это не удается, тогда вы нажимаете clone и отправляете новое задание, графический интерфейс попытается проявить смекалку и признать, что новое задание фактически указало jarfilename, и, следовательно, будет правильно устанавливать поле main_jar_file_uri в запросе JSON вместо main_class.

...