2012-11-22 15 views
14

Ich habe Probleme beim Initialisieren einer Verbindung zu einer AWS EC2-Instanz von R, da ich den Fehler immer wieder erhalte: Permission denied (publickey) Ich verwende derzeit ein Mac OS X 10.6.8 als mein BetriebssystemR Verbindung zur EC2-Instanz für parallele Verarbeitung

der Code, den ich versuche, in dem Terminal ($) und dann R (>) wird wie folgt auszuführen:

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

aber seltsam, wenn ich in die Instanz ssh versuchen, wie kein Passwort benötigen Ich hatte den öffentlichen Schlüssel bereits bei der Initialisierung in die Instanz importiert (denke ich)

so von meinem normalen Terminal ... wenn

$ ssh [email protected] 

läuft es automatisch verbindet ... (so im nicht 100% sicher, ob es ein passwordless Thema wie in Using snow (and snowfall) with AWS for parallel processing in R)

ich versucht habe, durch eine Suche angemessene Menge des Materials auf Schlüsseln usw., aber nichts davon scheint einen großen Unterschied zu machen. Auch mein ~/.ssh/authorized_keys ist ein Ordner, anstatt eine Datei aus irgendeinem Grund, und ich kann es nicht einmal zugreifen, wenn sudo cd .ssh/authorized_keys ... in Bezug auf die Berechtigungen versucht, es hat drw-------

Das Endziel ist eine Menge von EC2-Instanzen zu verbinden und benutze foreach, um eine Parallelverarbeitung durchzuführen ... aber die Verbindung zu einem wäre jetzt nett ... auch würde ich gerne mein eigenes Ami benutzen, also ist der Starcluster nicht wirklich das, wonach ich suche .... (es sei denn, ich kann private amis verwenden und alle Befehle privat ausführen ...)

auch wenn doRedis ist besser als wenn mir jemand zeigen könnte, wie man von einem lokalen Rechner eine Verbindung zur ec2-Instanz herstellen würde, die auch gut wäre. ..

EDIT

Ich habe es geschaffen mit dem SSH-Passwort anmelden mit dem parallel Paket makePSOCKcluster wie in R and makePSOCKcluter EC2 socketConnection gezeigt zu beschäftigen ... aber jetzt über socketConnection Fragen kommen wie in der Frage in der Verbindung gezeigt ..

Irgendwelche Ideen, wie man sich damit verbindet?

auch Beweis dafür, dass alles funktioniert, ich denke, würde bedeuten, dass die folgende Befehl/Funktion in allen unterschiedlichen IP-Adressen zu bekommen funktionieren würde

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

wo cl1 die Ausgabe der make*cluster Funktion ist

HINWEIS da die Kopfgeld ist wirklich für die Frage in den Link .... Ich habe keine Bedenken, auf welche Frage Sie eine Antwort auf ... aber so lange wie etwas zu dieser Frage geschrieben ist, die es verbindet die richtige Antwort auf die verknüpfte Frage, dann wi Ich werde die Punkte entsprechend vergeben ...

+0

Sound wie Sie nicht geben Sie Ihre Maschinen SSH-Berechtigungen. Sehen Sie sich http://www.youtube.com/watch?v=YfCgK1bmCjw (00:06:43) an. – JohnRos

Antwort

8

Ich hatte auch einige Probleme mit der parallelen EC2-Konfiguration, wenn ich versuche, den Master-Knoten lokal zu halten. Die Verwendung von StarCluster zur Einrichtung des Pools half sehr, aber die wirkliche Verbesserung kam mit der Verwendung von StarCluster und mit dem Master-Knoten innerhalb des privaten IP-Pools von EC2.

StarCluster richtet die gesamte Schlüsselhandhabung für alle Knoten sowie alle verwendeten Mounts ein. Die dynamische Knotenzuordnung war nicht möglich. Wenn Spot-Instanzen jedoch nicht langfristig verwendet werden und Ihre Gebotsstrategie Ihre Instanzen nicht "behält", sollte die dynamische Zuordnung ein Problem darstellen.

