R подключается к экземпляру EC2 для параллельной обработки

У меня возникли проблемы с инициализацией подключения к экземпляру AWS EC2 из R, поскольку я продолжаю получать сообщение об ошибке: Permission denied (publickey) В настоящее время я использую Mac OS X 10.6.8 в качестве своей ОС.

Код, который я пытаюсь запустить в терминале ($), а затем R (>), выглядит следующим образом:

$ R --vanilla
> require(snowfall)
> sfInit(parallel=TRUE,socketHosts =list("ec2-xx-xxx-xx-xx.zone.compute.amazonaws.com"))
Permission denied (publickey)

но странно, когда я пытаюсь подключиться к экземпляру по ssh, мне не нужен пароль, так как я уже импортировал открытый ключ в экземпляр при инициализации (я думаю)

так что с моего обычного терминала... при запуске

$ ssh [email protected]

он автоматически подключается... (поэтому я не уверен на 100%, что это проблема без пароля, как в Использование снега (и снегопада) с AWS для параллельной обработки в R)

Я пытался просмотреть изрядное количество материалов о ключах и т. д., но, похоже, ни один из них не имеет большого значения. Также мой ~/.ssh/authorized_keys по какой-то причине является папкой, а не файлом, и я не могу получить к нему доступ, даже когда пытаюсь sudo cd .ssh/authorized_keys... с точки зрения разрешений, которые у него есть drw-------

Конечная цель состоит в том, чтобы подключиться к большому количеству экземпляров ec2 и использовать foreach для выполнения некоторой параллельной обработки... но сейчас было бы неплохо подключиться к одному... также я хотел бы использовать свой собственный ami, чтобы звездное скопление не это действительно то, что я ищу.... (если только я не могу использовать частный амис и запускать все команды в частном порядке...)

также, если doRedis лучше, чем если бы кто-то мог показать мне, как можно подключиться к экземпляру ec2 с локальной машины, это тоже было бы хорошо...

ИЗМЕНИТЬ

Мне удалось справиться с входом в систему без пароля ssh с помощью пакета parallel makePSOCKcluster, как показано в R и makePSOCKcluter EC2 socketConnection ... но теперь сталкиваюсь с socketConnection проблемами, как показано в вопросе по ссылке...

Есть идеи как к нему подключиться?

Также доказательство того, что все работает, я думаю, будет означать, что следующая команда/функция будет работать, чтобы получить все разные IP-адреса.

d <- parLapply(cl1, 1:length(cl1),function(x)system("ifconfig",intern=T)[2])

где cl1 — результат функции make*cluster.

ПРИМЕЧАНИЕ, так как вознаграждение действительно за вопрос в ссылке.... Я не против, на какой вопрос вы публикуете ответ... но до тех пор, пока что-то написано по этому вопросу который связывает его с правильным ответом на связанный вопрос, тогда я соответственно начисляю баллы...


person h.l.m    schedule 22.11.2012    source источник
comment
Похоже, вы не даете своим машинам разрешения ssh. Взгляните на youtube.com/watch?v=YfCgK1bmCjw (00:06: 43)   -  person JohnRos    schedule 10.06.2013


Ответы (1)


У меня было довольно много проблем с параллельной настройкой EC2, когда я пытался сохранить локальный главный узел. Использование StarCluster для настройки пула очень помогло, но настоящее улучшение произошло при использовании StarCluster и< /em> наличие главного узла в частном пуле IP-адресов EC2.

StarCluster настраивает всю обработку ключей для всех узлов, а также всех используемых монтирований. Динамическое распределение узлов было невыполнимо, но если спотовые инстансы не будут использоваться в долгосрочной перспективе, а ваша стратегия назначения ставок не «сохраняет» ваши инстансы, динамическое распределение должно стать проблемой.

Некоторые другие извлеченные уроки:

  • Создайте переменную, содержащую частные IP-адреса, для передачи в createCluster и экспортируйте ее, чтобы упростить перезапуск с теми же узлами.
  • Запустите byobu на главном узле и настройте на нем ведение журнала сеансов R.
  • Запуск сервера RStudio на ведущем узле иногда может быть очень полезным, но это должен быть другой AMI, чем ведомые узлы. :)
  • Пусть управляющий сценарий разгружает файлы данных rda по пути, который удаленно отслеживается на наличие новых файлов, и автоматически загружает их.
  • Используйте htop для мониторинга ведомых устройств, чтобы вы могли легко увидеть экземпляры и определить требования скрипта (память/процессор/масштабируемость).
  • Используйте сценарии включения/отключения гиперпоточности процессора.

У меня была небольшая проблема с ведомыми соединениями и сериализацией/десериализацией, и я обнаружил, что одной из вещей был предел соединения, и что предел соединения необходимо уменьшить на количество узлов; и когда сценарий управления был остановлен, самым простым методом очистки был перезапуск основного сеанса R и использование сценария для уничтожения подчиненных процессов вместо ожидания тайм-аута.

