Armazenando grandes quantidades de dados Universidade Federal de Campina Grande UFCG Centro de Engenharia Elétrica e Informática CEEI Departamento de Sistemas e Computação DSC Disciplina: TECC Analise de Dados 2 Período: 2015.2 Professores: Andrey Brito, Leandro Balby
HDFS Sistemas distribuído de arquivos com o objetivo de ser escalável, tolerante à falhas e de fácil expansão É o armazenamento primário para Hadoop e Spark Tem como objetivo ser simples e ao mesmo tempo dar suporte para que aplicações fiquem próximas aos dados
NameNode e DataNode NameNode: serviço/máquina que armazena as informações sobre os arquivos no sistema (metadados) Um acesso precisa passar por ele para descobrir para onde (quais DataNodes) os dados irão, ou de onde virão Existe um NameNode secundário, que tem o objetivo de tolerar a falha do primário DataNode: serviço/máquina responsável pelo armazenado de fato
Arquitetura do HDFS
Características Tolerante a falhas: tipicamente o armazenamento é feito com redundância tripla para cada bloco Escalabilidade: a leitura e armazenamento é feita diretamente com os DataNodes e então escala bem com o número de máquinas Espaço: pode ser adicionado com novos dados e um rebalanceamento Padrão da indústria: usado por muitos sistemas (Hadoop, Spark, Hbase)
Armazenamento no HDFS
HDFS - limitações É pensado para arquivos grandes que normalmente são escritos uma vez e lidos muitas vezes Tem problemas com aplicações que usam muitos arquivos pequenos Não é baixa latência (e sim, alta vazão, por isso os blocos grandes)
Organização dos dados Um arquivo submetido é dividido em pedaços (data blocks) Cada pedaço é armazenado em um ou mais nós Cada cópia é uma réplica Quando algum nó falha ou o dado é perdido fica como sub-replicado (underreplicated) Primeira réplica fica em um nó de um rack (local se o cliente for um DataNode) Segunda em outro rack, terceira no mesmo do segundo, demais são aleatórias
Operação de leitura (localização é transparente)
FileSystem filesystem = FileSystem.get(conf); Path path = new Path("/path/to/file.ext"); if (!filesystem.exists(path)) { System.out.println("File does not exists"); return; } FSDataInputStream in = filesystem.open(path); int numbytes = 0; while ((numbytes = in.read(b)) > 0) { System.out.prinln((char)numBytes)); // code to manipulate the data which is read } in.close(); out.close(); filesystem.close(); http://blogs.data-flair.com/hadoop-hdfs-data-read-and-write-operations/
Operação de escrita Pacotes são quebrados e enfileirados Cada um passa os dados para o seguinte Removido da fila apenas quando tem o Ack de todos
Segurança de acesso Mais comum: modo inseguro Usa o nome do usuário no sistema operacional para definir acesso Exemplo: ubuntu@master:~$ hdfs dfs -ls /user Found 1 items drwxr-xr-x - ubuntu supergroup ubuntu@master:~$ 0 2016-04-07 00:18 /user/ubuntu Então outro usuário não teria permissão andrey@master:~$ hdfs dfs -rm -r /user/ubuntu/output 16/04/11 02:17:54 INFO fs.trashpolicydefault: Namenode trash configuration: Deletion interval = 0 minutes, Emptier interval = 0 minutes. rm: Permission denied: user=andrey, access=write, inode="/user/ubuntu":ubuntu:supergroup:drwxr-xr-x andrey@master:~$
HDFS Pontos relevantes da configuração Número de réplicas, tamanho do bloco e onde escrever (/etc/hadoop/conf/hdfssite.xml) <property> <name>dfs.namenode.name.dir</name> <value>file:///data1/cloudera/dfs/nn,file:///data2/cloudera/dfs/nn</value> </property> <property> <name>dfs.blocksize</name> <value>134217728</value> </property> <property> <name>dfs.replication</name> <value>3</value> </property> Permite escrever em vários discos para aumentar a banda, melhor que RAID ou SSDs.
Usos comuns na linha de comando Listagens hdfs dfs ls hdfs dfs -ls / hdfs dfs -ls -R /var Uso de espaço hdfs dfs -du -h / hdfs dfs -du /hbase/data/hbase/namespace/ hdfs dfs -du -h /hbase/data/hbase/namespace/ hdfs dfs -du -s /hbase/data/hbase/namespace/
Usos comuns na linha de comando (2) Copiando dados para o HDFS hdfs dfs -mkdir tdata hdfs dfs -ls hdfs dfs -copyfromlocal tutorials/data/geneva.csv tdata hdfs dfs -ls R Copiando de volta cd tutorials/data/ hdfs dfs copytolocal tdata/geneva.csv geneva.csv.hdfs md5sum geneva.csv geneva.csv.hdfs
Usos comuns na linha de comando (3) Estatísticas (replicação, última modificação, tamanho, etc.) hdfs dfs -stat "%r" tdata/geneva.csv Escrevendo a partir da saída padrão echo "blah blah blah" hdfs dfs -put - tdataset/tfile.txt hdfs dfs -ls R hdfs dfs -cat tdataset/tfile.txt
Usos comuns na linha de comando (4) Remoção de arquivos hdfs dfs -rm tdataset/tfile.txt hdfs dfs rm r /user/ubuntu/output* hdfs dfs -ls R Listagem de informações dos blocos hdfs fsck /user/cloudera/tdata/geneva.csv - files -blocks locations
andrey@master:~$ hdfs fsck /curitiba/doc2-2015102621.txt -files -blocks -locations Connecting to namenode via http://master.cloud.lsd.ufcg.edu.br:50070 FSCK started by andrey (auth:simple) from /10.4.3.75 for path /curitiba/doc2-2015102621.txt at Mon Apr 11 12:02:03 BRT 2016 /curitiba/doc2-2015102621.txt 293875416 bytes, 3 block(s): OK 0. BP-59990194-127.0.0.1-1459874876285:blk_1073742072_1248 len=134217728 repl=3 [10.4.3.74:50010, 10.4.3.73:50010, 10.4.3.76:50010] 1. BP-59990194-127.0.0.1-1459874876285:blk_1073742073_1249 len=134217728 repl=3 [10.4.3.74:50010, 10.4.3.73:50010, 10.4.3.76:50010] 2. BP-59990194-127.0.0.1-1459874876285:blk_1073742074_1250 len=25439960 repl=3 [10.4.3.73:50010, 10.4.3.76:50010, 10.4.3.77:50010] Status: HEALTHY Total size: 293875416 B Total dirs: 0 Total files: 1 Total symlinks: 0 Total blocks (validated): 3 (avg. block size 97958472 B) Minimally replicated blocks: 3 (100.0 %) Over-replicated blocks: 0 (0.0 %) Under-replicated blocks: 0 (0.0 %)...... Mis-replicated blocks: 0 (0.0 %) Default replication factor: 3 Average block replication: 3.0 Corrupt blocks: 0 Missing replicas: 0 (0.0 %) Number of data-nodes: 4 Number of racks: 1 FSCK ended at Mon Apr 11 12:02:03 BRT 2016 in 1 milliseconds
Navegador de arquivos
Acessando a interface Web remotamente
Outras formas de armazenamento Armazenamento de objeto Amazon S3 ou OpenStack Swift Escalável já que é orientado a adições e remoções (e não updates pontuais) Bancos Key-value Cassandra (Menos latência) Tolerância a falhas e escalabilidade com replicação e consistência ajustável Quando usar uma alternativa? Muitos arquivos pequenos Os dados já estão em uma forma de armazenamento
Spark no Cluster
$ pyspark --total-executor-cores 8 --master spark://master:7077 >>> file = sc.textfile("hdfs://master.cloud.lsd.ufcg.edu.br:9000/user/spark/doc1-2015102121.txt") >>> counts = file.flatmap(lambda line: line.split(",")).map(lambda word: (word, 1)).reduceByKey(lambda a, b: a + b) >>> counts.saveastextfile("./output-2") >>> quit() $ hdfs dfs -ls output-2 Found 3 items -rw-r--r-- 3 andrey supergroup 0 2016-04-11 13:47 output-2/_success -rw-r--r-- 3 andrey supergroup 6179309 2016-04-11 13:47 output-2/part-00000 -rw-r--r-- 3 andrey supergroup 6174864 2016-04-11 13:47 output-2/part-00001 $ hdfs dfs -get output-2/part-00000 $ less part-00000
$ pyspark --total-executor-cores 8 --master spark://master:7077 >>> file = sc.textfile( /curitiba/doc1-2015102121.txt") >>> counts = file.flatmap(lambda line: line.split(",")).map(lambda word: (word, 1)).reduceByKey(lambda a, b: a + b) >>> counts.saveastextfile("./output-2") >>> quit() $ hdfs dfs -ls output-2 Found 3 items -rw-r--r-- 3 andrey supergroup 0 2016-04-11 13:47 output-2/_success -rw-r--r-- 3 andrey supergroup 6179309 2016-04-11 13:47 output-2/part- 00000 -rw-r--r-- 3 andrey supergroup 6174864 2016-04-11 13:47 output-2/part- 00001 $ hdfs dfs -get output-2/part-00000 $ less part-00000