diff --git a/README.md b/README.md index 57a5818..6522d22 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,4 @@ # hadoop-cloud-kubernetes +Παραθέτουμε παρακάτω τα Docker files που αναφέρονται στο project: +https://github.com/big-data-europe/docker-hadoop diff --git a/report.adoc b/report.adoc index 42c1bd9..be049bd 100644 --- a/report.adoc +++ b/report.adoc @@ -54,13 +54,18 @@ σε όλες τις μηχανές του πλέγματος (cluster). === Hadoop YARN +Το βασικό υπόστωμα είναι το HDFS, είναι ο πρώτος δαίμονας που δημιουργεί τα NameNodes για τα +replications και τα φυλάγματα αρχείων HDFS. + +Το YARN είναι ένας ενδιάμεσος δαίμονας για την σύνδεση των MapReduce με το HDFS. + Έπειτα ο YARN αναλαμβάνει την διαμοίραση ενός τμήματος του κώδικα ο οποίος είναι χρήσιμος για κάθε μηχανή, όπου τους δίνει τη δυνατότητα εφαρμογής ενός συνόλου εντολών για την παράλληλη επεξεργασία των δεδομένων αντίστοιχα σε κάθε μηχανή. Αυτό δίνει τη δυνατότητα στην κάθε μηχανή του πλέγματος να διαχειρίζεται το δικό της μέρος των δεδομένων σαν να είναι στο τοπικό της σύστημα. -Ο YARN ακόμα αναλαμβάνει την έναρξη της διεργασίας που αφορά την εφαρμογή σε επίπεδο κόμβου. +Ο YARN ακόμα αναλαμβάνει την έναρξη της διεργασίας που αφορά την εφαρμογή σε επίπεδο κόμβου (MapReduce). === Hadoop MapReduce Το προγραμματισμένο μοντέλο MapReduce αναλαμβάνει την συλλογή των αποτελεσμάτων κάθε κόμβου της @@ -196,8 +201,261 @@ cluster μας. Το NodeName αποτελεί κομβική υπηρεσία επιτρέπει στον τελικό χρήστη να αποκτήσει την κατάσταση κάθε εφαρμογής MapReduce η οποία έχει τερματίσει. -==== Docker Compose Υπηρεσιών -Έπειτα, θα πρέπει +==== Configuration of Docker Compose (Υπηρεσιών) +Έπειτα, θα πρέπει να κατασκευάσουμε ένα configuration YARN αρχείο το οποία θα αναλάβει την εκκίνηση +των υπηρεσιών σε όλους τους κόμβους κατά μήκος του Cluster. Το configuration αρχείο αναλαμβάνει +ακόμα και τη διαδικασία EXPOSE έτσι ώστε δίνεται η δυνατότητα πρόσβασης σε αυτές από το Internet. + +To YARN αρχείο παρουσιάζετια παρακάτω. + +[source, YARN] +---- +version: '3.4' + +services: + namenode:#εκκίνηση της υπηρεσίας nodename + image: bde2020/hadoop-namenode:2.0.0-hadoop3.2.1-java8 + ports: + #expose στην πόρτα 9870 + - 9870:9870 + networks: + - hbase + volumes: + - namenode:/hadoop/dfs/name + environment: + - CLUSTER_NAME=test + env_file: + - ./hadoop.env + deploy: + #replicas number + mode: replicated + replicas: 1 + restart_policy: + condition: on-failure + placement: + constraints: + #deploy μόνο στον leader του swarm + - node.role == manager + labels: + traefik.docker.network: hbase + + datanode: + #εκκίνηση datanode υπηρεσίας + image: bde2020/hadoop-datanode:2.0.0-hadoop3.2.1-java8 + ports: + #expose στην πόρτα 9864 + - 9864:9864 + networks: + - hbase + volumes: + - datanode:/hadoop/dfs/data + env_file: + - ./hadoop.env + environment: + SERVICE_PRECONDITION: "namenode:9870" + deploy: + #το global συμαίνει ότι η υπηρεσία γίνεται expose σε όλους τους κόμβους του swarm. + mode: global + restart_policy: + condition: on-failure + labels: + traefik.docker.network: hbase + + resourcemanager: + #εκκίνηση resource manager υπηρεσίας. + image: bde2020/hadoop-resourcemanager:2.0.0-hadoop3.2.1-java8 + ports: + #expose στην πόρτα 8088 + - 8088:8088 + networks: + - hbase + environment: + SERVICE_PRECONDITION: "namenode:9870 datanode:9864" + env_file: + - ./hadoop.env + deploy: + mode: replicated + replicas: 1 + restart_policy: + condition: on-failure + placement: + constraints: + #expose μόνο στον leader του swarm. + - node.role == manager + labels: + traefik.docker.network: hbase + healthcheck: + disable: true + + nodemanager: + #εκκίνηση node manager υπηρεσίας + image: bde2020/hadoop-nodemanager:2.0.0-hadoop3.2.1-java8 + ports: + #expose στην πόρτα 8042 + - 8042:8042 + networks: + - hbase + environment: + SERVICE_PRECONDITION: "namenode:9870 datanode:9864 resourcemanager:8088" + env_file: + - ./hadoop.env + deploy: + #λειτουργία σε global mode. + mode: global + restart_policy: + condition: on-failure + labels: + traefik.docker.network: hbase + + historyserver: + #εκκίνηση history server υπηρεσίας. + image: bde2020/hadoop-historyserver:2.0.0-hadoop3.2.1-java8 + ports: + #expose στην πόρτα 8188. + - 8188:8188 + networks: + - hbase + volumes: + - hadoop_historyserver:/hadoop/yarn/timeline + environment: + SERVICE_PRECONDITION: "namenode:9870 datanode:9864 resourcemanager:8088" + env_file: + - ./hadoop.env + deploy: + mode: replicated + replicas: 1 + placement: + constraints: + #expose μόνο στον leader του swarm. + - node.role == manager + labels: + traefik.docker.network: hbase + +volumes: + datanode: + external: false + namenode: + hadoop_historyserver: + +#ανάθεση των replicas στο δίκτυο που έχουμε φτιάξει. +networks: + hbase: +---- + + +==== Docker Compose (Εκκίνηση Υπηρεσιών) +Για την δημιουργία του δικτύου και το deploy των υπηρεσιών όπως ορίζει το Compose αρχείο τρέξαμε την εξής εντολή: + +[souce, bash] +---- + +docker stack deploy -c docker-compose.yml ondemand_hadoop3 +---- + + +Εξερέυνηση υπηρεσιών: + +*Στον leader* + +[source, txt] +---- +$ docker service ls + +ID NAME MODE REPLICAS IMAGE PORTS +is4kvptx39az ondemand_hadoop3_datanode global 4/4 bde2020/hadoop-datanode:2.0.0-hadoop3.2.1-java8 *:9864->9864/tcp + +xunz4ket7yo0 ondemand_hadoop3_historyserver replicated 1/1 bde2020/hadoop-historyserver:2.0.0-hadoop3.2.1-java8 *:8188->8188/tcp + +lrmf8eipoudg ondemand_hadoop3_namenode replicated 1/1 bde2020/hadoop-namenode:2.0.0-hadoop3.2.1-java8 *:9870->9870/tcp + +v4zdvf1w81n8 ondemand_hadoop3_nodemanager global 4/4 bde2020/hadoop-nodemanager:2.0.0-hadoop3.2.1-java8 *:8042->8042/tcp + +xeiumycqrwjo ondemand_hadoop3_resourcemanager replicated 1/1 bde2020/hadoop-resourcemanager:2.0.0-hadoop3.2.1-java8 *:8088->8088/tcp +---- + +[source, txt] +---- +$ docker ps + +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +2b429c832ac0 bde2020/hadoop-resourcemanager:2.0.0-hadoop3.2.1-java8 "/entrypoint.sh /run…" 7 hours ago Up 7 hours 8088/tcp ondemand_hadoop3_resourcemanager.1.vlfjc5ffij34zo58isbwsjfuq + +f7f074de631d bde2020/hadoop-nodemanager:2.0.0-hadoop3.2.1-java8 "/entrypoint.sh /run…" 7 hours ago Up 7 hours (healthy) 8042/tcp ondemand_hadoop3_nodemanager.gcnl3yrd9f8m3eiihdvssw02b.dwx96ccbgytwb85vm4qj1onh2 + +b6bf6acfc31f bde2020/hadoop-datanode:2.0.0-hadoop3.2.1-java8 "/entrypoint.sh /run…" 7 hours ago Up 7 hours (healthy) 9864/tcp ondemand_hadoop3_datanode.gcnl3yrd9f8m3eiihdvssw02b.sotmojxw1g1m76k2b0xy4hdv4 + +8bb54d6631f6 bde2020/hadoop-namenode:2.0.0-hadoop3.2.1-java8 "/entrypoint.sh /run…" 7 hours ago Up 7 hours (healthy) 9870/tcp ondemand_hadoop3_namenode.1.iwj401lx6s85sdmvb2qxxkjmm + +cc28f5a899f4 bde2020/hadoop-historyserver:2.0.0-hadoop3.2.1-java8 "/entrypoint.sh /run…" 7 hours ago Up 7 hours (healthy) 8188/tcp ondemand_hadoop3_historyserver.1.xc82cobwgbi0se12nx5fcdlrt + +6cdf105a7f12 bde2020/hadoop-namenode:2.0.0-hadoop3.2.1-java8 "/entrypoint.sh /run…" 7 hours ago Up 7 hours (healthy) 9870/tcp docker-hadoop_namenode_1 +---- + + +*Σε έναν Slave* + +[source, txt] +---- +$ docker ps + +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +18461d59101d bde2020/hadoop-nodemanager:2.0.0-hadoop3.2.1-java8 "/entrypoint.sh /run…" 7 hours ago Up 7 hours (healthy) 8042/tcp ondemand_hadoop3_nodemanager.hublulhmmp42s9vhdp3pquyx2.y6w1cz4a3rt0rx74qlan1aiil + +011b14fb01a2 bde2020/hadoop-datanode:2.0.0-hadoop3.2.1-java8 "/entrypoint.sh /run…" 7 hours ago Up 7 hours (healthy) 9864/tcp ondemand_hadoop3_datanode.hublulhmmp42s9vhdp3pquyx2.ix2j42f1uldwxi74su9p0ulvi +---- + + +==== Ορισμός Τοπολογίας στο Hadoop +Όσων αφορά την εγκατάσταση του Hadoop στο swarm, η κατανομή των κόμβων έχει γίνει ως εξής: + +* Ο leader και οι nodes (slaves) είναι υπεύθυνοι για την εκτέλεση των υπολογιστικών πράξεων προσφέροντας +τους υπολογιστικούς πόρους, για παράδειγμα σε μία εφαρμογή MapReduce. + +* Ο leader αναλαμβάνει τον συντονισμό και την ανάθεση των εργασιών σε κάθε node, αλλά και στον εαυτό του. + +* O leader αναλαμβάνει ακόμα την εκτέλεση της υπηρεσίας του HDFS και του YARN. + +Επομένως, η τοπολογίας στο Hadoop αποτελείται από 4 κόμβους εξυπηρέτησης. + +Γενικές πρηροφορίες για την τοπολογία και του swarm μπορούμε να βρούμε link:++http://83.212.77.15:9870/dfshealth.html#tab-overview++[εδώ] . + +=== Παράδειγμα Εκτέλεσης +Για την εκτέλεση ενός σεναρίου χρησιμοποιήσαμε την εργασία της θεωρίας που βασιζόταν σε μία εφαρμογή +MapReduce. Ο πηγαίος κώδικας που χρησιμοποιήσαμε βρίσκεται στο repo που επισυνάπτεται link:++https://github.com/oulievancs/HadoopExercise++[εδώ] . + +Για την εκτέλεση του παραδείγματος αρχικά πρέπει να αποκησουμε πρόσβαση στο κεντρικό container από το +οποίο μπορούν να εκκινήσουν διεργασίες ανάθεσης MapReduce εργασιών. + +[source, bash] +---- +# docker exec -it bash +$ docker exec -it 8bb54d6631f6 bash +---- + +Έπειτα, εκτός του ότι πρέπει να δημιουργήσουμε ένα σύνολο αρχείων για τη είσοδο του MapReduce προγράμματος, +πρέπει να τα κάνουμε *put* στον HDFS αυτά τα αρχεία. Είναι προυπόθεση η είσοδο να βρίσκεται στο κατανεμημένο +αυτό σύστημα, το οποίο είναι το μοναδικό σύστημα αρχείων στο οποίο έχουν πρόσβαση όλοι οι κόμβοι του πλέγματος. + +[source, bash] +---- +# Δημιουργία φακέλου για την είσοδο. +$ hadoop fs -mkdir -p input + +# Αντιγραφή των αρχείων εισόδων. +$ hadoop fs -put * input +---- + +Στη συνέχεια φτιάχνουμε το *jar* file, που είναι ο default τρόπος που τρέχει κάτω από Java σε συνεργασία +του Hadoop ένα αρχείο Java. Ύστερα, για την εκτέλεση του *jar* αρχείου που αφορά την εφαρμογή που θέλουμε να τρέξουμε, +τρέχουμε την παρακάτω εντολή: + +[source, bash] +---- +$ hadoop jar ccount.jar org.myorg.fileccount input output +---- + +Τέλος, για να δούμε την έξοδο αρκεί να πούμε **hadoop fs -cat output/*** . +