001 /** 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the 007 * "License"); you may not use this file except in compliance 008 * with the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, software 013 * distributed under the License is distributed on an "AS IS" BASIS, 014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 015 * See the License for the specific language governing permissions and 016 * limitations under the License. 017 */ 018 package org.apache.hadoop.hdfs.client; 019 020 import java.io.IOException; 021 import java.net.URI; 022 023 import org.apache.commons.logging.Log; 024 import org.apache.commons.logging.LogFactory; 025 import org.apache.hadoop.classification.InterfaceAudience; 026 import org.apache.hadoop.classification.InterfaceStability; 027 import org.apache.hadoop.conf.Configuration; 028 import org.apache.hadoop.fs.CommonConfigurationKeysPublic; 029 import org.apache.hadoop.fs.FileSystem; 030 import org.apache.hadoop.hdfs.DFSConfigKeys; 031 import org.apache.hadoop.hdfs.DistributedFileSystem; 032 import org.apache.hadoop.hdfs.protocol.HdfsConstants; 033 import org.apache.hadoop.hdfs.protocol.HdfsConstants.SafeModeAction; 034 import org.apache.hadoop.io.IOUtils; 035 036 /** 037 * The public utility API for HDFS. 038 */ 039 @InterfaceAudience.Public 040 @InterfaceStability.Evolving 041 public class HdfsUtils { 042 private static final Log LOG = LogFactory.getLog(HdfsUtils.class); 043 044 /** 045 * Is the HDFS healthy? 046 * HDFS is considered as healthy if it is up and not in safemode. 047 * 048 * @param uri the HDFS URI. Note that the URI path is ignored. 049 * @return true if HDFS is healthy; false, otherwise. 050 */ 051 public static boolean isHealthy(URI uri) { 052 //check scheme 053 final String scheme = uri.getScheme(); 054 if (!HdfsConstants.HDFS_URI_SCHEME.equalsIgnoreCase(scheme)) { 055 throw new IllegalArgumentException("The scheme is not " 056 + HdfsConstants.HDFS_URI_SCHEME + ", uri=" + uri); 057 } 058 059 final Configuration conf = new Configuration(); 060 //disable FileSystem cache 061 conf.setBoolean(String.format("fs.%s.impl.disable.cache", scheme), true); 062 //disable client retry for rpc connection and rpc calls 063 conf.setBoolean(DFSConfigKeys.DFS_CLIENT_RETRY_POLICY_ENABLED_KEY, false); 064 conf.setInt( 065 CommonConfigurationKeysPublic.IPC_CLIENT_CONNECT_MAX_RETRIES_KEY, 0); 066 067 DistributedFileSystem fs = null; 068 try { 069 fs = (DistributedFileSystem)FileSystem.get(uri, conf); 070 final boolean safemode = fs.setSafeMode(SafeModeAction.SAFEMODE_GET); 071 if (LOG.isDebugEnabled()) { 072 LOG.debug("Is namenode in safemode? " + safemode + "; uri=" + uri); 073 } 074 075 fs.close(); 076 fs = null; 077 return !safemode; 078 } catch(IOException e) { 079 if (LOG.isDebugEnabled()) { 080 LOG.debug("Got an exception for uri=" + uri, e); 081 } 082 return false; 083 } finally { 084 IOUtils.cleanup(LOG, fs); 085 } 086 } 087 }