Перенос данных объемом 50 ТБ из локального кластера Hadoop в Google Cloud Storage

Я пытаюсь перенести существующие данные (JSON) в своем кластере Hadoop в Google Cloud Storage.

Я изучил GSUtil, и кажется, что это рекомендуемый вариант для перемещения больших наборов данных в GCS. Кажется, что он может обрабатывать огромные наборы данных. Однако кажется, что GSUtil может перемещать данные только с локальной машины на GCS или S3‹-> GCS, но не может перемещать данные из локального кластера Hadoop.

  1. Каков рекомендуемый способ перемещения данных из локального кластера Hadoop в GCS?

  2. В случае с GSUtil, может ли он напрямую перемещать данные из локального кластера Hadoop (HDFS) в GCS или сначала необходимо скопировать файлы на машину, на которой работает GSUtil, а затем передать их в GCS?

  3. Каковы плюсы и минусы использования библиотек Google Client Side (Java API) по сравнению с GSUtil?

Большое спасибо,


person obaid    schedule 13.08.2014    source источник


Ответы (2)


Вопрос 1. Рекомендуемый способ перемещения данных из локального кластера Hadoop в GCS — использовать Коннектор Google Cloud Storage для Hadoop. Инструкции на этом сайте в основном предназначены для запуска Hadoop на виртуальных машинах Google Compute Engine, но вы также можете загрузить коннектор GCS напрямую, либо gcs-connector-1.2.8-hadoop1.jar, если вы используете Hadoop 1.x или Hadoop 0.20.x, или gcs-connector-1.2.8-hadoop2.jar для Hadoop 2.x или Hadoop 0.23.x.

Просто скопируйте jar-файл в каталог hadoop/lib или $HADOOP_COMMON_LIB_JARS_DIR в случае Hadoop 2:

cp ~/Downloads/gcs-connector-1.2.8-hadoop1.jar /your/hadoop/dir/lib/

Вам также может понадобиться добавить следующее в ваш файл hadoop/conf/hadoop-env.sh, если вы используете 0.20.x:

export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:/your/hadoop/dir/lib/gcs-connector-1.2.8-hadoop1.jar

Затем вы, вероятно, захотите использовать аутентификацию «ключевого файла» служебной учетной записи, поскольку вы находитесь в локальном кластере Hadoop. Зайдите на свой сайт cloud.google.com/console, найдите APIs & auth слева, нажмите Credentials, если у вас еще нет одного щелчка Create new Client ID, выберите Service account, прежде чем нажимать Create client id, а пока для соединителя требуется " Тип пары ключей .p12", поэтому нажмите Generate new P12 key и следите за загруженным файлом .p12. Может быть удобно переименовать его, прежде чем поместить в каталог, более доступный из Hadoop, например:

