以下操作需要配置好eclipse环境jdk环境和maven环境,具体环境配置网上有好多,最近也会出一份详细教程。
1.创建类MakeDir.class,在HDFS的根目录下,创建名为hdfstest的目录。
/*
* 程序功能是在HDFS的根目录下,创建名为hdfstest的目录。
*
*/
package com.itcast.demo;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class MakeDir {
public static void main(String[] args) throws IOException, URISyntaxException {
Configuration conf = new Configuration(); //构造一个配置参数对象,设置一个参数,来访问我们的HDFS的URI
String hdfsPath = "hdfs://hadoop01:9000"; //hdfs的地址
System.setProperty("HADOOP_USER_NAME", "root"); //通过这种方式进行客户端身份的设置
FileSystem hdfs = FileSystem.get(new URI(hdfsPath),conf);//通过FileSystem类的静态方法获取文件系统的客户端对象
String newDir = "/hdfstest"; //创建一个新的目录
boolean result = hdfs.mkdirs(new Path(newDir)); //判断结果,将文件创建到新的地址。
if(result) { //如果结果成功
System.out.println("success"); //返回一个success
}else { //如果结果失败
System.out.println("failed"); //返回一个failed
}
}
}
2.创建类TouchFile.class,在HDFS的目录/hdfstest下,创建名为touchfile的文件。
/*
* 程序功能是在HDFS的目录/hdfstest下,
* 创建名为touchfile的文件。
*/
package com.itcast.demo;
import java.io.IOException;
import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class TouchFile {
public static void main(String[] args) throws Exception, IOException {
Configuration conf = new Configuration();//构造一个参数对象,设置一个参数conf,来访问呢我们的hdfs。
String hdfsPath = "hdfs://hadoop01:9000"; //创建一个字符串用来存储我们hdfs的地址。
System.setProperty("HADOOP_USER_NAME", "root");//用于设置客户端身份,注意命令执行顺序。
FileSystem hdfs = FileSystem.get(new URI(hdfsPath),conf);//通过FileSystem类的静态方法获取文件系统的客户端对象
String filePath = "/hdfstest/touchfile";//创建一个filePath存放创建文件字符串。
hdfs.create(new Path(filePath)); //函数hafs.create创建一个文件+文件地址。
System.out.println("Finish!"); //完成打印finish。
}
}
3.创建类CopyFromLocalFile.class,将本地C:/hadoop_text/sample_data.txt的文件,上传到HDFS文件系统的/hdfstest目录下。
/*
*
* 程序功能是将本地操作系统上的文件C:/hadoop_text/sample_data.txt,
* 上传到HDFS文件系统的/hdfstest目录下。
*
*/
package com.itcast.demo;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class CopyFromLocalFile {
public static void main(String[] args) throws IOException, URISyntaxException {
Configuration conf = new Configuration();//构造一个参数对象,设置一个参数conf,来访问我们的hdfs。
String hdfsPath = "hdfs://hadoop01:9000";//创建一个字符串用来存储我们的hdfs的地址。
System.setProperty("HADOOP_USER_NAME", "root");//用于设置客户端身份,注意命令执行顺序。
FileSystem hdfs = FileSystem.get(new URI(hdfsPath),conf);//通过FS类的方法获取文件系统客户端对象。
String from_windows = "C:/hadoop_text/sample_data.txt";//创建一个字符串写入本地文件地址。
String to_HDFS = "/hdfstest/"; //创建一个字符串写入上传文件地址。
hdfs.copyFromLocalFile(new Path(from_windows),new Path(to_HDFS));//调用函数上传。
System.out.println("Finish!"); //完成输出Finish!
}
}
4.创建类CopyToLocalFile.class,将HDFS文件系统上的文件/hdfstest/sample_data,下载到本地。
/*
* 程序功能是将HDFS文件系统上的文件/hdfstest/sample_data,
* 下载到本地C:/hadoop_text/copytolocal 。
*/
package com.itcast.demo;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class CopyToLocalFile {
public static void main(String[] args) throws IOException, URISyntaxException {
Configuration conf = new Configuration(); //构造一个参数对象,设置一个参数conf,来访问我们的hdfs。
String hdfsPath = "hdfs://hadoop01:9000"; //创建一个字符串用来存储我们的hdfs地址。
System.setProperty("HADOOP_USER_NAME","root"); //用于设置客户端身份,注意命令顺序,函数调用set。
FileSystem hdfs = FileSystem.get(new URI(hdfsPath),conf); //通过FileSystem方法获取系统客户端对象。
String from_HDFS = "/hdfstest/sample_data.txt"; //创建一个字符串写入下载地址,注意文件要加.txt后缀。
String to_windows = "/C:/hadoop_text/copytolocal/"; //创建一个字符串写入下载到本地的地址。
hdfs.copyToLocalFile(false, new Path(from_HDFS),new Path(to_windows)); //调用.copy函数进行下载。
System.out.println("Finish!"); //完成输出finfish!。
}
}
5.创建类ListFiles.class,列出HDFS文件系统/hdfstest目录下,所有的文件,以及文件的权限、用户组、所属用户。
/*
* 程序功能是列出HDFS文件系统/hdfstest目录下,
* 所有的文件,以及文件的权限、用户组、所属用户
* 块的大小:.getBlockSize() 文件长度:.getLen() 备份数:.getReplication()
* 修改时间:.getModificationTime()
*/
package com.itcast.demo;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class ListFiles {
public static void main(String[] args) throws IOException, URISyntaxException {
Configuration conf = new Configuration(); //构造一个参数对象,设置一个参数conf,来访问我们的hdfs。
String hdfsPath = "hdfs://hadoop01:9000"; //创建一个字符串用来存储我们的hdfs地址。
System.setProperty("HADOOP_USER_NAME", "root"); //用于设置客户端身份,注意命令顺序,函数调用set。
FileSystem hdfs = FileSystem.get(new URI(hdfsPath),conf); //通过FileSystem方法获取系统客户端对象。
String watchHDFS = "/hdfstest"; //创建一个字符串写入查询hdfs文件地址
FileStatus[] files = hdfs.listStatus(new Path(watchHDFS));//FileStatus对象封装了文件和目录的元数据,包括文件长度、块大小、权限等信息。
for (FileStatus file: files) {//做一个循环输出
System.out.println("文件权限:"+file.getPermission() +"文件所有者:"+file.getOwner()+"用户组信息"+file.getGroup()+"文件路径:"+file.getPath());
} //分别输出文件的权限、所有者、用户组信息、路径。循环到所有文件结束为止。
}
}
6.创建类IteratorListFiles.class,列出HDFS文件系统/根目录下,以及各级子目录下,所有文件以及文件的权限、用户组,所属用户。
/*
* 程序功能是列出HDFS文件系统/根目录下,以及各级子目录下,
* 所有文件以及文件的权限、用户组,所属用户。
*/
package com.itcast.demo;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class IteratorListFiles {
public static void main(String[] args) throws IOException, URISyntaxException {
Configuration conf = new Configuration(); //构造一个参数对象,设置一个参数conf,来访问我们的hdfs。
String hdfspath = "hdfs://hadoop01:9000"; //创建一个字符串用来存储我们hdfs的地址。
System.setProperty("HADOOP_USER_HOME", "root"); //用于设置客户端身份,注意命令顺序,函数调用set。
FileSystem hdfs = FileSystem.get(new URI(hdfspath), conf); //通过FS方法获取客户端对象。
String watchHDFS = "/"; //创建一个字符串写入查询hdfs文件地址。
iteratorListFile(hdfs,new Path(watchHDFS)); //创建一个方法分别放客户端对象,和查询hdfs地址。下面再构造一个方法的内容。
}
public static void iteratorListFile(FileSystem hdfs, Path path) throws IOException, IOException {
FileStatus[] files = hdfs.listStatus(path); //FileStatus对象封装了文件和目录的元数据,调用此类。
for(FileStatus file:files) { //做一个for循环,用于持续输出。
if(file.isDirectory()) { //如果文件时目录的话。
System.out.println("文件权限"+file.getPermission()+"文件所有者"+ file.getOwner()+"用户组信息"+file.getGroup()+"文件路径"+file.getPath());
iteratorListFile(hdfs,file.getPath());
}else if(file.isFile()) { //如果是文件的话。
System.out.println("文件权限"+file.getPermission()+"文件所有者"+file.getOwner()+"用户组信息"+file.getGroup()+"文件路径"+file.getPath());
}
}
}
}
7.创建类LocateFile.class,查看HDFS文件系统上,文件/hdfstest/sample_data的文件块信息。
/*
* 程序功能是查看HDFS文件系统上,
* 文件/hdfstest/sample_data的文件块信息。
*/
package com.itcast.demo;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.BlockLocation;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class LocateFile {
public static void main(String[] args) throws IOException, URISyntaxException {
Configuration conf = new Configuration();//构造一个参数对象,设置一个参数conf,来访问我们的hdfs。
String hdfspath = "hdfs://hadoop01:9000"; //创建一个字符串用来存储我们hdfs的地址。
System.setProperty("HADOOP_USER_HOME", "root"); //用于设置客户端身份,注意命令顺序,函数调用set。
FileSystem hdfs = FileSystem.get(new URI(hdfspath), conf); //通过FS方法获取客户端对象。
Path file = new Path("/hdfstest/sample_data.txt");//设置一个文件路径=hdfs路径。
FileStatus fileStatus = hdfs.getFileStatus(file); //得到hdfs文件地址
BlockLocation[] location = hdfs.getFileBlockLocations(fileStatus,0,fileStatus.getLen());//调用查看文件快的包,写入位置到location。
for(BlockLocation block:location){ //在location循环找文件块
String[] hosts = block.getHosts(); //定义一个字符串,放入获得的文件块
for(String host:hosts) { //文件块循环
System.out.println("block:"+block + "host:" + host);; //输出信息
}
}
}
}
8.创建类WriteFile.class,在HDFS上,创建/hdfstest/writefile文件,并在文件中写入内容“hello world hello data!”。
/*
* 程序功能是在HDFS上,创建/hdfstest/writefile文件
* 并在文件中写入内容“hello world hello data!”。
*/
package com.itcast.demo;
import java.io.IOException;
import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class WriteFile {
public static void main(String[] args) throws IOException, Exception{
Configuration conf = new Configuration();//构造一个参数对象,设置一个参数conf,来访问我们的hdfs。
String hdfspath = "hdfs://hadoop01:9000"; //创建一个字符串用来存储我们hdfs的地址。
System.setProperty("HADOOP_USER_HOME", "root"); //用于设置客户端身份,注意命令顺序,函数调用set。
FileSystem hdfs = FileSystem.get(new URI(hdfspath), conf); //通过FS方法获取客户端对象。
String filePath = "/hdfstest/writefile"; //定义字符串写入文件创建地址和创建文件的名字。
FSDataOutputStream create = hdfs.create(new Path(filePath)); //将创建的文件传到hdfs上。
System.out.println("第一步完成!"); //完成输出。
String sayHi = "hello world hello data!"; //定义字符串,写入将要写进文件的内容。
byte[] buff =sayHi.getBytes(); //先建立个空字节,返回一个字符sayHi内容的编码字节,放入buff中。
create.write(buff,0,buff.length); //写入到文件中,包括文件内容和长度。
create.close(); //关闭资源文件。
System.out.println("第二步完成"); //完成输出。
}
}
9.创建类PutMerge.class,将本地文件夹/data/mydata/下的所有文件,上传到HDFS上并合并成一个文件/hdfstest/mergefile。
/*
* 程序功能是将本地文件夹C:\hadoop_text\hadoop04下的所有文件,
* 上传到HDFS上并合并成一个文件/hdfstest/mergefile。
*
*/
package com.itcast.demo;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class PutMerge {
public static void main(String[] args) throws IOException, URISyntaxException {
Configuration conf = new Configuration();//构造一个参数对象,设置一个参数conf,来访问我们的hdfs。
String hdfspath = "hdfs://hadoop01:9000"; //创建一个字符串用来存储我们hdfs的地址。
System.setProperty("HADOOP_USER_HOME", "root"); //用于设置客户端身份,注意命令顺序,函数调用set。
FileSystem hdfs = FileSystem.get(new URI(hdfspath), conf); //通过FS方法获取客户端对象。
FileSystem local = FileSystem.getLocal(conf); //通过FS方法获取本地参数。
String from_windowsDir = "C:\\hadoop_text\\hadoop04"; //定义一个字符串写入本地文件地址。
String to_HDFS = "/hdfstest/mergefile"; //定义一个字符串写入上传文件地址。
FileStatus[] inputFiles = local.listStatus(new Path(from_windowsDir)); //返回本地地址到inputfiles中,连接本地。
FSDataOutputStream out = hdfs.create(new Path(to_HDFS)); //返回一个上传地址,连接hdfs,产生新的HDFS文件或写内容。
for(FileStatus file:inputFiles) { //循环读取本地文件
FSDataInputStream in = local.open(file.getPath()); // 提供对本地文件的随机访问方法
byte[] buffer = new byte[256]; //申请一个buffer,大小是256字节。
int bytesRead = 0; //定义一个读取字节等于0。
while((bytesRead = in.read(buffer))>0) { //循环,赋值给读取字节后大于0时,
out.write(buffer,0,bytesRead); //写入字节和读取的字节。
}
in.close(); //结束循环
}
System.out.println("Finish!"); //成功输出Finish!
}
}
注意:
最后两步是创建的文本文件,可能你配置集群的时候没有给予权限,会导致报错。
报错如下:
org.apache.hadoop.security.AccessControlException: org.apache.hadoop.security.AccessControlException: Permission denied: user=DrWho, access=WRITE, inode=“root”:root:supergroup:rwxr-xr-x
解决办法:
在hdfs-site.xml文件中加入下面的代码授予权限,修改之后,重启hadoop进程,即可生效
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
还有就是把你windows的用户名改成hadoop给与相同名字,重启电脑。