Einige andere Lektionen gelernt:

  • Erstellen Sie eine Variable, die privaten IP-Adressen enthält, zu createCluster passieren und exportieren, so dass, wenn Sie brauchen, haben mit den gleichen Knoten neu zu starten, ist es einfacher.
  • Lassen Sie den Master-Knoten byobu laufen und richten Sie ihn für die R-Sitzungsprotokollierung ein.
  • Das Ausführen von RStudio-Server auf dem Master kann manchmal sehr hilfreich sein, sollte aber ein anderes AMI als die Slave-Knoten sein. :)
  • Lassen Sie das Kontrollskript Daten-RDA-Dateien in einen Pfad verschieben, der remote auf neue Dateien überwacht und automatisch heruntergeladen wird.
  • Verwenden Sie htop, um die Slaves zu überwachen, damit Sie die Instanzen leicht sehen und Skriptanforderungen (Speicher/CPU/Skalierbarkeit) ermitteln können.
  • Verwenden Sie Prozessor-Hyper-Threading aktivieren/deaktivieren Sie Skripts.
  • Ich hatte ein ziemlich großes Problem mit den Slave-Verbindungen und serialisieren/unserialisieren und festgestellt, dass eines der Dinge war die Verbindungsgrenze, und dass die Verbindungsgrenze um die Anzahl der Knoten reduziert werden musste; und wenn das Kontrollskript gestoppt wurde, war die einfachste Reinigungsmethode das Neustarten der Master-R-Sitzung und das Verwenden eines Skripts, um die Slave-Prozesse zu beenden, anstatt auf Timeout zu warten.

    Es hat ein bisschen Arbeit zu Setup nehmen, aber hoffentlich diese Gedanken Hilfe ...


    Obwohl es vor 8 Monaten und beide Starcluster und R haben Setup einige davon, wie es war hier geändert. .. Sie finden 90% davon in den StarCluster-Dokumenten.

  • Einrichtung .starcluster/config AWS und Schlüsselpaar-Abschnitte basierend auf den Sicherheitsinformationen der AWS-Konsole.
  • definieren den [smallcluster]
    • Schlüsselnamen
    • Verfügbarkeits-Zone
  • eine Cluster Vorlage definiert verlauf [smallcluster]. Verwenden von AMIs basierend auf dem StarCluster 64bit HVM AMI. Anstatt neue öffentliche AMI-Instanzen zu erstellen, habe ich gerade eine konfigurierte Instanz (mit allen benötigten Tools) gespeichert und diese als AMI verwendet.

Hier ist ein Beispiel für eine ...

[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 
  • -Setup das Volumen geteilt, das ist, wo der Bildschirm/byoubu Protokolle, die Haupt .R Skript Checkpoint Ausgabe, gemeinsame R-Daten, und die Quelle für das Produktionspaket live. Es wurde auf neue Dateien in einem untergeordneten Pfad mit dem Namen export überwacht. Wenn also das Cluster- oder Kontrollskript starb/abbrach, würde eine maximale Anzahl von Datensätzen verloren gehen und neu berechnet werden müssen.

Nach dem gemeinsamen Volumen zu schaffen, war die Definition einfach:

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

Die Paket-Installer, die auf allen Knoten die neuesten (und gleich) R-Versionen gewährleistet.

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

Schließlich Zugriffsberechtigungen für ssh und RStudio-Server. Https über Proxy wäre sicherer, aber da RStudio wurde nur für das Steuerskript-Setup verwendet ...

[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 

Dann einen Cluster beim Start der Starcluster-Schnittstelle. Es behandelt alle Zugriffskontrollen, Systemnamen, Aktien, etc ... Sobald der Cluster lief ich eine SSH-Sitzung in jedem von meinem lokalen System lief, und lief ein Skript Hyper-Threading zu stoppen:

#!/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 

startete dann jeweils eine HTOP-Sitzung zur Überwachung der Skalierbarkeit gegenüber den exportierten Prüfpunktprotokollen.

Dann in den Master eingeloggt, startete eine Bildschirmsitzung (ich habe seit byobu bevorzugt) und feuerte R von innerhalb der StarCluster eingehängten Datenträger. Auf diese Weise, wenn der Cluster aus irgendeinem Grund angehalten konnte ich leicht Setup erneut nur durch R. beginnend Einmal in R das erste, was eine workers.list Variable mit den nodeXXX Namen zu schaffen war, die einfach etwas entlang der Linien von war:

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

Dann habe ich das Kontrollskript geladen, beendet und den Arbeitsbereich gespeichert. Das Steuerskript hat die gesamte Tabellenausgabe für Export- und Prüfpunkte und parallele Aufrufe an das Produktionspaket verarbeitet. Die Hauptfunktion des Skripts nahm auch ein cpus Argument, wo die Worker-Liste platziert wurde, die dann als cores an den Cluster-Initialisierer übergeben wurde.

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) 
} 