cp ~/Downloads/*.p12 /path/to/hadoop/conf/gcskey.p12

Добавьте следующие записи в файл core-site.xml в каталоге конфигурации Hadoop:

<property>
  <name>fs.gs.impl</name>
  <value>com.google.cloud.hadoop.fs.gcs.GoogleHadoopFileSystem</value>
</property>
<property>
  <name>fs.gs.project.id</name>
  <value>your-ascii-google-project-id</value>
</property>
<property>
  <name>fs.gs.system.bucket</name>
  <value>some-bucket-your-project-owns</value>
</property>
<property>
  <name>fs.gs.working.dir</name>
  <value>/</value>
</property>
<property>
  <name>fs.gs.auth.service.account.enable</name>
  <value>true</value>
</property>
<property>
  <name>fs.gs.auth.service.account.email</name>
  <value>[email protected]</value>
</property>
<property>
  <name>fs.gs.auth.service.account.keyfile</name>
  <value>/path/to/hadoop/conf/gcskey.p12</value>
</property>

Как правило, fs.gs.system.bucket не используется, за исключением некоторых случаев для сопоставленных временных файлов, для этой цели вы можете просто создать новую одноразовую корзину. С этими настройками на главном узле вы уже сможете протестировать hadoop fs -ls gs://the-bucket-you-want to-list. На этом этапе вы уже можете попытаться вывести все данные из главного узла с помощью простого hadoop fs -cp hdfs://yourhost:yourport/allyourdata gs://your-bucket.

Если вы хотите ускорить его с помощью distcp Hadoop, синхронизируйте lib/gcs-connector-1.2.8-hadoop1.jar и conf/core-site.xml со всеми вашими узлами Hadoop, и все должно работать должным образом. Обратите внимание, что нет необходимости перезапускать узлы данных или узлы имен.

Вопрос 2. В то время как коннектор GCS для Hadoop может копировать напрямую из HDFS, даже не нуждаясь в дополнительном дисковом буфере, GSUtil не может, поскольку он не может интерпретировать протокол HDFS; он знает только, как работать с реальными файлами локальной файловой системы или, как вы сказали, с файлами GCS/S3.

Вопрос 3. Преимущество использования Java API заключается в гибкости; вы можете выбрать, как обрабатывать ошибки, повторные попытки, размеры буфера и т. д., но это требует больше работы и планирования. Использование gsutil хорошо для быстрых случаев использования, и вы наследуете много обработки ошибок и тестирования от команд Google. Коннектор GCS для Hadoop на самом деле создан непосредственно поверх Java API, и, поскольку он полностью с открытым исходным кодом, вы можете увидеть, какие вещи необходимы для его бесперебойной работы, здесь, в его исходном коде на GitHub: https://github.com/GoogleCloudPlatform/bigdata-interop/blob/master/gcs/src/main/java/com/google/cloud/hadoop/gcsio/GoogleCloudStorageImpl.java

person Dennis Huo    schedule 16.08.2014
comment
Большое спасибо Деннис за ваш подробный ответ, я также рассматриваю возможность передачи моих 50 ТБ данных в GCS с помощью gsutil. Моим критерием выбора решения (коннектора Hadoop или GsUtil) является общее количество времени, которое потребуется для загрузки данных в GCS. Считаете ли вы, что решение Hadoop будет быстрее, чем GsUtil (у gsutil есть возможность использовать несколько ядер)? Во-вторых, смогу ли я перенести свои hdfs-файлы размером 6 ГБ без потери/изменения данных из HDFS в GCS с помощью Hadoop-коннектора (поскольку каждый файл состоит из 128-мегабайтных блоков hdfs)? Спасибо еще раз, - person obaid; 17.08.2014
comment
Я только что понял, что исходный ответ опубликовал только первую часть моего ответа; Я пытался опубликовать его по ненадежному тарифному плану, надеюсь, мои ответы на вопрос 2 и вопрос 3 помогут прояснить различие между использованием коннектора GCS и gsutil. Как правило, многопоточность gsutil помогает загружать файлы только с одного локального компьютера, но для данных внутри HDFS gsutil не может напрямую читать эти данные, и вместо этого вы захотите использовать hadoop distcp, который сможет использовать все ядра. по всему вашему кластеру. Это должно быть настолько быстро, насколько позволяет ваша сеть, используя distcp. - person Dennis Huo; 17.08.2014
comment
Чтобы более точно ответить на ваши дополнительные вопросы: да, использование hadoop distcp hdfs://host:port/your-current-file-dir gs://your-bucket/new-file-dir определенно должно быть быстрее, чем попытка использовать саму gsutil. Ваши файлы hdfs размером 6 ГБ должны поступать в GCS в неизменном/неповрежденном виде, даже если в GCS фактические размеры базовых блоков будут абстрагированы (вы можете просто думать о них как о монолитных файлах размером 6 ГБ в GCS). Я бы рекомендовал сначала протестировать меньший подмножество или, может быть, только отдельные файлы, чтобы убедиться, что ваш distcp работает должным образом, прежде чем пробовать полные 50 ТБ. - person Dennis Huo; 17.08.2014
comment
Денис, большое спасибо, я очень ценю вашу помощь. Я пробую ваш подход (коннектор GCS hadoop), однако по какой-то причине я не вижу параметр учетной записи службы в учетных данных всякий раз, когда я нажимаю «Создать идентификатор клиента» для создания ключа. Это должно что-то делать с включенными API? У меня включено 4 API: GCS, GCS JSON API, Google Cloud SQL и BigQuery API. Я вижу следующие варианты: - Установленное приложение Запускается на настольном компьютере или портативном устройстве (например, Android или iPhone). - Android Подробнее - Приложение Chrome Подробнее - iOS Подробнее - Другое. - person obaid; 18.08.2014
comment
Поскольку учетные записи служб часто используются с виртуальными машинами Google Compute Engine, вполне возможно, что это связано с включением Google Compute Engine; на самом деле не нужно создавать какие-либо виртуальные машины, попробуйте включить его и посмотрите, откроет ли это параметры служебной учетной записи. - person Dennis Huo; 18.08.2014
comment
Только что перепроверил, и я не думаю, что учетные записи служб требуют включения какого-либо конкретного API. Скорее всего, при первом создании служебной учетной записи графический интерфейс проведет вас через некоторые дополнительные начальные шаги, которые я, возможно, давно забыл о выполнении в своих собственных проектах. В этом разделе документации по oauth2 есть скриншоты, показывающие, что искать, и, в частности, этот раздел — это поток ключей, о котором я упоминал. Найдите переключатели Тип приложения. - person Dennis Huo; 18.08.2014
comment
Спасибо, Денис, я решил проблему, просто войдя в учетную запись владельца. Я думаю, у меня не было разрешения на создание файла ключа. Моя роль Писатель. Спасибо - person obaid; 19.08.2014
comment
Кстати, мне просто интересно, как синхронизировать файл gcs jar (файл jar соединителя gcs Hadoop) со всеми узлами Hadoop! В случае с hadoop distcp -libjars не работает в моем случае. Я установил HADOOP_CLASSPATH, а также предоставил –libjar для dictcp. То есть я продолжаю получать это исключение: исключение com.google.cloud.hadoop.fs.gcs.GoogleHadoopFileSystem не найдено. Просто пытаюсь придумать способ использовать DistributedCache из командной строки, чтобы каким-то образом синхронизировать файл jar со всеми узлами. Было бы здорово, если бы вы могли поделиться своим подходом. - person obaid; 19.08.2014
comment
Лично я обычно использую коннектор GCS в качестве основной библиотеки, поэтому во время установки кластера я уже распространяю jar-файл во все каталоги lib/ на моих рабочих процессах либо с помощью scp, либо с помощью команды ssh для загрузки с общедоступного URL-адреса GCS. В вашем случае я не совсем понимаю, почему у вас не работает -libjars, но если вы хотя бы смогли убедиться, что настройка gcs-connector работает на мастере, вы можете использовать rsync и slaves файл. - person Dennis Huo; 20.08.2014
comment
Например, если вы установили hadoop под именем пользователя hadoop и он находится под /home/hadoop/hadoop-install/ на каждой машине, вы должны сделать: for HOST in `cat conf/slaves`; do rsync lib/gcs-connector-1.2.8-hadoop1.jar hadoop@$HOST:/home/hadoop/hadoop-install/lib/gcs-connector-1.2.8-hadoop1.jar; done, а затем то же самое для файлов core-site.xml и .p12. - person Dennis Huo; 20.08.2014
comment
@Dennis/@GoodDok Нужно ли нам обновлять core-site.xml для всех узлов в кластере? - person mhlaskar1991; 07.04.2021
comment
Правильно, нужно на всех узлах - person Dennis Huo; 09.04.2021

Похоже, в последних версиях изменено несколько имен свойств.

`String serviceAccount = "[email protected]";

String keyfile = "/path/to/local/keyfile.p12";

hadoopConfiguration.set("google.cloud.auth.service.account.enable", true); hadoopConfiguration.set("google.cloud.auth.service.account.email", serviceAccount); hadoopConfiguration.set("google.cloud.auth.service.account.keyfile", keyfile);`

person Satheessh Chinnusamy    schedule 04.01.2017