读书笔记2:Hadoop组件-(1)HDFS的文件操作

1,HDFS文件操作

HDFS是一种文件系统,是专门为MapReduce这类框架下的大规模分布式数据处理而设计的。

文件命令的格式:hadoop fs -cmd <args>

URI:scheme://authority/path

scheme类似于一个协议,可以是file或者hdfs

authority是NameNode的主机名

path是文件或者目录的路径

hdfs://localhost:9000/user/chuck/example.txt在本机的9000端口上以标准伪分布式模型运行HDFS

可以使用cat命令查看文件内容:

Hadoop fs -cat hdfs://localhost:9000/user/chuck/example.t

 

·添加文件和目录

HDFS有一个默认的工作目录user/$USER    (USER是你登录的用户名)

但是这个默认的工作目录需要我们手工建立

hadoop fs -mkdir /user/yourusername (hadoop的mkdir命令自动创建父目录)

查看当前目录或当前目录下的文件:

hadoop fs -ls /        (会显示根目录下的/user的信息)

查看当前目录或当前目录下的文件以及所有子目录、子文件:

hadoop fs -lsr/       (会显示所有的文件和子目录的信息)

将本地文件example.txt复制到HDFS文件系统中:

hadoop fs -put example.txt  . (注意:命令最后的.表示默认放到工作目录)

hadoop fs -put example.txt /user/yourusername    (与上一条命令等价)

·检索文件

将HDFS文件系统中的文件复制到本地的当前工作目录下:

hadoop fs -get example.txt  . 

管道的使用:

hadoop fs -cat example.txt | head

查看文件的最后一千个字节:

hadoop fs -tail example.txt

·删除文件

hadoop fs -rm example.txt      (rm命令还可以用于删除空目录)

·查阅帮助

获取hadoop版本中的命令列表

hadoop fs

查看命令的详细信息:

hadoop fs -help ls

2,编程读写HDFS

例如我们要使用hadoop来操作Apache的日志文件,由于hadoop处理单个大文件相对于处理多个小文件的效率要高,所以我们考虑在将文件向HDFS复制的过程中将其合并,但是hadoop的命令中只有getmerge(把一组HDFS文件复制到本地计算机之前进行合并)    这正好与我们要的反过来,所以我们还是得使用Hadoop API自己编写了:

代码剖析:

Configuration conf = new Configuration();//Configuration 用于保留键/值配置参数的特殊类

FileSystem hdfs = FileSystem.get(conf);

FileSystem local = FileSystem.getLocal(conf);//专用于本地的文件系统的FileSystem对象

Path inputDir = new Path(args[]);//Path用于编制文件和目录名

FileStatus[] inputFiles = local.listStatus(inputDir);//FileStatus存储文件和目录的元数据,listStatus(dir)获取dir目录下的文件列表

FSDataInputStream in = loacl.open(inputFiles[i].getPath());//FSDataInputStream用于访问Path,读取文件

byte buffer[] = new byte[256];

int bytesRead = 0;

while((bytesRead = in.read(buffer))>0)

{

}

in.close();

/*将数据写入HDFS

Path hdfsFile = new Path(args[]);

FSDataOutputStream out = hdfs.create(hdfsFile);//FSDataOutputStream用于将数据写入HDFS

out.write(buffer,0,bytesRead);

out.close();

*/

程序PutMerge.java

public class PutMerge {

public static void main(String args[])

{

String inputString = "";//输入目录

String outputString = "";//输出目录

Configuration conf = new Configuration();

FileSystem hdfs = FileSystem.get(conf);

FileSystem local = FileSystem.getLocal(conf);

//设定输入目录和输出目录

Path inputDir = new Path(inputString);

Path hdfsFile = new Path(outputString)

try{

FileStatus[] inputFiles = local.listStatus(inputDir);//得到本地文件列表

FSDataOutputStream out = hdfs.create(hdfsFile);//生成HDFS输出流

for(int i = 0;i<inputFiles.length;i++)

{

System.out.println(inputFiles[i].getPath().getName());

FSDataInputStream in = loacl.open(inputFiles[i].getPath());//打开本地输入流

byte buffer[] = new byte[256];

int bytesRead = 0;

while((bytesRead = in.read(buffer))>0)

{

out.write(buffer,0,bytesRead);

}

in.close();

}

out.close();

}catch(Exception e)

{

e.printStackTrace();

}

}

}

 

相关推荐