Для настройки потребовалось немного работы, но, надеюсь, эти мысли помогут...


Хотя это было 8 месяцев назад, и StarCluster и R изменились, вот кое-что из того, как это было настроено... Вы найдете 90% этого в документации StarCluster.

  • Настройте разделы .starcluster/config AWS и пары ключей на основе информации о безопасности из консоли AWS.
  • Define the [smallcluster]
    • key-name
    • зона доступности
  • Определите шаблон кластера, расширяющий [smallcluster]. Использование AMI на основе 64-битного AMI StarCluster HVM. Вместо создания новых общедоступных экземпляров AMI я просто сохранил настроенный экземпляр (со всеми необходимыми мне инструментами) и использовал его в качестве AMI.

Вот пример одного...

[cluster Rnodes2]
EXTENDS=smallcluster
MASTER_INSTANCE_TYPE = cc1.4xlarge
MASTER_IMAGE_ID= ami-7621f91f
NODE_INSTANCE_TYPE = cc2.8xlarge
NODE_IMAGE_ID= ami-7621f91f
CLUSTER_SIZE= 8
VOLUMES= rdata
PLUGINS= pkginstaller
SPOT_BID= 1.00
  • Настройте общий том, здесь находятся журналы screen/byobu, выходные данные основной контрольной точки сценария .R, общие данные R и исходный код производственного пакета в реальном времени. Он отслеживался на наличие новых файлов в дочернем пути, называемом экспортом, поэтому, если кластер или сценарий управления умирает / искажается, максимальное количество записей будет потеряно, и их необходимо будет пересчитать.

После создания общего тома определение было простым:

[volume rdata]
VOLUME_ID = vol-1145497c
MOUNT_PATH = /rdata

Установщик пакетов, обеспечивающий наличие последних (и одинаковых) версий R на всех узлах.

[plugin pkginstaller]
setup_class = starcluster.plugins.pkginstaller.PackageInstaller
packages = r-base, r-base-dev, r-recommended

Наконец, права доступа для сервера ssh и RStudio. HTTPS через прокси было бы безопаснее, но поскольку RStudio использовался только для настройки скрипта управления...

[permission ssh]
# protocol can be: tcp, udp, or icmp
protocol = tcp
from_port = 22
to_port = 22

# [permission http]
protocol = tcp
from_port = 8787
to_port = 8787

Затем запустите кластер с помощью интерфейса StarCluster. Он обрабатывает все элементы управления доступом, системные имена, общие ресурсы и т. д. После запуска кластера я запустил сеанс ssh для каждого из своей локальной системы и запустил скрипт для остановки гиперпоточности:

#!/bin/sh

# disable hyperthreading
for cpunum in $(
    cat /sys/devices/system/cpu/cpu*/topology/thread_siblings_list | 
    cut -s -d, -f2- | tr ',' '\n' | sort -un); do
        echo 0 > /sys/devices/system/cpu/cpu$cpunum/online
done

затем запустил сеанс htop на каждом для мониторинга масштабируемости по экспортированным журналам контрольных точек.

Затем, войдя в мастер, запустил сеанс экрана (с тех пор я предпочитаю byobu) и запустил R из смонтированного тома StarCluster. Таким образом, когда кластер по какой-то причине останавливался, я мог легко настроить его снова, просто запустив R. В R первым делом нужно было создать переменную workers.list, используя имена nodeXXX, что было примерно так:

cluster.nodes <- c("localhost", paste("node00", 1:7, sep='' ) )
workers.list <- rep( cluster.nodes, 8 )

Затем я загрузил скрипт управления, вышел и сохранил рабочее пространство. Сценарий управления обрабатывал все выходные данные таблицы для экспорта и контрольных точек, а также вызовы с парной оболочкой для производственного пакета. Основная функция скрипта также принимала аргумент cpus, в котором размещался список рабочих процессов, который затем передавался как cores инициализатору кластера.

initialize.cluster <- function( cores )
{
  if( exists( 'cl' ) ) stopCluster( cl )

  print("Creating Cluster")
  cl <- makePSOCKcluster( cores )    
  print("Cluster created.")
  assign( 'cl', cl, envir=.GlobalEnv )
  print( cl )

  # All workers need to have the bounds generator functions...
  clusterEvalQ( cl, require('scoreTarget') )
  # All workers need to have the production script and package.
  clusterExport( cl, varlist=list('RScoreTarget', 'scoreTarget'))
  return ( cl )
}

После перезапуска сеанса R (после первоначального создания worker.list) был получен сценарий управления и вызвана основная функция. Вот оно. При такой настройке, если кластер когда-нибудь остановится, я просто выйду из rsession на основном хосте; остановите подчиненные процессы через htop на каждом из подчиненных устройств и запустите снова.

Вот пример в действии:

R

R version 2.15.0 (2012-03-30)
Copyright (C) 2012 The R Foundation for Statistical Computing
ISBN 3-900051-07-0
Platform: x86_64-pc-linux-gnu (64-bit)

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.

  Natural language support but running in an English locale

R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.

Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.

