环境:
开发环境是Windows下的Eclipse,
其中host已经设置了对集群的IP和主机名
在环境变量中,设置了JAVA_HOME ,设置好JAVA的默认路径
有C:\My_Files\Config\hadoop-common-2.2.0-bin-master\bin
生产环境:一个集群
开发步骤:
1.通过Maven工程中的pom.xml引入依赖关系
2.配置与连接
3.对HDFS进行编程操作
HDFS的操作包含:对HDFS进行操作,文件夹和目录,权限,文件等
对分HDFS中的文件操作主要涉及一下几个类:
Configuration类:该类的对象封转了客户端或者服务器的配置。
FileSystem类:该类的对象是一个文件系统对象,可以用该对象的一些方法来对文件进行操作。
FileSystem fs = FileSystem.get(conf);通过FileSystem的静态方法get获得该对象。
FSDataInputStream和FSDataOutputStream:这两个类是HDFS中的输入输出流。
分别通过FileSystem的open方法和create方法获得
配置文件设置
方式一:从配置文件中读取
//initialization
static Configuration conf = new Configuration();
static FileSystem hdfs;
static {
String path = "/usr/java/hadoop-1.0.3/conf/";
conf.addResource(new Path(path + "core-site.xml"));
conf.addResource(new Path(path + "hdfs-site.xml"));
conf.addResource(new Path(path + "mapred-site.xml"));
path = "/usr/java/hbase-0.90.3/conf/";
conf.addResource(new Path(path + "hbase-site.xml"));
try {
hdfs = FileSystem.get(conf);
} catch (IOException e) {
e.printStackTrace();
}
}
##方式二
public static final String toolConfigPath = "C:/Users/unix/workspace/JavaHDFS/src/main/resources/HDFSConfig.properties";
/**
* 取得通用配置文件属性
* @param CongfigfilePath 配置文件的文件路径和配置文件明后才能
* @param key 调取的参数
* @return
*/
private static String getProptFile(String CongfigfilePath,String key){
Properties prop = new Properties();
InputStream propInStream = null;
//读取属性文件CongfigFilenName
try {
//从文件获取InputStream
propInStream = new FileInputStream(new File(CongfigfilePath));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
prop.load(propInStream);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} ///加载对应属性
// String configParam = (String) prop.getProperty(key);
String configParam = prop.getProperty(key);
//关闭资源
try {
propInStream .close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return configParam;
}
/**
* 初始化配置 静态初始化块
* @return
*/
private static Configuration getConf(){
////Configuration 对象封装了客户端或者服务端的配置
Configuration HDFS_CONFIG = new Configuration();
// 这句话很关键,这些信息就是hadoop配置文件中的信息 // 文件系统连接到 hdfs的配置信息
// HDFSConfig.properties文件在系统下,如果不在的话
String HDFS_fs_default_name= getProptFile(HdfsUtil.toolConfigPath,"fs.default.name");
HDFS_CONFIG.set("fs.default.name", HDFS_fs_default_name);
return HDFS_CONFIG;
}
/**
* 创建目录
* @param path
* @throws IOException
*/
public static void mkdir(String path) throws IOException{
Configuration conf = getConf();
FileSystem fs = FileSystem.get(conf);
Path srcPath = new Path(path);
//FileSystem 实例提供创建目录的方法mkdirs,如果创建成功则会返回true
boolean isok = fs.mkdirs(srcPath);
if(isok){
System.out.println("create dir ok!");
}else{
System.out.println("create dir failure");
}
fs.close();
}
方式二--使用加载当前类读取
public static final String toolConfigPath = "C:/Users/unix/workspace/JavaHDFS/src/main/resources/HDFSConfig.properties";
/**
* 取得通用配置文件属性
* @param CongfigfilePath 配置文件的文件路径和配置文件名称
* @param key 调取的参数
* @return
*/
public static String getConfigProperty(String path,String name) {
Properties prop = new Properties();
InputStream in = null;
String value = null;
try {
File f = new File(path);
if (!SystemUtils.IS_OS_WINDOWS) {
in = new FileInputStream(f);
} else {
//通过当前类加载器的getResourceAsStream方法获取InputStream
//注意:在使用getResourceAsStream()读取配置文件时,要特别注意配置文件的路径的写法。
//this.getClass.getResourceAsStream(fileName)..使用类和资源文件在同一目录下;
//this.getclass.getLoader.getResourceAsStream(fileName)..资源文件和classes同级。
in = SingleHDFS.class.getClassLoader().getResourceAsStream("HDFSConfig.properties");
}
prop.load(in);
value = prop.getProperty(name);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if(in != null){
in.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return value;
}
/**
* 初始化配置 静态初始化块
* @return
*/
private static Configuration getConf(){
////Configuration 对象封装了客户端或者服务端的配置
Configuration HDFS_CONFIG = new Configuration();
// 这句话很关键,这些信息就是hadoop配置文件中的信息 // 文件系统连接到 hdfs的配置信息
// HDFSConfig.properties文件在系统下,如果不在的话
String HDFS_fs_default_name= SingleHDFS.getConfigProperty(SingleHDFS.toolConfigPath,"fs.default.name");
HDFS_CONFIG.set("fs.default.name", HDFS_fs_default_name);
return HDFS_CONFIG;
}
出现的错误
出错:java.lang.UnsatisfiedLinkError: org.apache.hadoop.util.NativeCrc32.nativeComputeChunkedSums
原因:
hadoop2.6版本的dll,网上比较多的是2.2的dll,
如果2.6版本用2.2的dll,会报hadoop 2.6 UnsatisfiedLinkError: org.apache.hadoop.util.NativeCrc32.nativeComputeChunkedSumsByteArra 错误,
因为2.2的dll中NativeCrc32只nativeVerifyChunkedSums,没有nativeComputeChunkedSums和nativeComputeChunkedSumsByteArray,所以会报错,
至于网上说的建同名包,拷贝NativeCrc32.java是没有用的,至少对于2.6.0来说是没有用的
解决方法:下载2.7版本的,然后将其中2.2的替换为2.7的
参考
HDFS的API http://blog.csdn.net/silentwolfyh/article/details/51485288
HDFS中JAVA API的使用 http://blog.csdn.net/flood_dragon/article/details/17957505
java读取.properties配置文件的几种方法 http://blog.csdn.net/mhmyqn/article/details/7683909
HDFS中JAVA API的使用 http://www.cnblogs.com/liuling/p/2013-6-17-01.html