Sobald die R-Sitzung (nach zunächst die Erstellung der worker.list) das Steuerskript wurde neu gestartet wurde bezogen, und die Haupt func aufgerufen. Das war's. Wenn der Cluster jemals gestoppt wurde, habe ich einfach die Sitzung auf dem Haupthost beendet. Stoppen Sie die Slave-Prozesse über Htop auf jedem der Slaves und starten Sie erneut.

Hier ist ein Beispiel davon in Aktion ::

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 

Wenn Sie hier unten gelesen haben, dann können Sie daran interessiert zu wissen, dass ich jeden Cluster-Setup getestet I (einschließlich openmpi) könnte und festgestellt, dass es keine Geschwindigkeitsdifferenz gab, vielleicht ist das, weil meine Berechnungen wo CPU gebunden sind, vielleicht nicht.

Geben Sie auch nicht auf, obwohl es ein Problem sein kann, mit HPC loszulegen. Es kann sich total lohnen. Ich würde immer noch auf die ersten 100.000 Iterationen der Berechnungen warten, die ich ausgeführt habe, wenn ich mit einer naiven Implementierung in Base-R auf einer Commodity-Workstation stecken geblieben wäre (naja, nicht wirklich, da ich nie bei R: D geblieben wäre). Mit dem Cluster wurden 384.000 Iterationen in weniger als einer Woche abgeschlossen. Die Zeit hat sich total gelohnt (und es hat eine Menge davon gebraucht).

+0

Danke für die Information und das Teilen Ihrer Erfahrungen ...Ich habe mir startCluster angesehen, aber es war nicht sofort klar, wie man R damit benutzt, und zweitens wollte ich meine eigenen privaten AMIs verwenden, anstatt die öffentlichen zu verwenden. Soll ich davon ausgehen, dass Sie die bestehenden R-Pakete nicht mehr für die parallele Verarbeitung verwenden und stattdessen nur StarCluster verwenden? Ich habe auch versucht, 'segue' zu ​​verwenden ... aber es scheint ewig zu dauern, eine EMR-Umgebung einzurichten und es dauert Ewigkeiten, um personalisierte Pakete und Funktionen laufen zu lassen. –

+1

"Sollte ich annehmen, dass Sie die bestehenden R-Pakete nicht mehr benötigen, um Ihre Anforderungen für die parallele Verarbeitung zu erfüllen" - absolut nicht! Der einzige Teil, den StarCluster spielte, war das Einrichten des Clusters. Es war viel einfacher, meine privaten AMIs basierend auf den StarCluster-AMIs mit allem, was ich brauchte, zu erzeugen und dann _it_ das Mounten, Key-Setup, Start-Scripting, Paket-Checking, etc ... zu übernehmen. Alles andere war stock R. Das freigegebene Mount war wo Mein privates Paket wurde platziert und wo das Output-RDA-Monitoring stattfand. – Thell

+0

Jede Chance, Sie können mir ein Beispiel zeigen, wie das gemacht wurde? –

Verwandte Themen