@ -533,6 +533,13 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
< div class = "sect2" >
< h3 id = "_hadoop_yarn" > Hadoop YARN< / h3 >
< div class = "paragraph" >
< p > Το βασικό υπόστωμα είναι το HDFS, είναι ο πρώτος δαίμονας που δημιουργεί τα NameNodes για τα
replications και τα φυλάγματα αρχείων HDFS.< / p >
< / div >
< div class = "paragraph" >
< p > Το YARN είναι ένας ενδιάμεσος δαίμονας για την σύνδεση των MapReduce με το HDFS.< / p >
< / div >
< div class = "paragraph" >
< p > Έπειτα ο YARN αναλαμβάνει την διαμοίραση ενός τμήματος του
κώδικα ο οποίος είναι χρήσιμος για κάθε μηχανή, όπου τους δίνει τη δυνατότητα εφαρμογής ενός
συνόλου εντολών για την παράλληλη επεξεργασία των δεδομένων αντίστοιχα σε κάθε μηχανή. Αυτό δίνει
@ -540,7 +547,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
να είναι στο τοπικό της σύστημα.< / p >
< / div >
< div class = "paragraph" >
< p > Ο YARN ακόμα αναλαμβάνει την έναρξη της διεργασίας που αφορά την εφαρμογή σε επίπεδο κόμβου.< / p >
< p > Ο YARN ακόμα αναλαμβάνει την έναρξη της διεργασίας που αφορά την εφαρμογή σε επίπεδο κόμβου (MapReduce) .< / p >
< / div >
< / div >
< div class = "sect2" >
@ -676,7 +683,7 @@ bde2020/hadoop-submit master e9f7299c31a5 9
< / div >
< / div >
< div class = "sect3" >
< h4 id = "_docker_compose_services" > Docker Compose Services< / h4 >
< h4 id = "_docker_compose_services_αναφορά " > Docker Compose Services (Αναφορά) < / h4 >
< div class = "paragraph" >
< p > Έπειτα μέσω ενός YAML αρχείου θα κάνουμε expose τις απαραίτητες υπηρεσίες σε κάθε κόμβο της τοπολογίας
του ενός leader και των τεσσάρων slaves. Η τοπολογία που χρησιμοποιήσαμε στο cluster που διαθέτουμε είναι
@ -733,6 +740,285 @@ cluster μας. Το NodeName αποτελεί κομβική υπηρεσία
< / ul >
< / div >
< / div >
< div class = "sect3" >
< h4 id = "_configuration_of_docker_compose_υπηρεσιών" > Configuration of Docker Compose (Υπηρεσιών)< / h4 >
< div class = "paragraph" >
< p > Έπειτα, θα πρέπει να κατασκευάσουμε ένα configuration YARN αρχείο το οποία θα αναλάβει την εκκίνηση
των υπηρεσιών σε όλους τους κόμβους κατά μήκος του Cluster. Το configuration αρχείο αναλαμβάνει
ακόμα και τη διαδικασία EXPOSE έτσι ώστε δίνεται η δυνατότητα πρόσβασης σε αυτές από το Internet.< / p >
< / div >
< div class = "paragraph" >
< p > To YARN αρχείο παρουσιάζετια παρακάτω.< / p >
< / div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" > < code class = "language-YARN" data-lang = "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:< / code > < / pre >
< / div >
< / div >
< / div >
< div class = "sect3" >
< h4 id = "_docker_compose_εκκίνηση_υπηρεσιών" > Docker Compose (Εκκίνηση Υπηρεσιών)< / h4 >
< div class = "paragraph" >
< p > Για την δημιουργία του δικτύου και το deploy των υπηρεσιών όπως ορίζει το Compose αρχείο τρέξαμε την εξής εντολή:< / p >
< / div >
< div class = "listingblock" >
< div class = "content" >
< pre > docker stack deploy -c docker-compose.yml ondemand_hadoop3< / pre >
< / div >
< / div >
< div class = "paragraph" >
< p > Εξερέυνηση υπηρεσιών:< / p >
< / div >
< div class = "paragraph" >
< p > < strong > Στον leader< / strong > < / p >
< / div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" > < code class = "language-txt" data-lang = "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< / code > < / pre >
< / div >
< / div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" > < code class = "language-txt" data-lang = "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< / code > < / pre >
< / div >
< / div >
< div class = "paragraph" >
< p > < strong > Σε έναν Slave< / strong > < / p >
< / div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" > < code class = "language-txt" data-lang = "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< / code > < / pre >
< / div >
< / div >
< / div >
< div class = "sect3" >
< h4 id = "_ορισμός_τοπολογίας_στο_hadoop" > Ορισμός Τοπολογίας στο Hadoop< / h4 >
< div class = "paragraph" >
< p > Όσων αφορά την εγκατάσταση του Hadoop στο swarm, η κατανομή των κόμβων έχει γίνει ως εξής:< / p >
< / div >
< div class = "ulist" >
< ul >
< li >
< p > Ο leader και οι nodes (slaves) είναι υπεύθυνοι για την εκτέλεση των υπολογιστικών πράξεων προσφέροντας
τους υπολογιστικούς πόρους, για παράδειγμα σε μία εφαρμογή MapReduce.< / p >
< / li >
< li >
< p > Ο leader αναλαμβάνει τον συντονισμό και την ανάθεση των εργασιών σε κάθε node, αλλά και στον εαυτό του.< / p >
< / li >
< li >
< p > O leader αναλαμβάνει ακόμα την εκτέλεση της υπηρεσίας του HDFS και του YARN.< / p >
< / li >
< / ul >
< / div >
< div class = "paragraph" >
< p > Επομένως, η τοπολογίας στο Hadoop αποτελείται από 4 κόμβους εξυπηρέτησης.< / p >
< / div >
< div class = "paragraph" >
< p > Γενικές πρηροφορίες για την τοπολογία και του swarm μπορούμε να βρούμε < a href = "http://83.212.77.15:9870/dfshealth.html#tab-overview" > εδώ< / a > .< / p >
< / div >
< / div >
< / div >
< div class = "sect2" >
< h3 id = "_παράδειγμα_εκτέλεσης" > Παράδειγμα Εκτέλεσης< / h3 >
< div class = "paragraph" >
< p > Για την εκτέλεση ενός σεναρίου χρησιμοποιήσαμε την εργασία της θεωρίας που βασιζόταν σε μία εφαρμογή
MapReduce. Ο πηγαίος κώδικας που χρησιμοποιήσαμε βρίσκεται στο repo που επισυνάπτεται < a href = "https://github.com/oulievancs/HadoopExercise" > εδώ< / a > .< / p >
< / div >
< div class = "paragraph" >
< p > Για την εκτέλεση του παραδείγματος αρχικά πρέπει να αποκησουμε πρόσβαση στο κεντρικό container από το
οποίο μπορούν να εκκινήσουν διεργασίες ανάθεσης MapReduce εργασιών.< / p >
< / div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" > < code class = "language-bash" data-lang = "bash" > # docker exec -it < container_id> bash
$ docker exec -it 8bb54d6631f6 bash< / code > < / pre >
< / div >
< / div >
< div class = "paragraph" >
< p > Έπειτα, εκτός του ότι πρέπει να δημιουργήσουμε ένα σύνολο αρχείων για τη είσοδο του MapReduce προγράμματος,
πρέπει να τα κάνουμε < strong > put< / strong > στον HDFS αυτά τα αρχεία. Είναι προυπόθεση η είσοδο να βρίσκεται στο κατανεμημένο
αυτό σύστημα, το οποίο είναι το μοναδικό σύστημα αρχείων στο οποίο έχουν πρόσβαση όλοι οι κόμβοι του πλέγματος.< / p >
< / div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" > < code class = "language-bash" data-lang = "bash" > # Δημιουργία φακέλου για την είσοδο.
$ hadoop fs -mkdir -p input
# Αντιγραφή των αρχείων εισόδων.
$ hadoop fs -put * input< / code > < / pre >
< / div >
< / div >
< div class = "paragraph" >
< p > Στη συνέχεια φτιάχνουμε το < strong > jar< / strong > file, που είναι ο default τρόπος που τρέχει κάτω από Java σε συνεργασία
του Hadoop ένα αρχείο Java. Ύστερα, για την εκτέλεση του < strong > jar< / strong > αρχείου που αφορά την εφαρμογή που θέλουμε να τρέξουμε,
τρέχουμε την παρακάτω εντολή:< / p >
< / div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" > < code class = "language-bash" data-lang = "bash" > $ hadoop jar ccount.jar org.myorg.fileccount input output< / code > < / pre >
< / div >
< / div >
< div class = "paragraph" >
< p > Τέλος, για να δούμε την έξοδο αρκεί να πούμε < strong > hadoop fs -cat output/< / strong > * .< / p >
< / div >
< / div >
< / div >
< / div >
@ -757,7 +1043,7 @@ cluster μας. Το NodeName αποτελεί κομβική υπηρεσία
< / div >
< div id = "footer" >
< div id = "footer-text" >
Last updated 2020-06-13 12:12 :36 +0300
Last updated 2020-06-13 14:24 :36 +0300
< / div >
< / div >
< / body >