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包。