Advertisement
Guest User

Untitled

a guest
Mar 11th, 2019
820
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 35.28 KB | None | 0 0
  1. Corso di Sistemi Operativi Avanzati 2014/2015
  2. Prof. Cattaneo Giuseppe
  3. Dr. Roscigno Gianluca
  4.  
  5.  
  6.  
  7. PARTE 1 – Configurazione di un singolo nodo (pseudo-distributed) – Hadoop v2.5.1
  8.  
  9. Intro
  10. In questa guida vedremo come installare e configurare Hadoop in maniera molto semplice. Nella prima parte vedremo come creare un singolo nodo che funzionerà sia da master che da slave (appunto pseudo-distributed). Nella seconda parte invece vedremo come configurare un nodo principale (master) e una serie di nodi su cui verrà distribuito il lavoro (slave).
  11. Gli step di questa guida sono stati eseguiti su Ubuntu 14.04.01 LTS 64bit con Hadoop 2.5.1 e Java 8 u20 virtualizzato attraverso VMPlayer settato con 3100 MB di RAM.
  12. L’username è user, la password è admin. L’hostname di tale macchina è “ubuntu”.
  13. Per modificare l’hostname: sudo nano /etc/hostname.
  14. Per salvare: ctrl+O
  15. Prima di tutto occorre aggiornare il sistema:
  16. 1. $ sudo apt-get update
  17. 2. $ sudo apt-get upgrade
  18. Installazione di Java
  19. Aggiungiamo i repository per l’ultima versione di Java:
  20. 1. $ sudo add-apt-repository ppa:webupd8team/java
  21. 2. $ sudo apt-get update
  22. 3. $ sudo apt-get install oracle-java8-installer
  23. Controlliamo se l’installazione è andata a buon fine scrivendo nella console:
  24. 1. $ java -version
  25. L’output dovrebbe essere simile a quello sotto:
  26. 1. java version "1.8.0_20"
  27. 2. Java(TM) SE Runtime Environment (build 1.8.0_20-b26)
  28. 3. Java HotSpot(TM) 64-Bit Server VM (build 25.20-b23, mixed mode)
  29.  
  30. Installazione di SSH
  31. Secure Shell è un protocollo di rete che permette di stabilire una sessione remota cifrata tramite interfaccia a riga di comando con un altro host di una rete.
  32. Se SSH non è stato installato procedere con l’installazione scrivendo nella console:
  33. 1. $ sudo apt-get install ssh
  34.  
  35. Gruppo dedicato per Hadoop
  36. Bisogna creare un utente dedicato per Hadoop:
  37. 1. $ sudo addgroup hadoop
  38. 2. $ sudo adduser user hadoop
  39.  
  40. Creazione delle chiavi SSH
  41. SSH utilizza la crittografia asimmetrica (RSA). È generata una coppia di chiavi pubblica/privata. La chiave pubblica è memorizzata sul server, la chiave privata deve essere conservata dall’utente (con una password).
  42. 1. user@ubuntu:~$ ssh-keygen -t rsa -P “”
  43.  
  44. L’output sarà qualcosa come quello qui sotto:
  45. 1. Generating public/private rsa key pair.
  46. 2. Enter file in which to save the key (/home/user/.ssh/id_rsa):
  47. 3. Created directory '/home/user/.ssh'.
  48. 4. Your identification has been saved in /home/user/.ssh/id_rsa.
  49. 5. Your public key has been saved in /home/user/.ssh/id_rsa.pub.
  50. 6. The key fingerprint is:
  51. 7. 9b:9f:eb:4a:56:f7:d0:87:60:d5:e0:dd:77:a0:19:5d user@ubuntu
  52. 8. The key's randomart image is:
  53. 9. +--[ RSA 2048]----+
  54. 10. …
  55. Bisogna abilitare l’accesso a SSH inserendo correttamente la chiave appena generata tra le chiavi autorizzate:
  56. 1. user@ubuntu:~$ cat $HOME/.ssh/id_rsa.pub >> $HOME/.ssh/authorized_keys
  57.  
  58. Adesso bisogna testare se la connessione ssh funziona:
  59. 1. user@ubuntu:~$ ssh localhost
  60. 2. The authenticity of host 'localhost (::1)' can't be established.
  61. 3. RSA key fingerprint is d7:87:25:47:ae:02:00:eb:1d:75:4f:bb:44:f9:36:26.
  62. 4. Are you sure you want to continue connecting (yes/no)? yes
  63.  
  64. Se la connessione avviene senza alcun problema, allora non sarà restituito alcun errore, quindi possiamo scrivere exit nella console e continuare con l’installazione. Altrimenti, nel caso ci fossero errori, si può vedere in dettaglio cosa succede scrivendo nella console: ssh -vvv localhost.
  65.  
  66. Installazione di Hadoop 2.5.1
  67. Adesso possiamo passare all’installazione e alla configurazione di Hadoop:
  68.  
  69. 1. user@ubuntu:~$ wget http://mirror.nohup.it/apache/hadoop/common/hadoop-2.5.1/hadoop-2.5.1-src.tar.gz
  70. 2. user@ubuntu:~$ sudo tar -zxvf hadoop-2.5.1.tar.gz
  71. 3. user@ubuntu:~$ sudo mv hadoop-2.5.1 hadoop
  72. 4. user@ubuntu:~$ sudo mv hadoop /usr/local
  73. 5. user@ubuntu:~$ cd /usr/local
  74. 6. user@ubuntu:~$ sudo chown -R user:hadoop hadoop
  75.  
  76. Modifica $HOME/.bashrc
  77. Modifichiamo il file bashrc per gli utenti che vogliono utilizzare Hadoop (per esempio l’utente user), aggiungendo quello scritto in rosso di seguito. Si tratta delle variabili d’ambiente di HADOOP e JAVA_HOME.
  78. IMPORTANTE: fare attenzione al path evidenziato in rosso:
  79. 1. $cd~
  80. 2. $nano .bashrc
  81. 3. #Hadoop variables
  82. 4. export HADOOP_HOME=/usr/local/hadoop
  83. 5. export HADOOP_INSTALL=/usr/local/hadoop
  84. 6. export PATH=$PATH:$HADOOP_INSTALL/bin
  85. 7. export PATH=$PATH:$HADOOP_INSTALL/sbin
  86. 8. export HADOOP_MAPRED_HOME=$HADOOP_INSTALL
  87. 9. export HADOOP_COMMON_HOME=$HADOOP_INSTALL
  88. 10. export HADOOP_HDFS_HOME=$HADOOP_INSTALL
  89. 11. export YARN_HOME=$HADOOP_INSTALL
  90. 12. # Set JAVA_HOME (we will also configure JAVA_HOME directly for Hadoop later on)
  91. 13. export JAVA_HOME=/usr/lib/jvm/java-8-oracle
  92. 14. # Some convenient aliases and functions for running Hadoop-related commands
  93. 15. unalias fs &> /dev/null
  94. 16. alias fs="hadoop fs"
  95. 17. unalias hls &> /dev/null
  96. 18. alias hls="fs -ls"
  97. 19. # If you have LZO compression enabled in your Hadoop cluster and
  98. 20. # compress job outputs with LZOP (not covered in this tutorial):
  99. 21. # Conveniently inspect an LZOP compressed file from the command
  100. 22. # line; run via:
  101. 23. #
  102. 24. # $ lzohead /hdfs/path/to/lzop/compressed/file.lzo
  103. 25. #
  104. 26. # Requires installed 'lzop' command.
  105. 27. #
  106. 28. lzohead () {
  107. 29. hadoop fs -cat $1 | lzop -dc | head -1000 | less
  108. 30. }
  109.  
  110. Fare re-loging in Ubuntu utilizzando user e verificare la versione di hadoop:
  111. 1. hadoop version
  112.  
  113.  
  114. Se l’output indicherà che la versione è la 2.5.1, allora tutto è andato a buon fine.
  115. 1. Hadoop 2.5.1
  116. 2. Subversion https://git-wip-us.apache.org/repos/asf/hadoop.git -r
  117. 3. Compiled by jenkins on 2014-09-05T23:11Z
  118. 4. Compiled with protoc 2.5.0
  119. 5. From source with checksum 6424fcab95bfff8337780a181ad7c78
  120. 6. This command was run using /usr/local/hadoop/share/hadoop/common/hadoop-common-2.5.1.jar
  121. Andiamo a modificare i file di configurazione di Hadoop.
  122. Modifichiamo il file hadoop-env.sh:
  123. 1. user@ubuntu: ~$ cd /usr/local/hadoop
  124. 2. user@ubuntu:~$ nano etc/hadoop/hadoop-env.sh
  125.  
  126. Nel file hadoop-env.sh si deve modificare il path di Java. Quindi cercare la stringa:
  127. 1. # The java implementation to use. Required.
  128. 2. # export JAVA_HOME=${JAVA_HOME}
  129. e sostituirla con (ancora una volta, fare attenzione al path di java):
  130. 1. # The java implementation to use. Required.
  131. 2. export JAVA_HOME=/usr/lib/jvm/java-8-oracle/
  132. Aggiungere le seguenti variabili d’ambiente:
  133. 1. export HADOOP_COMMON_LIB_NATIVE_DIR=“/usr/local/hadoop/lib/native”
  134. 2. export HADOOP_OPTS =“-Djava.library.path=/usr/local/hadoop/lib/native”
  135. Salviamo il file premendo CTRL+O, premere invio per sovrascrivere il file e usciamo da nano premendo CTRL+X.
  136. Creiamo le cartelle:
  137. 1. cd ~
  138. 2. mkdir –m 755 mydata
  139. 3. mkdir –m 755 mydata/hdfs
  140. 4. mkdir –m 755 mydata/hdfs/namenode
  141. 5. mkdir –m 755 mydata/hdfs/datanode
  142. Ora non ci resta che aggiungere localhost nel file hosts.
  143. 1. user@ubuntu:~$ sudo nano /etc/hosts
  144. Aggiungere:
  145. 1. 127.0.0.1 ubuntu
  146. 2. 127.0.0.1 localhost
  147. 3. 127.0.1.1 ubuntu
  148. 4. 127.0.1.1 localhost
  149. Ctrl+O per salvare Ctrl+X per chiudere.
  150.  
  151.  
  152. Modifica dei file *.xml
  153. Il file core-site.xml [sito] gestisce anche le impostazioni del NameNode. Sempre con l’account user apriamo il file:
  154. 1. user@ubuntu:~$ cd /usr/local/hadoop/etc/hadoop
  155. 2. user@ubuntu:~$ nano core-site.xml
  156. e lo modifichiamo nel modo seguente (fare copia e incolla):
  157. 1. <property>
  158. 2. <name>fs.default.name</name>
  159. 3. <value>hdfs://localhost:9000</value>
  160. 4. <description>A base for other temporary directories.</description>
  161. 5. </property>
  162. 6.
  163. 7. <description>The name of the default file system. A URI whose
  164. 8. scheme and authority determine the FileSystem implementation. The
  165. 9. uri's scheme determines the config property (fs.SCHEME.impl) naming
  166. 10. the FileSystem implementation class. The uri's authority is used to
  167. 11. determine the host, port, etc. for a filesystem.</description>
  168. Poi modifichiamo anche yarn-site.xml [sito]
  169. 1. <property>
  170. 2. <name>yarn.nodemanager.aux-services</name>
  171. 3. <value>mapreduce_shuffle</value>
  172. 4. </property>
  173. 5. <property>
  174. 6. <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
  175. 7. <value>org.apache.hadoop.mpred.ShuffleHandler</value>
  176. 8. </property>
  177. 9. <property>
  178. 10. <name>yarn.resourcemanager.address</name>
  179. 11. <value>localhost:8032</value>
  180. 12. </property>
  181. 13. <property>
  182. 14. <name>yarn.resourcemanager.scheduler.address</name>
  183. 15. <value>localhost:8030</value>
  184. 16. </property>
  185. 17. <property>
  186. 18. <name>yarn.resourcemanager.resource-tracker.address</name>
  187. 19. <value>localhost:8031</value>
  188. 20. </property>
  189. 21. <property>
  190. 22. <name>yarn.resourcemanager.admin.address</name>
  191. 23. <value>localhost:8033</value>
  192. 24. </property>
  193. 25. <property>
  194. 26. <name>yarn.resourcemanager.webapp.address</name>
  195. 27. <value>localhost:8088</value>
  196. 28. </property>
  197. 29. <property>
  198. 30. <name>mapreduce.jobhistory.webapp.address</name>
  199. 31. <value>localhost:19888</value>
  200. 32. </property>
  201. 33. <property>
  202. 34. <name> mapreduce.jobhistory.address</name>
  203. 35. <value>localhost:10020</value>
  204. 36. </property>
  205.  
  206. Spostiamo il file mapred-site.xml.template in mapred-site.xml [sito] e modifichiamolo:
  207. 1. cp mapred-site.xml.template mapred-site.xml
  208. 2. nano mapred-site.xml
  209. 3. <configuration>
  210. 4. <property>
  211. 5. <name>mapreduce.framework.name</name>
  212. 6. <value>yarn</value>
  213. 7. </property>
  214.  
  215. File hdfs-site.xml [sito]:
  216. 1. <property>
  217. 2. <name>dfs.replication</name>
  218. 3. <value>1</value>
  219. 4. </property>
  220. 5. <property>
  221. 6. <name>dfs.namenode.name.dir</name>
  222. 7. <value>file:/home/user/mydata/hdfs/namenode</value>
  223. 8. </property>
  224. 9. <property>
  225. 10. <name>dfs.datanode.data.dir</name>
  226. 11. <value>file:/home/user/mydata/hdfs/datanode</value>
  227. 12. </property>
  228.  
  229. Start Hadoop 2.5.1
  230. Prima di avviare Hadoop bisogna cancellare le cartelle namenode e datanode e formattare eventualmente il file system:
  231.  
  232. Formattiamo l’HDFS:
  233. 1. user@ubuntu: formattahdfs.sh
  234. L’output della formattazione dovrebbe essere una cosa simile:
  235. 1. user@ubuntu:/usr/local/hadoop$ hdfs namenode -format
  236. 2. 14/10/10 18:59:57 INFO common.Storage: Storage directory /home/user/mydata/hdfs/namenode has been successfully formatted.
  237. 3. 14/10/10 18:59:57 INFO namenode.NameNode: SHUTDOWN_MSG:
  238. 4. user@ubuntu:/usr/local/hadoop$
  239.  
  240. Se tutto va bene (come vediamo sopra been successfully formatted), dobbiamo avviare i seguenti servizi: Yarn, dfs, historyserver.
  241. 1. start-yarn.sh
  242. 2. start-dfs.sh
  243. 3. mr-jobhistory-daemon.sh start historyserver
  244. Per vedere se tutti i servizi sono partiti scriviamo:
  245. 1. user@ubuntu:~$ jps
  246. Se tutto sarà andato bene vedremo i seguenti servizi attivi:
  247. 1. 2287 ResourceManager
  248. 2. 1938 NodeManager
  249. 3. 2456 JobHistoryServer
  250. 4. 2085 SecondaryNameNode
  251. 5. 2349 Jps
  252. 6. 1788 NameNode
  253. 7. 2340 DataNode
  254. Nel caso in cui uno dei servizi non sia stato avviato, allora bisogna indagare e vedere nei file di log (*.log) presenti nella directory logs di hadoop.
  255.  
  256.  
  257.  
  258. Ovviamente per terminare i servizi e chiudere Hadoop basta lanciare:
  259. 1. stop-yarn.sh;
  260. 2. stop-dfs.sh;
  261. 3. mr-jobhistory-daemon.sh stop historyserver;
  262.  
  263. Proviamo il Map-Reduce
  264. Per provare il corretto funzionamento della nostra installazione, eseguiamo WordCount incluso come esempio in Hadoop. Scarichiamo prima i file di testo in formato testuale e salvarlo sulla Scrivania in una cartella INPUT:
  265. 1. http://www.gutenberg.org/cache/epub/47120/pg47120.txt
  266.  
  267. Avviamo la nostra infrastruttura, dopo ciò copiamo il file nel HDFS:
  268. 1. $ hdfs dfs -copyFromLocal /home/user/Scrivania/INPUT INPUT
  269.  
  270.  
  271. ed eseguiamo WordCount:
  272. 1. $ hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.1.jar wordcount INPUT OUTPUT
  273.  
  274.  
  275. Ad esecuzione terminata, possiamo copiare il file di output sul filesystem locale:
  276. 1. $ hdfs dfs -getmerge /user/user/OUTPUT OUTPUT
  277. Oppure andando accedendo al pannello web nella sezione Browse the filesystem.
  278.  
  279. Script
  280. • startAll.sh – avvio dei servizi: yarn, dfs, jobhistory (se sono già avviati li interrompe)
  281. • stopAll.sh – terminazione dei servizi: yarn, dfs, jobhistory
  282. • formattahdfs.sh – ripristino, formattazione HDFS e avvio di Hadoop
  283. • HadoopVersion.sh – mostra la versione corrente di Hadoop
  284. • formattaAndStart.sh – formatta l’HDFS e avvia i servizi
  285. • stopJob.sh: ferma uno specifico job
  286. • executeWordCount.sh – esecuzione di WordCount
  287.  
  288.  
  289. VM for Pseudo Distributed Hadoop 2.5.1
  290. Tale VM può essere scaricata dai seguenti URL:
  291. http://goo.gl/bOktc8
  292.  
  293. WordCount Source Code
  294. Eclipse workspace: download
  295.  
  296.  
  297.  
  298.  
  299.  
  300.  
  301.  
  302.  
  303.  
  304.  
  305.  
  306.  
  307.  
  308.  
  309.  
  310.  
  311.  
  312.  
  313.  
  314.  
  315.  
  316.  
  317.  
  318.  
  319.  
  320.  
  321. PARTE 2 – Configurazione di un cluster (distributed) – Hadoop v2.5.1
  322.  
  323. Intro
  324. Con la seconda parte di questa guida, vedremo come configurare un cluster di nodi Hadoop e in seguito come mandare in esecuzione un job.
  325. IMPORTANTE: prima di continuare con questa guida, bisogna aver seguito i passaggi della prima parte.
  326. In questa guida sarà creato un cluster con due nodi; creeremo quindi un master e uno slave come esempio. Prendiamo quindi il nodo creato in precedenza (pseudo-distribuded) e configuriamolo passo-passo per creare un cluster.
  327.  
  328. Configurazione della rete
  329. Supponiamo di lavorare in una rete con IP 192.168.5.61/252. Possiamo assegnare un nome che identifica il nodo all’interno del cluster. Andiamo a modificare quindi il file hosts:
  330. 1. $ sudo nano /etc/hosts
  331. e modifichiamo il file nel modo seguente:
  332. 1. $ 192.168.5.61 master
  333. 2. $ 192.168.5.62 slave
  334. Nel file hosts andremo ad inserire tutti i nodi che faranno parte del cluster. Adesso andiamo a modificare l’hostname (che nella prima parte si chiamava ubuntu) in master e slave così da non creare confusione.
  335. IMPORTANTE: le modifiche fatte nel file hosts devono essere IDENTICHE sia sul master che negli slaves altrimenti potrebbero verificarsi delle anomalie durante l’esecuzione dei job.
  336. Quindi apriamo il file:
  337. 1. $ sudo nano /etc/hostname
  338. e cambiamo l’hostname in master. La stessa cosa deve essere fatta quando creeremo il nodo slave.
  339.  
  340. Configurazione del Master
  341. Sul master, modifichiamo prima il file masters:
  342. 1. $ cd /usr/local/hadoop/etc/hadoop
  343. 2. $ nano masters
  344.  
  345. scrivendo master. In questo file devono essere inseriti i nomi dei nodi slave che fanno parte del cluster. In un cluster reale vanno inseriti gli hostname di tutti gli slave (senza quello del master).
  346. ATTENZIONE: il nome del nodo deve essere lo stesso che è inserito nel file hosts altrimenti Hadoop non riuscirà a contattare il nodo.
  347. 1. $ nano slaves
  348. scrivendo al suo interno:
  349. 1. slave1
  350. 2. slave2
  351. 3. slave3
  352. 4. .
  353. 5. .
  354. 6. .
  355. 7. slaveN
  356. NB: quando si userà lo script personalizzato hadoop-start.sh o hadoop-stop.sh verrà generato automaticamente il file slaves (si veda la fine della guida).
  357. RACK AWERNESS
  358. Di solito i grandi cluster di Hadoop sono organizzati in rack, ed il traffico dati tra nodi differenti nello stesso rack è meglio rispetto a quello tra i rack.
  359. Per usare i rack abbiamo bisogno di un file sh ESEGUIBILE, che ci dice a quale rack appartiene il nodo su cui viene eseguito: rack-topology.sh che a sua volta, legge in un altro file la struttura dei rack: rack_topology.data che è formato in questo modo.
  360.  
  361. Rack_topology.data
  362. 1. Format <host ip> <rack_location>
  363. 2. 192.168.2.10 01
  364. 3. 192.168.2.11 02
  365. 4. 192.168.2.12 03
  366. Questi file devono essere in /usr/local/hadoop/etc/hadoop/ sia del master che degli slave
  367. Questi file devono essere usati da Hadoop, e per far ciò bisogna modificare il file core-site.xml (sia nel master che negli slave) ed aggiungere queste proprietà
  368. 1. <property>
  369. 2. <name>net.topology.script.file.name</name>
  370. 3. <value>/etc/hadoop/rack-topology.sh</value>
  371. 4. </property>
  372.  
  373. Fatto ciò si può avviare l’infrastruttura di hadoop. Per vedere se tutto è andato per il verso giusto si può consultare il ResourceManager dal browser: cliccate sui nodi attivi e vedere la colonna Rack se ci da i valori corretti, o anche usare: hadoop dfsadmin –report, per maggiori informazioni consultare questa guida.
  374.  
  375. Configurazione globale
  376. Adesso sia sul master sia sui nodi slave, modifichiamo allo stesso modo i file *-site.xml nel modo seguente (come evidenziato).
  377. file: core-site.xml: [sito]
  378. 1. <property>
  379. 2. <name>fs.default.name</name>
  380. 3. <value>hdfs://master:9000</value>
  381. 4. <description>The name of the default file system. A URI whose
  382. 5. scheme and authority determine the FileSystem implementation. The
  383. 6. uri's scheme determines the config property (fs.SCHEME.impl) naming
  384. 7. the FileSystem implementation class. The uri's authority is used to
  385. 8. determine the host, port, etc. for a filesystem.</description>
  386. 9. </property>
  387. 10. <property>
  388. 11. <name>hadoop.tmp.dir</name>
  389. 12. <value>/app/hadoop/tmp</value>
  390. 13. </property>
  391.  
  392. File: mapred-site.xml: [sito]
  393. 1. <property>
  394. 2. <name>mapreduce.framework.name</name>
  395. 3. <value>yarn</value>
  396. 4. </property>
  397.  
  398. File: hdfs-site.xml: [sito]
  399. 1. <property>
  400. 2. <name>dfs.replication</name>
  401. 3. <value>3</value>
  402. 4. <description>Default block replication.
  403. 5. The actual number of replications can be specified when the file is created.
  404. 6. The default is used if replication is not specified in create time.
  405. 7. </description>
  406. 8. </property>
  407. Per settare un secondary namenode inserire anche questa proprietà
  408. 9. <property>
  409. 10. <name>dfs.namenode.secondary.http-address</name>
  410. 11. <value>slaveXX:50090</value>
  411. 12. <description>The secondary namenode http server address and port. </description>
  412. 13. </property>
  413.  
  414. File: yarn-site.xml [sito]
  415. 1. <property>
  416. 2. <name>yarn.nodemanager.aux-services</name>
  417. 3. <value>mapreduce_shuffle</value>
  418. 4. </property>
  419. 5. <property>
  420. 6. <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
  421. 7. <value>org.apache.hadoop.mpred.ShuffleHandler</value>
  422. 8. </property>
  423. 9. <property>
  424. 10. <name>yarn.resourcemanager.address</name>
  425. 11. <value>master:8032</value>
  426. 12. </property>
  427. 13. <property>
  428. 14. <name>yarn.resourcemanager.scheduler.address</name>
  429. 15. <value>master:8030</value>
  430. 16. </property>
  431. 17. <property>
  432. 18. <name>yarn.resourcemanager.resource-tracker.address</name>
  433. 19. <value>master:8031</value>
  434. 20. </property>
  435. 21. <property>
  436. 22. <name>yarn.resourcemanager.admin.address</name>
  437. 23. <value>master:8033</value>
  438. 24. </property>
  439. 25. <property>
  440. 26. <name>yarn.resourcemanager.webapp.address</name>
  441. 27. <value>master:8088</value>
  442. 28. </property>
  443. 29. <property>
  444. 30. <name>mapreduce.jobhistory.webapp.address</name>
  445. 31. <value>master:19888</value>
  446. 32. </property>
  447. 33. <property>
  448. 34. <name>mapreduce.jobhistory.address</name>
  449. 35. <value>master:10020</value>
  450. 36. </property>
  451. 37. <property>
  452. 38. <name>yarn.nodemanager.resource.memory-mb</name> <!-- indica la memoria messa a disposizione dal nodo, per info vedere il capitolo sul “Memory Model”-->
  453. 39. <value>2048</value>
  454. 40. </property>
  455.  
  456. Installazione NTP
  457. Per sincronizzare l’orario degli slave con quello del master bisogna utilizzare un server NTP. Nel nostro caso abbiamo necessità di creare un nuovo server NTP a causa del firewall della rete.
  458. Prima di tutto, installare il server sul master.
  459. sudo apt-get install ntp
  460. Poi bisogna modificare il file “/etc/ntp.conf” in modo da far prendere l’orario di sistema del master stesso.
  461. Aggiungere le seguenti due linee:
  462. server 127.127.1.0 # è un alias di localhost
  463. fudge 127.127.1.0 stratum 10
  464. Poi, commentare gli altri server con cancelletto.
  465. Una volta effettuate le modifiche riavviare il server (nb: si auto-avvia all’accensione)
  466. sudo service ntp restart
  467. A questo punto dagli slave effettuare “sudo ntpdate master” per sincronizzare o eseguire lo script sincronizza Ora.sh.
  468.  
  469. Avvio di un job
  470. Prima di avviare un job, ricordarsi di cancellare, creare e formattare le cartelle HDFS su tutti i nodi (incluso il master).
  471.  
  472.  
  473. Avviamo il Namenode sul master e il Datanode sugli slaves:
  474. 1. user@master:/usr/local/hadoop$ start-dfs.sh
  475.  
  476. Se i servizi si sono attivati correttamente vedremo una cosa simile, scrivendo il comando jps sul master:
  477. 1. user@master:/usr/local/hadoop$ jps
  478. 2. 14799 NameNode
  479. 3. 15314 Jps
  480. 4. 14977 SecondaryNameNode
  481. 5. user@master:/usr/local/hadoop$
  482.  
  483. Se lo scriviamo sugli slaves vedremo una cosa simile:
  484. 1. user@slave:/usr/local/hadoop$ jps
  485. 2. 15183 DataNode
  486. 3. 15616 Jps
  487. 4. user@slave:/usr/local/hadoop$
  488.  
  489. Adesso, sempre sul master, avviamo i demoni del framework YARN e dell’ historyserver:
  490. 1. user@master:/usr/local/hadoop$ start-yarn.sh
  491. 2. user@master:/usr/local/hadoop$ mr-jobhistory-daemon.sh start historyserver
  492.  
  493. Ancora una volta, se tutto andrà bene, con il comando jps vedremo nel master i seguenti servizi attivi:
  494. 1. user@master:/usr/local/hadoop$ jps
  495. 2. 14799 NameNode
  496. 3. 15314 Jps
  497. 4. 14977 SecondaryNameNode
  498. 5. 14978 ResourceManager
  499. 6. 14979 JobHistoryService
  500. 7. user@master:/usr/local/hadoop$
  501. e negli slave:
  502. 1. user@slave:/usr/local/hadoop$ jps
  503. 2. 15183 DataNode
  504. 3. 15897 NodeManager
  505. 4. 16284 Jps
  506. Per controllare i servizi è possibile usufruire dell’interfaccia web. Nelle VM da noi distribuite, in Firefox sono presenti i segnalibri alle pagine.
  507.  
  508. Servizio URL
  509. ResourceManager http://master:8088/
  510. NameNode http:// master:50070/dfshealth.jsp
  511. Namenode information http:// master:50070/dfshealth.html
  512. Browsing HDFS http:// master:50070/explorer.html
  513. MR Job History Server http:// master:19888/jobhistory
  514. SecondaryNameNode http:// master: 50090/status
  515. NodeManager http://slave:8042/node
  516.  
  517.  
  518. Memory model
  519. Node Manager
  520. Il Node Manager alloca i container che eseguono i task di Map e Reduce: la somma di tutti i container non può superare le soglie di configurazione e il NodeManager non allocherà un container se non c’è abbastanza memoria.
  521. Nel Node Manager il limite di allocazione è configurabile:
  522. Impostare yarn.nodemanager.resource.memory-mb in yarn-site.xml: di default è 8192 MB e si configura una sola volta allo startup del frame work.
  523.  
  524.  
  525.  
  526.  
  527. Memoria del task
  528.  
  529. Bisogna controllare il limite della memoria di ogni Job: il limite fisico che map e reduce possono allocare e il limite fisico di memoria utilizzabile deve essere inferiore a quello configurato in:
  530. Container Memory Usage = JVM Heap Size + JVM Perm Gen + Native Libraries + Memory used by spawned processes
  531. Un Task viene terminato se supera il limite di memoria.
  532. Le proprietà specificate per i job:
  533. • mapreduce.map.memory.mb property for map tasks
  534. • mapreduce.reduce.memory.mb property for reduce tasks
  535. • Di default la memoria è impostata a 1024
  536.  
  537. Scheduler
  538.  
  539. Alcuni scheduler forzano i valori massimo e minimo per l’allocazione della memoria, lo scheduler ha un valore minimo e massimo per l’allocazione del container, l’incremento è fatto ogni volta aggiungendo una costate ‘valore_minimo’.
  540. Lo scheduler consente una richiesta tra 1024 e 10240 MB per task, con incrementi di 1024 per volta e può essere modificato tramite il file di properties yarn-site.xml
  541. o yarn.scheduler.capacity.minimum-allocation-mb
  542. o yarn.scheduler.capacity.maximum-allocation-mb
  543.  
  544.  
  545. JVM Heap
  546. Ricorda che i limiti per i containers di map e reduce possono essere modificati con mapreduce.map.memory.mb e mapreduce.reduce.memory.mb
  547. La grandezza del JVM heap può essere modificata settando:
  548. • Mapreduce.reduce.java.opts
  549. • Mapreduce.map.java.opts
  550. La memoria utilizzata dal container è formata da: JVM Heap Size + JVM Perm Gen + Native Libraries + memoria usata dal processo generato: mapreduce.map.java.opts=-Xmx2G
  551.  
  552. Virtual Memory
  553.  
  554. • L’allocazione di memoria virtuale è limitata dal Node Manager
  555. o Un task è terminato se supera la memoria virtuale che gli è concessa
  556. • E’ configurata in base alla memoria fisica
  557. o Di default, è 2.1 della memoria fisica del container.
  558. • Es: se un container è configurato a 1G di memoria fisica non potrà superare i 2.1G di memoria virtuale
  559. o Modificare tramite la proprietà yarn.nodemanager.vmem-pmem-ratio del file yarn-site.xml
  560. o Configurato allo start-up.
  561.  
  562.  
  563. Esempio del Memory Model
  564.  
  565. Supponiamo di voler configurare l’heap del Map task a 512MB ed per il reduce a 1G, possiamo configurare la grandezza dell’Heap dei Job Client, con queste proprietà:
  566. o mapreduce.map.java.opts=-Xmx512
  567. o mapreduce.reduce.java.opts=-Xmx1G #Per il limite del container, assumi ulteriori 512MB ulteriori alla grandezza di Heap richiesta
  568. o mapreduce.map.memory.mb=1024
  569. o mapreduce.reduce.memory.mb=1536
  570.  
  571. Configuarazione del YARN NodeManager (yarn-site.xml)
  572. • 10 Gigs per il NodeManager => 10 mappers o 6 reducers (o qualche combinazione): yarn.nodemanager.resource.memory-mb=10240
  573. • Modificare la proprietà dello Scheduler per consentire un’allocazione ad incrementi di 512M : yarn.scheduler.capacity.minimum-allocation-mb=512
  574. • Limite della memoria virtual = 2.1 della memoria fisica configurata
  575. o 2150.4MB per i Map tasks
  576. o 3225.6MB per i Reduce tasks
  577.  
  578.  
  579. Script
  580. Sul master nella cartella script, ci sono una serie di script che sono stati scritti appositamente per semplificare alcune azioni noiose (per eseguirli: $./nomescript.sh):
  581. ● hadoop-start.sh $start $end: avvia hadoop dallo slave “start” allo slave “end”.
  582. ● hadoop-stop.sh $start $end: ferma hadoop.
  583. ● hadoop-restart.sh $start $stop: riavvia hadoop.
  584. ● formattahdfs.sh $start $stop: per pulire e formattare l’intero file system di Hadoop. Può essere usato quando si avvia un nuovo progetto o quando si verificano errori nel file system. Ovviamente, tutto il lavoro svolto andrà perso.
  585. ● pingall.sh $start $stop: verifica che tutti i nodi della griglia siano online.
  586. ● updateCoreSite.sh $start $stop: sostituisce il file core-site.xml su tutti gli slaves della griglia con quello modificato nella cartella insieme agli script.
  587. ● updateHdfsSite.sh $start $stop $fattoreReplica $dimensioniBlocco: sostituisce il file hdfs-site.xml su tutti gli slaves della griglia con uno generato automaticamente
  588. ● updateMapRedSite.sh $start $stop: sostituisce il file mapred-site.xml su tutti gli slaves della griglia con quello modificato nella cartella insieme agli script (per modificare parametri secondari).
  589. ● updateYarnSite.sh $start $stop: invia l’update a tutti gli slave del file yarn-site.xml
  590. ● restartAll.sh $start $stop: riavvia tutti gli slaves e il master
  591. ● restartSlaves.sh $start $stop: riavvia tutti gli slaves
  592. ● shutdown.sh $start $stop: arresta tutti gli slaves.
  593. ● countall.sh $start $stop: restituisce il numero di slave attivi e quali slave non attivi
  594. ● arresta.sh $n-slave: arresta lo specifico slave preso in input
  595. ● stopJob.sh $n-slave: ferma uno specifico job
  596. ● SincronizzaOra.sh $start $stop: per sincronizzare gli orari degli slave con quelli del master.
  597.  
  598. Gli script del master si trovano all’URL: http://goo.gl/EXdCCs
  599.  
  600. Download
  601. Macchina Master: download
  602. Macchina Slave: download
  603.  
  604. Note per i laboratori
  605. IMPORTANTE: prima di iniziare a lavorare, avviare tutte le macchine con Windows e loggarsi con l’account:
  606. user: RETI-xx\hadoop2 o SISTEMI-xx\hadoop2
  607. pass: sisop2
  608. dove xx è il numero della macchina di laboratorio.
  609. La macchina virtuale partirà in automatico e non bisognerà loggarsi (tranne cause sconosciute). Controllare comunque se ogni macchina virtuale si avvia correttamente.
  610.  
  611. Se la macchina virtuale da qualche errore e non è ripristinabile, sul desktop vi è uno zip di backup, basta scompattarlo sul desktop, ed avrete una vm funzionante.
  612.  
  613.  
  614.  
  615.  
  616.  
  617.  
  618.  
  619. Procedura d’installazione sui PC
  620. Per l’installazione delle virtual machine con l’infrastruttura Hadoop , è consigliato utilizzare un account di laboratorio ad hoc, in modo da potere effettuare al meglio e nel modo più semplice possibile i test.
  621. Prima di copiare la VM Slave sulla macchina slaveX effettuare i seguenti passi:
  622. • Loggarsi con l’account creato per Hadoop
  623. • Impostare l’interfaccia classica di Windows
  624. • Disabilitare Update vmware (Ctrl+D sul player; disabilitare tutto)
  625. • Disabilitare sospensione macchina
  626. • Disabilitare spegnimento monitor
  627. • Copiare VM Slave sul desktop
  628. • Estrarre la VM
  629. • Cancellare file compresso
  630. • Mettere la VM in Startup (menù “start” di windows)
  631. • Avviare la VM
  632. • Modificare hostname: sudo nano /etc/hostname
  633. • Modificare le ultime cifre dell’indirizzo IP (Indirizzi IP allocati per Hadoop: 192.168.5.61 - 192.168.5.160, si veda la tabella alla fine della guida)
  634. o IP: 192.168.5.XX
  635. o MASK: 255.255.252.0
  636. o GATEWAY: 192.168.7.254
  637. o DNS: 193.205.160.3
  638.  
  639. • Riavviare VM
  640. • Spegnere VM
  641. • Comprimere la VM e salvarla sul desktop
  642. • Effettuare il login con ssh dal master.
  643. • Dal master lanciare “./arresta.sh slaveX” e vedere se lo slaveX si arresta correttamente.
  644. In questo modo basterà loggarsi nell’account creato ad hoc, e la virtual machine si avvierà automaticamente senza dover far altro.
  645.  
  646.  
  647.  
  648.  
  649. PC-Name Hostname Indirizzo IP Laboratorio Stato
  650. 01 = Sistemi OK / KO
  651. 02 = Reti
  652. SISTEMI-02 slave1 192.168.5.62 1
  653. SISTEMI-03 slave2 192.168.5.63 1
  654. SISTEMI-04 slave3 192.168.5.64 1
  655. SISTEMI-05 slave4 192.168.5.65 1
  656. SISTEMI-06 slave5 192.168.5.66 1
  657. SISTEMI-07 slave6 192.168.5.67 1
  658. SISTEMI-08 slave7 192.168.5.68 1
  659. SISTEMI-09 slave8 192.168.5.69 1
  660. SISTEMI-10 slave9 192.168.5.70 1
  661. SISTEMI-11 slave10 192.168.5.71 1
  662. SISTEMI-12 slave11 192.168.5.72 1
  663. SISTEMI-13 slave12 192.168.5.73 1
  664. SISTEMI-14 slave13 192.168.5.74 1
  665. SISTEMI-15 slave14 192.168.5.75 1
  666. SISTEMI-16 slave15 192.168.5.76 1
  667. SISTEMI-17 slave16 192.168.5.77 1
  668. SISTEMI-18 slave17 192.168.5.78 1
  669. SISTEMI-19 slave18 192.168.5.79 1
  670. SISTEMI-20 slave19 192.168.5.80 1
  671. SISTEMI-21 slave20 192.168.5.81 1
  672. SISTEMI-22 slave21 192.168.5.82 1
  673. SISTEMI-23 slave22 192.168.5.83 1
  674. SISTEMI-24 slave23 192.168.5.84 1
  675. SISTEMI-25 slave24 192.168.5.85 1
  676. SISTEMI-26 slave25 192.168.5.86 1
  677. SISTEMI-27 slave26 192.168.5.87 1
  678. SISTEMI-28 slave27 192.168.5.88 1
  679. SISTEMI-29 slave28 192.168.5.89 1
  680. SISTEMI-30 slave29 192.168.5.90 1
  681. SISTEMI-31 slave30 192.168.5.91 1
  682. SISTEMI-32 slave31 192.168.5.92 1
  683. SISTEMI-33 slave32 192.168.5.93 1
  684. SISTEMI-34 slave33 192.168.5.94 1
  685. SISTEMI-35 slave34 192.168.5.95 1
  686. SISTEMI-36 slave35 192.168.5.96 1
  687. SISTEMI-37 slave36 192.168.5.97 1
  688. SISTEMI-38 slave37 192.168.5.98 1
  689. SISTEMI-39 slave38 192.168.5.99 1
  690. SISTEMI-40 slave39 192.168.5.100 1
  691. SISTEMI-41 slave40 192.168.5.101 1
  692. SISTEMI-42 slave41 192.168.5.102 1
  693. SISTEMI-43 slave42 192.168.5.103 1
  694. SISTEMI-44 slave43 192.168.5.104 1
  695. SISTEMI-45 slave44 192.168.5.105 1
  696. SISTEMI-46 slave45 192.168.5.106 1
  697. SISTEMI-47 slave46 192.168.5.107 1
  698. SISTEMI-48 slave47 192.168.5.108 1
  699. SISTEMI-49 slave48 192.168.5.109 1
  700. SISTEMI-50 slave49 192.168.5.110 1
  701.  
  702.  
  703. PC-Name Hostname Indirizzo IP Laboratorio Stato
  704. 01 = Sistemi OK / KO
  705. 02 = Reti
  706. RETI-01 slave50 192.168.5.111 2
  707. RETI-02 slave51 192.168.5.112 2
  708. RETI-03 slave52 192.168.5.113 2
  709. RETI-04 slave53 192.168.5.114 2
  710. RETI-05 slave54 192.168.5.115 2
  711. RETI-06 slave55 192.168.5.116 2
  712. RETI-07 slave56 192.168.5.117 2
  713. RETI-08 slave57 192.168.5.118 2
  714. RETI-09 slave58 192.168.5.119 2
  715. RETI-10 slave59 192.168.5.120 2
  716. RETI-11 slave60 192.168.5.121 2
  717. RETI-12 slave61 192.168.5.122 2
  718. RETI-13 slave62 192.168.5.123 2
  719. RETI-14 slave63 192.168.5.124 2
  720. RETI-15 slave64 192.168.5.125 2
  721. RETI-16 slave65 192.168.5.126 2
  722. RETI-17 slave66 192.168.5.127 2
  723. RETI-18 slave67 192.168.5.128 2
  724. RETI-19 slave68 192.168.5.129 2
  725. RETI-20 slave69 192.168.5.130 2
  726. RETI-21 slave70 192.168.5.131 2
  727. RETI-22 slave71 192.168.5.132 2
  728. RETI-23 slave72 192.168.5.133 2
  729. RETI-24 slave73 192.168.5.134 2
  730. RETI-25 slave74 192.168.5.135 2
  731. RETI-26 slave75 192.168.5.136 2
  732. RETI-27 slave76 192.168.5.137 2
  733. RETI-28 slave77 192.168.5.138 2
  734. RETI-29 slave78 192.168.5.139 2
  735. RETI-30 slave79 192.168.5.140 2
  736. RETI-31 slave80 192.168.5.141 2
  737. RETI-32 slave81 192.168.5.142 2
  738. RETI-33 slave82 192.168.5.143 2
  739. RETI-34 slave83 192.168.5.144 2
  740. RETI-35 slave84 192.168.5.145 2
  741. RETI-36 slave85 192.168.5.146 2
  742. RETI-37 slave86 192.168.5.147 2
  743. RETI-38 slave87 192.168.5.148 2
  744. RETI-39 slave88 192.168.5.149 2
  745. RETI-40 slave89 192.168.5.150 2
  746. RETI-41 slave90 192.168.5.151 2
  747. RETI-42 slave91 192.168.5.152 2
  748. RETI-43 slave92 192.168.5.153 2
  749. RETI-44 slave93 192.168.5.154 2
  750. RETI-45 slave94 192.168.5.155 2
  751. RETI-46 slave95 192.168.5.156 2
  752. RETI-47 slave96 192.168.5.157 2
  753. RETI-48 slave97 192.168.5.158 2
  754. RETI-49 slave98 192.168.5.159 2
  755. RETI-50 slave99 192.168.5.160 2
  756.  
  757.  
  758.  
  759.  
  760. Mappa del Cluster (Laboratorio RETI)
  761.  
  762. INGRESSO
  763.  
  764. RETI-50 SLAVE 99 5.160 RETI-49 SLAVE 98 5.159 RETI-48 SLAVE 97 5.158 RETI-47 SLAVE 96 5.157 RETI-46 SLAVE 95 5.156 RETI-45 SLAVE 94 5.155 RETI-44 SLAVE 93 5.154 RETI-43 SLAVE 92 5.153 RETI-42 SLAVE 91 5.152 RETI-41 SLAVE 90 5.151 RETI-40 SLAVE 89 5.150
  765.  
  766. RETI-39 SLAVE 88 5.149 RETI-38 SLAVE 87 5.148 RETI-37 SLAVE 86 5.147 RETI-36 SLAVE 85 5.146 RETI-35 SLAVE 84 5.145 RETI-34 SLAVE 83 5.144 RETI-33 SLAVE 82 5.143 RETI-32 SLAVE 81 5.142 RETI-31 SLAVE 80 5.141 RETI-30 SLAVE 79 5.140 RETI-29 SLAVE 78 5.139
  767.  
  768. RETI-28 SLAVE 77 5.138 RETI-27 SLAVE 76 5.137 RETI-26 SLAVE 75 5.136 RETI-25 SLAVE 74 5.135 RETI-24 SLAVE 73 5.134 RETI-23 SLAVE 72 5.133 RETI-22 SLAVE 71 5.132 RETI-21 SLAVE 70 5.131 RETI-20 SLAVE 69 5.130 RETI-19 SLAVE 68 5.129 RETI-18 SLAVE 67 5.128 RETI-17 SLAVE 66 5.127 RETI-16 SLAVE 65 5.126 RETI-15 SLAVE 64 5.125
  769.  
  770. RETI-14 SLAVE 63 MASTER 5.124 RETI-13 SLAVE 62 5.123 RETI-12 SLAVE 61 5.122 RETI-11 SLAVE 60 5.121 RETI-10 SLAVE 59 5.120 RETI-09 SLAVE 58 5.119 RETI-08 SLAVE 57 5.118 RETI-07 SLAVE 56 5.117 RETI-06 SLAVE 55 5.116 RETI-05 SLAVE 54 5.115 RETI-04 SLAVE 53 5.114 RETI-03 SLAVE 52 5.113 RETI-02 SLAVE 51 5.112 RETI-01 SLAVE 50 5.111
  771.  
  772. In rosso: i pc non funzionanti.
  773.  
  774. Mappa del Cluster (Laboratorio SISTEMI)
  775. INGRESSO
  776.  
  777. SISTEMI-13 SLAVE 12 5.73 SISTEMI-12 SLAVE 11 5.72 SISTEMI-11 SLAVE 10 5.71 SISTEMI-10 SLAVE 9 5.70 SISTEMI-09 SLAVE 8 5.69 SISTEMI-08 SLAVE 7 5.68 SISTEMI-07 SLAVE 6 5.67 SISTEMI-06 SLAVE 5 5.66 SISTEMI-05 SLAVE 4 5.65 SISTEMI-04 SLAVE 3 5.64 SISTEMI-03 SLAVE 2 5.63 SISTEMI-02 SLAVE 1 5.62 SISTEMI-01 MASTER
  778.  
  779. SISTEMI-27 SLAVE 26 5.87 SISTEMI-26 SLAVE 25 5.86 SISTEMI-25 SLAVE 24 5.85 SISTEMI-24 SLAVE 23 5.84 SISTEMI-23 SLAVE 22 5.83 SISTEMI-22 SLAVE 21 5.82 SISTEMI-21 SLAVE 20 5.81 SISTEMI-20 SLAVE 19 5.80 SISTEMI-19 SLAVE 18 5.79 SISTEMI-18 SLAVE 17 5.78 SISTEMI-17 SLAVE 16 5.77 SISTEMI-16 SLAVE 15 5.76 SISTEMI-15 SLAVE 14 5.75 SISTEMI-14 SLAVE 13 5.74
  780.  
  781. SISTEMI-41 SLAVE 40 5.101 SISTEMI-40 SLAVE 39 5.100 SISTEMI-39 SLAVE 38 5.99 SISTEMI-38 SLAVE 37 5.98 SISTEMI-37 SLAVE 36 5.97 SISTEMI-36 SLAVE 35 5.96 SISTEMI-35 SLAVE 34 5.95 SISTEMI-34 SLAVE 33 5.94 SISTEMI-33 SLAVE 32 5.93 SISTEMI-32 SLAVE 31 5.92 SISTEMI-31 SLAVE 30 5.91 SISTEMI-30 SLAVE 29 5.90 SISTEMI-29 SLAVE 28 5.89 SISTEMI-28 SLAVE 27 5.88
  782.  
  783. SISTEMI-50 SLAVE 49 5.110 SISTEMI-49 SLAVE 48 5.109 SISTEMI-48 SLAVE 47 5.108 SISTEMI-47 SLAVE 46 5.107 SISTEMI-46 SLAVE 45 5.106 SISTEMI-45 SLAVE 44 5.105 SISTEMI-44 SLAVE 43 5.104 SISTEMI-43 SLAVE 42 5.103 SISTEMI-42 SLAVE 41 5.102
  784.  
  785. In rosso: i pc non funzionanti.
  786.  
  787.  
  788.  
  789.  
  790.  
  791.  
  792.  
  793.  
  794.  
  795. La guida dell’ anno precedente è disponibile al seguente link: https://mega.co.nz/#!gk9hELiC!eJlP584FZdqDOsJcG9NWd0p8CPrg687ClPoUkvFAL3c
  796.  
  797.  
  798.  
  799.  
  800.  
  801.  
  802.  
  803.  
  804.  
  805.  
  806. Autori
  807.  
  808. Giuseppe Luciano
  809. Ciro Veneruso
  810. Ciro Amati
  811. Stefania Cardamone
  812. Alessio Petrozziello
  813. Simone Romano
  814. Gino Farisano
  815.  
  816.  
  817. Data ultimo aggiornamento: 16/05/2015
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement