HDFS文件系统基本操作-Hadoop实践

操作流程

1.启动Hadoop

2.导入相关的jar包

右键项目属性,选择Property,在弹出的对话框左侧列表中选择Java Build Path,如下图所示:选择Add External JARs,就可以逐个(也可以选择多个,但是限制在同一个文件夹中)添加第三方引用jar包。

3.调用Java Api进行编程

3.1检查文件是否存在

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class HDFSFileIfExist {
    public static void main(String[] args){
        try{
            String fileName = "test";
            Configuration conf = new Configuration();//创建环境
            conf.set("fs.defaultFS", "hdfs://localhost:9000");//加载环境
            conf.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem");
            FileSystem fs = FileSystem.get(conf);//封装DistributedFileSystem对象
            if(fs.exists(new Path(fileName))){ //相对路径
                System.out.println("文件存在");
            }else{
                System.out.println("文件不存在");
            }
 
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

2.写操作

        import org.apache.hadoop.conf.Configuration;  
        import org.apache.hadoop.fs.FileSystem;
        import org.apache.hadoop.fs.FSDataOutputStream;
        import org.apache.hadoop.fs.Path;
 
        public class Chapter3 {    
                public static void main(String[] args) { 
                        try {
                                Configuration conf = new Configuration();  
                                conf.set("fs.defaultFS","hdfs://localhost:9000");
                                conf.set("fs.hdfs.impl","org.apache.hadoop.hdfs.DistributedFileSystem");
                                FileSystem fs = FileSystem.get(conf);//创建对象
                                byte[] buff = "Hello world".getBytes(); // 要写入的内容
                                String filename = "test"; //要写入的文件名
                                FSDataOutputStream os = fs.create(new Path(filename)); //创建输出流(流水线写入)
                                os.write(buff,0,buff.length);//执行写入操作
                                System.out.println("Create:"+ filename);
                                os.close();//关闭连接
                                fs.close();//关闭文件对象
                        } catch (Exception e) {  
                                e.printStackTrace();  
                        }  
                }  
        }

3.读操作

        import java.io.BufferedReader;
        import java.io.InputStreamReader;
 
        import org.apache.hadoop.conf.Configuration;
        import org.apache.hadoop.fs.FileSystem;
        import org.apache.hadoop.fs.Path;
        import org.apache.hadoop.fs.FSDataInputStream;
 
        public class Chapter3 {
                public static void main(String[] args) {
                        try {
                                Configuration conf = new Configuration();
                                conf.set("fs.defaultFS","hdfs://localhost:9000");
                                conf.set("fs.hdfs.impl","org.apache.hadoop.hdfs.DistributedFileSystem");
                                FileSystem fs = FileSystem.get(conf);
                                Path file = new Path("test"); 
                                FSDataInputStream getIt = fs.open(file);//打开文件并加入输入流
                                BufferedReader d = new BufferedReader(new InputStreamReader(getIt));//文件读入缓存
                                String content = d.readLine(); //读取文件一行
                                System.out.println(content);
                                d.close(); //关闭文件
                                fs.close(); //关闭hdfs
                        } catch (Exception e) {
                                e.printStackTrace();
                        }
                }
        }

基础知识补充

大数据两大核心技术:分布式存储 分布式处理
云计算特征;多租户 虚拟化
物联网关键技术:识别技术 感知技术

Hadoop两大核心:HDFS MapReduce
HDFS核心节点:NameNode:目录服务器(管理元数据,直接保存至内存) DataNode:数据存储节点
MapReduce两大核心组件:JobTracker,作业拆分;TaskTracker,作业执行
Secondary Namenode,是NameNode的冷备份

HDFS
实现目标:兼容廉价的硬件设备 实现流数据读写 支持大数据集 支持简单的文件模型 强大的跨平台兼容性
自身局限性:不适合低延迟数据访问 无法高效存储大量小文件 不支持多用户写入及任意修改文件 
块的设计:64MB,但不能过大,受到MapReduce的限制
优点:支持大规模文件存储 简化系统设计(存储需求) 数据备份
名称节点(主节点):数据目录,存储元数据
结构:FsImage保存系统文件树 EditLog数据信息的修改
第二节点,冷备份,定期取出EditLog进行FsImage和旧的EditLog合并形成新的FsImage,节点此时拥有新的EditLog
数据节点:实际数据存取
元数据:文件是什么 文件被分成多少块 每个块和文件如何映射 每个块被存储在哪个服务器上
命名空间:目录 文件 块
协议:TCP/IP协议(客户端-名称节点) RPC(客户端-数据节点)
HDFS存储原理:
数据冗余保存(系统备份)
数据存放:第一副本放置原则,CUP不太忙,磁盘不太满(外部读写);该数据节点上(内部读写)
第二副本:与第一副本不同的机架上;第三副本:与第一副本相同的机架上
数据读取:就近读取(API确定ID)
数据错误与恢复
名称节点出错:暂停服务,从第二节点处恢复
数据节点出错:远程调用发送心跳信息,出错标记为宕机,然后从备份中再复制一份
数据出错:校验码校验(同时读数据和校验码,进行二者检验)
读过程
1.定义Configuration环境
2.打开文件,加载hdfs-site.xml core-site.xml,定义一个FileSystem实例(封装了一个DFSFileSystem实例)
3.读取请求,(返回一个输入流DFSInputStream) 
4.从名称节点获取数据块信息,ClientProtocal.getBlocations()
5.读取数据,从数据节点选择最近的节点
6.关闭对该节点的链接
7.循环4-6步直至全部数据读取完成
8.关闭文件
写过程
1.创建文件请求,实例化一个fs对象
2.RPC执行远程调用,与名称节点沟通,创建文件
3.输出流写入数据(流水线复制)
4.向数据节点写入数据包
5.接收确认包,由最后一个数据节点向前传递
6.关闭文件

编程实践
Shell方式
cd /usr/local/hadoop
./bin/hdfs namenode -format #格式化hadoop的hdfs文件系统
./sbin/start-dfs.sh #启动hadoop
hadoop fs(本机+HDFS) dfs(只能用于HDFS文件系统)
hadoop fs ls(显示指定文件详细信息) mkdir(创建相关文件夹) cat(指定文件内容到标准输出)
本地文件复制到HDFS中:-cp 本地文件路径 hdfs路径
Web方式
http://localhost:50070

常见报错

原因:jar包未导入完全

为了编写一个能够与HDFS交互的Java应用程序,一般需要向Java工程中添加以下JAR包:
(1)”/usr/local/hadoop/share/hadoop/common”目录下的hadoop-common-2.7.1.jar和haoop-nfs-2.7.1.jar;
(2)/usr/local/hadoop/share/hadoop/common/lib”目录下的所有JAR包;
(3)“/usr/local/hadoop/share/hadoop/hdfs”目录下的haoop-hdfs-2.7.1.jar和haoop-hdfs-nfs-2.7.1.jar;
(4)“/usr/local/hadoop/share/hadoop/hdfs/lib”目录下的所有JAR包。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章