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 ubuntu@ec2-xx-xxx-xx-xx.zone.compute.amazonaws.com
он автоматически соединяется...(поэтому я не уверен на 100%, если это проблема с паролем, как в Использование снега (и снегопада) с AWS для параллельной обработки в R)
Я попытался просмотреть достаточное количество материала о ключах и т. Д., Но, похоже, ничего из этого не имеет большого значения. Также мой ~/.ssh/authorized_keys
это папка, а не файл по какой-то причине, и я не могу получить к ней доступ даже при попытке sudo cd .ssh/authorized_keys
... с точки зрения разрешений он имеет drw-------
Конечная цель - подключиться ко многим экземплярам ec2 и использовать foreach
выполнить некоторую параллельную обработку... но было бы неплохо подключиться к ней на данный момент... также я хотел бы использовать свой собственный ami, так что звездный кластер не совсем то, что я ищу....(если я не возможность использовать приватный amis и запускать все команды приватно...)
также, если 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
функция
ПРИМЕЧАНИЕ, поскольку щедрость действительно предназначена для вопроса в ссылке.... Я не возражаю против того, на какой вопрос вы отправляете ответ... но до тех пор, пока что-то написано по этому вопросу, который связывает его с правильным ответом на связанный вопрос, тогда я буду присваивать очки соответственно...
1 ответ
У меня было довольно много проблем с параллельной настройкой EC2, когда я пытался сохранить главный узел локальным. Использование StarCluster для настройки пула очень помогло, но реальное улучшение пришло с использованием StarCluster и наличием главного узла в частном ip-пуле EC2.
StarCluster устанавливает всю обработку ключей для всех узлов, а также для любых используемых монтирований. Динамическое распределение узлов не выполнимо, но если спотовые экземпляры не будут использоваться в долгосрочной перспективе и ваша стратегия назначения ставок не "удерживает" ваши экземпляры, динамическое распределение должно стать проблемой.
Некоторые другие извлеченные уроки:
- Создайте переменную, содержащую частные IP-адреса для передачи в createCluster, и экспортируйте ее, поэтому при необходимости перезапустить с теми же узлами это будет проще.
- Сделайте так, чтобы главный узел запустил byobu и настроил его на ведение журнала сеанса R.
- Время от времени запуск сервера RStudio на главном сервере может быть очень полезным, но он должен отличаться от AMI подчиненного узла.:)
- Сценарий управления должен выгружать файлы данных rda по пути, который удаленно отслеживается для новых файлов, и автоматически загружать их.
- Используйте htop для мониторинга ведомых устройств, чтобы вы могли легко видеть экземпляры и определять требования сценариев (память / процессор / масштабируемость).
- Использовать процессорные сценарии гиперпоточности включения / выключения.
У меня возникла небольшая проблема с подчиненными соединениями и сериализацией / десериализацией, и я обнаружил, что одной из вещей было ограничение на количество подключений, и что ограничение на количество соединений необходимо было уменьшить на количество узлов; и когда управляющий сценарий был остановлен, самым простым способом очистки был перезапуск сеанса master R и использование сценария для уничтожения подчиненных процессов вместо ожидания времени ожидания.
Для настройки потребовалось немного работы, но, надеюсь, эти мысли помогут...
Хотя это было 8 месяцев назад, и StarCluster и R изменились, вот некоторые из его настроек... Вы найдете 90% этого в документации по StarCluster.
- Настройте.starcluster/config разделы AWS и пары ключей на основе информации о безопасности с консоли AWS.
- Определите [маленький кластер]
- ключ-имя
- Наличие зоны
- Определите шаблон кластера, расширяющий [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/byoubu, вывод контрольной точки основного сценария.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), был получен управляющий скрипт и вызвана основная функция. Это было это. С этой настройкой, если кластер когда-нибудь остановится, я просто выйду из очереди на главном хосте; остановите подчиненные процессы через 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), и обнаружил, что не было разницы в скорости, возможно, потому что мои вычисления были настолько привязаны к процессору, возможно, нет,
Кроме того, не сдавайтесь, даже если начать работу с HPC может быть больно. Это может стоить того. Я бы все еще ждал, чтобы завершить первые 100000 итераций вычислений, которые я выполнял, если бы я застрял с наивной реализацией в base-R на рабочей станции (ну, не совсем так, как я бы никогда не остановился на R:D). С кластером, 384 000 итераций выполнено за неделю. Полностью стоит время (и это заняло много), чтобы настроить.