[Previously saved workspace restored]

> source('/rdata/buildSatisfactionRangeTable.R')
Loading required package: data.table
data.table 1.7.7  For help type: help("data.table")
Loading required package: parallel
Loading required package: scoreTarget
Loading required package: Rcpp
> ls()
 [1] "build.satisfaction.range.table" "initialize.cluster"            
 [3] "initialize.table"               "parallel.choices.threshold"    
 [5] "rolled.lower"                   "rolled.upper"                  
 [7] "RScoreTarget"                   "satisfaction.range.table"      
 [9] "satisfaction.search.targets"    "search.range.bound.offsets"    
[11] "search.range.bounds"            "search.range.center"           
[13] "Search.Satisfaction.Range"      "update.bound.offset"           
[15] "workers.list"                  
> workers.list
  [1] "localhost" "localhost" "localhost" "localhost" "localhost" "localhost"
  [7] "localhost" "localhost" "node001"   "node002"   "node003"   "node004"  
 [13] "node005"   "node006"   "node007"   "node001"   "node002"   "node003"  
 [19] "node004"   "node005"   "node006"   "node007"   "node001"   "node002"  
 [25] "node003"   "node004"   "node005"   "node006"   "node007"   "node001"  
 [31] "node002"   "node003"   "node004"   "node005"   "node006"   "node007"  
 [37] "node001"   "node002"   "node003"   "node004"   "node005"   "node006"  
 [43] "node007"   "node001"   "node002"   "node003"   "node004"   "node005"  
 [49] "node006"   "node007"   "node001"   "node002"   "node003"   "node004"  
 [55] "node005"   "node006"   "node007"   "node001"   "node002"   "node003"  
 [61] "node004"   "node005"   "node006"   "node007"   "node001"   "node002"  
 [67] "node003"   "node004"   "node005"   "node006"   "node007"   "node001"  
 [73] "node002"   "node003"   "node004"   "node005"   "node006"   "node007"  
 [79] "node001"   "node002"   "node003"   "node004"   "node005"   "node006"  
 [85] "node007"   "node001"   "node002"   "node003"   "node004"   "node005"  
 [91] "node006"   "node007"   "node001"   "node002"   "node003"   "node004"  
 [97] "node005"   "node006"   "node007"   "node001"   "node002"   "node003"  
[103] "node004"   "node005"   "node006"   "node007"   "node001"   "node002"  
[109] "node003"   "node004"   "node005"   "node006"   "node007"   "node001"  
[115] "node002"   "node003"   "node004"   "node005"   "node006"   "node007"  
> build.satisfaction.range.table(500000, FALSE, workers.list )
[1] "Creating Cluster"
[1] "Cluster created."
socket cluster with 120 nodes on hosts ‘localhost’, ‘node001’, ‘node002’, ‘node003’, ‘node004’, ‘node005’, ‘node006’, ‘node007’
Parallel threshold set to: 11000 
Starting at: 2 running to: 5e+05 :: Sat Apr 14 22:21:05 2012 

Если вы дочитали до сюда, то вам может быть интересно узнать, что я протестировал каждую настройку кластера, которую мог (включая openMPI), и обнаружил, что разницы в скорости нет, возможно, это потому, что мои расчеты были связаны с ЦП, возможно, нет .

Кроме того, не сдавайтесь, даже если начать работу с высокопроизводительными вычислениями может быть непросто. Это может стоить того. Я бы все еще ждал, чтобы завершить первые 100 000 итераций вычислений, которые я выполнял, если бы я застрял с наивной реализацией в base-R на обычной рабочей станции (ну, не совсем так, потому что я бы никогда не застрял с R :D). В случае с кластером менее чем за неделю было выполнено 384 000 итераций. Полностью стоит потраченного времени (а его ушло много) на настройку.

person Thell    schedule 27.11.2012
comment
Спасибо за информацию и за то, что поделились своим опытом... Я взглянул на startCluster, но не сразу понял, как использовать с ним R, и, во-вторых, я хотел использовать свои собственные частные AMI, а не общедоступные. Должен ли я предположить, что вы отказались от использования существующих пакетов R для удовлетворения ваших потребностей в параллельной обработке и вместо этого просто использовали StarCluster? Также я пытался использовать segue... но, похоже, уходят годы на настройку среды EMR и уходят годы на запуск персонализированных пакетов и функций. - person h.l.m; 28.11.2012
comment
Должен ли я предположить, что вы отказались от использования существующих пакетов R для удовлетворения ваших потребностей в параллельной обработке — абсолютно нет! Единственная роль, которую сыграл StarCluster, заключалась в настройке кластера. Было гораздо проще сгенерировать мои частные AMI на основе AMI StarCluster со всем, что мне было нужно, а затем позволить этим выполнить монтирование, настройку ключей, сценарии запуска, проверку пакетов и т. д.... все остальное было готово. R. Общее монтирование было местом, где был размещен мой частный пакет и где происходил мониторинг вывода rda. - person Thell; 28.11.2012