|
|
@ -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 <container_id> 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/*** . |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|