Meine Frau hat mich kürzlich gebeten, neue Jalousien im Badezimmer der Kinder anzubringen. Ich dachte, dass ich in fünf Minuten fertig wäre, aber zwei Stunden später musste ich immer noch ein einziges Loch bohren.
Es liegt nicht an mangelnder Erfahrung. Wir haben genau die gleiche Art von Jalousien in vier anderen Zimmern und sie wurden alle von mir montiert. Und was ist passiert?
Als ich mich dem Fenster näherte, um zu sehen, wo die Löcher gebohrt werden sollten, musste ich feststellen, dass die Jalousien etwa 4 bis 5 mm breiter waren als die Öffnung. Das bedeutete, dass ich jede Lamelle einzeln zuschneiden musste (es sind etwa 40 Lamellen).
Wenn Sie mit handwerklicher Arbeit oder mit der Entwicklung von Software vertraut sind, wissen Sie, dass alles schnell erledigt werden kann, wenn es keine kundenspezifische Arbeit zu tun gibt. Sobald Sie Änderungen an einer Bibliothek vornehmen oder Jalousien leicht modifizieren müssen, beginnen die Probleme. Und fünf Minuten sind nicht annähernd genug!
Ich habe eine Säge, um Eisen zu schneiden, aber ich hatte nichts für die Latten. Ich wandte mich an meinen Nachbarn, der sehr hilfsbereit war und mir eine gute Säge gab.
Das bedeutete jedoch, dass alle Lamellen einzeln entfernt werden mussten. Wenn Sie nicht wissen, wie Jalousien hergestellt werden, sollte Ihnen dieses Bild helfen:
Im Grunde werden alle Latten durch drei kleine Seile zusammengehalten. Die drei Seile müssen losgebunden werden. Dann können Sie die Latten herausnehmen, zuschneiden und wieder an ihren Platz setzen. Die Seile müssen dann wieder eingesetzt werden.
Das dauert eine lange Zeit. Aber ich wollte es schaffen, also bin ich mit meinem Sohn in den Garten gegangen und habe angefangen.
Während ich arbeitete, kam einer der Nachbarn zu mir und fragte mich, ob ich wüsste, warum aus der Wand eines der nahe gelegenen Häuser1 Wasser herauslief. Natürlich wusste ich es nicht, aber wir gingen hin und schauten durch die Fenster: Das Wasser tropfte vom ersten bis zum Erdgeschoss und lief offenbar auch auf die Außenwand über.
Nach 15 Minuten traf die Polizei ein2, um festzustellen, ob die Feuerwehr gerufen werden musste. Fünf Minuten später trafen die Feuerwehrleute ein. Sie drangen in das Haus ein und fanden eine Unkrautplantage vor, deren Bewässerungssystem ausgefallen war und das ganze Haus überflutet hatte.
Die ganze Nachbarschaft war auf der Straße und beobachtete das Geschehen. Die Feuerwehrleute waren so freundlich, alle meine Kinder in ihrem Wagen aufzunehmen. Dann kam die echte Polizei mit einem echten Auto, und auch sie waren so freundlich, alle meine Kinder in ihrem Auto aufzunehmen.
Während ich nur die Hälfte meiner Latten geschnitten hatte, wartete die andere Hälfte noch.
Um es kurz zu machen: Wegen dieser Ablenkung habe ich 3 Stunden gebraucht, um die Latten zuzuschneiden und wieder zusammenzusetzen.
Das Anbringen der Bilder nach der Größenänderung dauerte fünf Minuten.
Am merkwürdigsten ist jedoch, dass ich an diesem Tag bei der Arbeit die gleiche Erfahrung gemacht habe, als ich versuchte, Hadoop und LDAP zu verbinden.
Wenn Kerberos nicht verwendet wird, verlässt sich Hadoop auf einfache Sicherheit, d.h. es glaubt, dass Sie der sind, für den Sie sich ausgeben.
Um jedoch festzustellen, zu welcher Gruppe ein Benutzer gehört, führt Hadoop standardmäßig eine Abfrage auf dem NameNode durch. Wenn der Benutzer im NameNode nicht existiert, ist das Ergebnis der Suche leer. Das bedeutet, dass es keine Möglichkeit gibt, herauszufinden, zu welchen Gruppen jemand gehört.
LdapGroupsMapping eingeben
Um dieses Problem zu lösen, bietet Hadoop LdapGroupsMapping, um einen Benutzer in einem LDAP-Verzeichnis zu suchen. Ich dachte, ich probiere das mal aus. Wie schwer kann das sein?
Wenn Sie auf den vorherigen Link geklickt haben, haben Sie wahrscheinlich gedacht, dass die Dokumentation nicht ausreicht, um wirklich loszulegen. Zum Glück gibt es heutzutage Suchmaschinen, und so bin ich auf eine Seite von Hortonworks gestoßen, die "erklärt", wie man es macht.
Ich zitiere "erklären", da man nicht viel schlauer wird, wenn man es sich ansieht (es gibt auch ein paar Tippfehler). Lassen Sie uns mit dem einfachen Teil beginnen:
hadoop.security.group.mappingsollteorg.apache.hadoop.security.LdapGroupsMappingsein. Hier gibt es nichts zu ändern;hadoop.security.group.mapping.ldap.bind.usersollte der Benutzer sein, der Lesezugriff auf das LDAP hat, normalerweise der Administrator. In meinem Fall war es. Sie müssen dies jedoch für Ihre Situation konfigurieren; hadoop.security.group.mapping.ldap.bind.password: kein Kommentar hier;hadoop.security.group.mapping.ldap.urlmuss die LDAP-Adresse sein. Die Form lautetldap://address:port. Wenn Ihr LDAP über den Standardport 389 abgehört wird, können Sie diese Angabe weglassen. Wenn Ihr LDAP über SSL läuft, müssen Sie das Protokollldapsverwenden (es nimmt dann den Port 636 an) und einige zusätzliche SSL-Eigenschaften konfigurieren;hadoop.security.group.mapping.ldap.baseist ebenfalls sehr einfach. Es ist der gemeinsame Teil, den alle Benutzer in Ihrem LDAP haben. In meinem Beispiel könnte esdc=some,dc=domain,dc=comsein, so dass alle Benutzer unterdc=other,dc=domain,dc=comnicht gefunden werden.
Jetzt kommt der schwierigste Teil, nämlich:
hadoop.security.group.mapping.ldap.search.filter.user;hadoop.security.group.mapping.ldap.search.filter.group;hadoop.security.group.mapping.ldap.search.attr.member;hadoop.security.group.mapping.ldap.search.attr.group.name.
Um herauszufinden, was wir füllen sollen, benötigen wir ldapsearch, ein Tool, das in den meisten Linux-Distributionen verfügbar ist.3
Sobald es verfügbar ist, können Sie Ihr LDAP wie folgt abfragen
export PW=...
export ADMIN="cn=Administrator,cn=users,dc=some,dc=domain,dc=com"
export URL="ldap://url"
export BASE="dc=some,dc=domain,dc=com"
ldapsearch -b "$BASE" -H "$URL" -D "$ADMIN" -w $PW -x
"your query here"
filter.benutzer
Um die Eigenschaft filter.user zu ermitteln, müssen Sie die Abfrage finden, die Benutzer zurückgibt.
Sie müssen in Ihrem LDAP nachsehen, wie die Benutzer (im Gegensatz zu den Gruppen) definiert sind. In meinem Fall habe ich Amazon AD verwendet, also habe ich einfach nachgeschaut, wie das definiert ist. Ich fand heraus, dass die Verwendung von (&(objectCategory=user)(sAMAccountName=glanzani)) meinen Benutzer zurückgibt.
Wenn Sie so weit gekommen sind, dann können Sie den folgenden Wert für die Eigenschaft hadoop.security.group.mapping.ldap.search.filter.user verwenden:
(&(objectcategory=user)(samaccountname=*{0}*))
Dies weist Hadoop an, diesen Befehl auszuführen, um nach Benutzern zu suchen
ldapsearch -b "$BASE" -H "$URL" -D "$ADMIN" -w $PW -x
"(&(objectCategory=user)(sAMAccountName=*{0}*))"
wobei 0 der Name des Benutzers ist, nach dem Hadoop sucht. Die Platzhalter sind hier sehr wichtig, denn wenn wir zum Beispiel nach dem Benutzer spark suchen, werden alle Benutzer zurückgegeben, die die Zeichenfolge spark enthalten. Ich werde später noch zeigen, warum dies äußerst wichtig ist.
filter.gruppe
In ähnlicher Weise müssen Sie wissen, wie Hadoop (oder ldapsearch) Gruppen finden kann. Im Falle von Amazon ist dies (objectCategory=group)4:
ldapsearch -b "$BASE" -H "$URL" -D "$ADMIN" -w $PW -x
"(objectCategory=group)"
Was Sie zurückbekommen, ist grundlegend für die nächsten beiden Schritte. In meinem Fall war dies für jede Gruppe ein Eintrag, der wie folgt aussieht5:
# spark, Users, some.website.com
dn: CN=spark,CN=Users,DC=some,DC=website,DC=com
objectClass: top
objectClass: group
cn: spark # NOTE cn HERE [...] member: CN=glanzani,CN=Users,DC=some,DC=website,DC=com # NOTE member HERE AND ON THE NEXT LINE member: CN=spark_user,CN=Users,DC=some,DC=website,DC=com
Wir sehen, dass der Gruppenname durch cn (d.h. spark) angegeben wird und die Mitglieder in den verschiedenen member Attributen stehen.
attr.member und attr.group.name
Wenn Sie den vorherigen Schritt geschafft haben, ist der nächste super einfach
hadoop.security.group.mapping.ldap.search.attr.membersolltemembersein undhadoop.security.group.mapping.ldap.search.attr.group.namesolltecnsein.
Alles zusammenfügen
In diesem Moment können Sie alles in /etc/hadoop/conf/core-site.xml zusammenfügen (beachten Sie, dass die Eigenschaft filter.user nach & ein paar Zeichen hinzugewonnen hat: sie heißt jetzt &)
<property>
<name>hadoop.security.group.mapping</name>
<value>org.apache.hadoop.security.LdapGroupsMapping</value>
</property>
<property>
<name>hadoop.security.group.mapping.ldap.bind.user</name>
<value>cn=Administrator,cn=users,dc=some,dc=domain,dc=com</value>
</property>
<property>
<name>hadoop.security.group.mapping.ldap.bind.password</name>
<value>insert_password_here</value>
</property>
<property>
<name>hadoop.security.group.mapping.ldap.url</name>
<value>ldap://url</value>
</property>
<property>
<name>hadoop.security.group.mapping.ldap.base</name>
<value>dc=some,dc=domain,dc=com</value>
</property>
<property>
<name>hadoop.security.group.mapping.ldap.search.filter.user</name>
<value>(&(objectCategory=user)(sAMAccountName=*{0}*))</value>
</property>
<property>
<name>hadoop.security.group.mapping.ldap.search.filter.group</name>
<value>(objectCategory=group)</value>
</property>
<property>
<name>hadoop.security.group.mapping.ldap.search.attr.member</name>
<value>member</value>
</property>
<property>
<name>hadoop.security.group.mapping.ldap.search.attr.group.name</name>
<value>cn</value>
</property>
Der Neustart von HDFS sollte der letzte Schritt sein:
$ sudo service hadoop-hdfs-namenode stop
$ sudo service hadoop-hdfs-namenode start
$ hdfs groups glanzani
glanzani : spark
Was ist mit nicht-interaktiven Benutzern?
Wenn ich mehr über LDAP wüsste, könnte dieser Abschnitt wahrscheinlich viel weniger Workarounds enthalten.
Aber im Grunde meines Herzens bin ich ein Datenwissenschaftler und ich möchte die Dinge erledigen.
Wenn Sie schon einmal mit Hadoop gearbeitet haben, wissen Sie, dass es eine Reihe nicht-interaktiver Benutzer gibt, d.h. Benutzer, die sich nicht anmelden sollen, wie hdfs, spark, hadoop, usw. Es ist wichtig, diese Benutzer zu haben. Aber auch die Gruppen mit demselben Namen sind wichtig. Wenn Sie z.B. airflow verwenden und einen Auftrag spark starten, werden die Protokollordner unter dem Benutzer airflow in der Gruppe spark erstellt.
LDAP erlaubt es jedoch meines Wissens6 nicht, sich überschneidende Benutzer/Gruppen zu haben, wie es unter Unix der Fall ist.
Jjj
Ich habe das Problem gelöst, indem ich in LDAP die spark_user (oder hdfs_user oder ...) erstellt habe, um diese Einschränkung zu umgehen. Wenn Sie die oben genannten Wildcards verwenden, um einen Hadoop-Benutzer mit einem LDAP-Benutzer abzugleichen, würde der Ablauf folgendermaßen aussehen
# we ask: to which groups does the spark user (in Unix land) exists
hdfs groups spark
# hadoop creates the following ldapsearch query ldapsearch -b "$BASE" -H "$URL" -D "$ADMIN" -w $PW -x "(&(objectCategory=user)(sAMAccountName=*spark*))"
Hier findet LDAP den Benutzer spark_user, der zur Gruppe spark gehört. Es kümmert sich nicht darum, dass ich nach dem Benutzer spark_user gehört. In meinem Fall wird die spark zurückgegeben.
Großartig!
Schnelles Erstellen von Benutzern und Gruppen
Die Erstellung von Benutzern und Gruppen mit LDAP kann mühsam sein. Ein schnellerer Weg ist die Verwendung von adtool. Erstellen Sie eine ~/.adtool.cfg, mit folgendem Inhalt
## Do NOT surround values with either " or '
uri ldap://url
binddn cn=Administrator,cn=users,dc=some,dc=domain,dc=com
bindpw insert_password_here
searchbase dc=some,dc=domain,dc=com
An dieser Stelle können Sie Folgendes tun (fügen Sie weitere Benutzer hinzu, wenn Sie möchten)
export BASE="dc=some,dc=domain,dc=com"
for service in hdfs spark hadoop hive; do
adtool groupcreate $service $BASE
adtool usercreate "${service}_user" $BASE
adtool groupadduser $service "${service}_user"
done
Abschluss der Arbeiten
Das Lesen eines Blogbeitrags dauert vielleicht drei Minuten. Nachdem Sie die Parameter Ihrer AD kennen, brauchen Sie fünf Minuten, um sie zu implementieren. Aber wenn Sie das alles nicht wissen, kann es einen Tag dauern, genau wie die Montage meiner Jalousien.
Wenn Sie Vorschläge haben, wie der nicht-interaktive Teil verbessert werden kann, würde ich mich freuen, sie zu hören. Sie können mich auf Twitter finden.
- Das Haus wurde vor einem Jahr gebaut, aber der Eigentümer wohnt noch nicht dort.
- In typisch holländischer Manier kamen sie mit einem Elektroroller an.
- Nicht die Mozilla-Variante.
- Kein kaufmännisches Und hier.
- Dies ist das Beispiel für die Gruppe
spark. - Was wiederum sehr begrenzt ist und ich konnte Google nicht dazu bringen, mir viel mehr zu sagen.
Verfasst von
Giovanni Lanzani
Unsere Ideen
Weitere Blogs
Contact



