Solucione problemas de HDFS do Apache Hadoop usando o Azure HDInsight
Conheça os principais problemas e as resoluções ao trabalhar com o Sistema de Arquivos Distribuído do Hadoop (HDFS). Para uma lista completa de comandos, consulte o Guia de comandos do HDFS e o Guia do Shell do sistema de arquivos.
Como fazer para acessar o HDFS local de dentro de um cluster?
Problema
Acesse o HDFS local da linha de comando e do código do aplicativo em vez de usar o armazenamento de Blobs do Azure ou o Azure Data Lake Storage de dentro do cluster HDInsight.
Etapas de resolução
No prompt de comando, use
hdfs dfs -D "fs.default.name=hdfs://mycluster/" ...
literalmente, como no seguinte comando:hdfs dfs -D "fs.default.name=hdfs://mycluster/" -ls / Found 3 items drwxr-xr-x - hdiuser hdfs 0 2017-03-24 14:12 /EventCheckpoint-30-8-24-11102016-01 drwx-wx-wx - hive hdfs 0 2016-11-10 18:42 /tmp drwx------ - hdiuser hdfs 0 2016-11-10 22:22 /user
No código-fonte, use o URI
hdfs://mycluster/
literalmente, como no seguinte exemplo de aplicativo:import java.io.IOException; import java.net.URI; import org.apache.commons.io.IOUtils; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.*; public class JavaUnitTests { public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); String hdfsUri = "hdfs://mycluster/"; conf.set("fs.defaultFS", hdfsUri); FileSystem fileSystem = FileSystem.get(URI.create(hdfsUri), conf); RemoteIterator<LocatedFileStatus> fileStatusIterator = fileSystem.listFiles(new Path("/tmp"), true); while(fileStatusIterator.hasNext()) { System.out.println(fileStatusIterator.next().getPath().toString()); } } }
Execute o arquivo .jar compilado (por exemplo, um arquivo chamado
java-unit-tests-1.0.jar
) no cluster HDInsight com o seguinte comando:hadoop jar java-unit-tests-1.0.jar JavaUnitTests hdfs://mycluster/tmp/hive/hive/5d9cf301-2503-48c7-9963-923fb5ef79a7/inuse.info hdfs://mycluster/tmp/hive/hive/5d9cf301-2503-48c7-9963-923fb5ef79a7/inuse.lck hdfs://mycluster/tmp/hive/hive/a0be04ea-ae01-4cc4-b56d-f263baf2e314/inuse.info hdfs://mycluster/tmp/hive/hive/a0be04ea-ae01-4cc4-b56d-f263baf2e314/inuse.lck
Exceção de armazenamento para gravar no blob
Problema
Ao usar os comandos hadoop
ou hdfs dfs
para gravar arquivos que têm aproximadamente 12 GB ou mais em um cluster HBase, você pode encontrar o seguinte erro:
ERROR azure.NativeAzureFileSystem: Encountered Storage Exception for write on Blob : example/test_large_file.bin._COPYING_ Exception details: null Error Code : RequestBodyTooLarge
copyFromLocal: java.io.IOException
at com.microsoft.azure.storage.core.Utility.initIOException(Utility.java:661)
at com.microsoft.azure.storage.blob.BlobOutputStream$1.call(BlobOutputStream.java:366)
at com.microsoft.azure.storage.blob.BlobOutputStream$1.call(BlobOutputStream.java:350)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
Caused by: com.microsoft.azure.storage.StorageException: The request body is too large and exceeds the maximum permissible limit.
at com.microsoft.azure.storage.StorageException.translateException(StorageException.java:89)
at com.microsoft.azure.storage.core.StorageRequest.materializeException(StorageRequest.java:307)
at com.microsoft.azure.storage.core.ExecutionEngine.executeWithRetry(ExecutionEngine.java:182)
at com.microsoft.azure.storage.blob.CloudBlockBlob.uploadBlockInternal(CloudBlockBlob.java:816)
at com.microsoft.azure.storage.blob.CloudBlockBlob.uploadBlock(CloudBlockBlob.java:788)
at com.microsoft.azure.storage.blob.BlobOutputStream$1.call(BlobOutputStream.java:354)
... 7 more
Causa
os clusters HBase no HDInsight são padronizados para um tamanho de bloco de 256 KB na gravação no armazenamento do Azure. Embora isso funcione para APIs HBase ou APIs REST, isso resultará em um erro ao usar os utilitários de linha de comando hadoop
ou hdfs dfs
.
Resolução
use fs.azure.write.request.size
para especificar um tamanho de bloco maior. Essa modificação pode ser feita a cada uso usando o -D
parâmetro. O seguinte comando é um exemplo de uso desse parâmetro com o comando hadoop
:
hadoop -fs -D fs.azure.write.request.size=4194304 -copyFromLocal test_large_file.bin /example/data
Você também pode aumentar o valor de fs.azure.write.request.size
globalmente usando o Apache Ambari. As etapas a seguir podem ser usadas para alterar o valor na interface de usuário do Ambari Web:
No navegador, acesse a interface de usuário do Ambari Web para seu cluster. A URL é
https://CLUSTERNAME.azurehdinsight.net
, em queCLUSTERNAME
é o nome do cluster. Quando solicitado, insira o nome de administrador e a senha de administrador para o cluster.No lado esquerdo da tela, escolha HDFS e selecione a guia Configurações.
No campo Filtrar... , insira
fs.azure.write.request.size
.Altere o valor de 262144 (256 KB) para o novo valor. Por exemplo, 4194304 (4 MB).
Para saber mais sobre como usar o Ambari, confira Gerenciar clusters HDInsight interface do usuário Web do Apache Ambari.
du
O -du
comando exibe tamanhos de arquivos e diretórios contidos no diretório determinado ou o comprimento de um arquivo, caso seja apenas um arquivo.
A -s
opção produz um resumo agregado de comprimentos de arquivo que estão sendo exibidos.
A -h
opção formata os tamanhos de arquivo.
Exemplo:
hdfs dfs -du -s -h hdfs://mycluster/
hdfs dfs -du -s -h hdfs://mycluster/tmp
rm
O comando -rm exclui os arquivos especificados como argumentos.
Exemplo:
hdfs dfs -rm hdfs://mycluster/tmp/testfile
Próximas etapas
Se você não encontrou seu problema ou não conseguiu resolver seu problema, visite um dos seguintes canais para obter mais suporte:
Obtenha respostas de especialistas do Azure por meio do Suporte da Comunidade do Azure.
Conecte-se com @AzureSupport – a conta oficial do Microsoft Azure para aprimorar a experiência do cliente. Como se conectar à comunidade do Azure para os recursos certos: respostas, suporte e especialistas.
Se precisar de mais ajuda, poderá enviar uma solicitação de suporte do portal do Azure. Selecione Suporte na barra de menus ou abra o hub Ajuda + suporte. Para obter informações mais detalhadas, consulte Como criar uma solicitação de Suporte do Azure. O acesso ao Gerenciamento de assinaturas e ao suporte de cobrança está incluído na sua assinatura do Microsoft Azure, e o suporte técnico é fornecido por meio de um dos Planos de suporte do Azure.