一.hdfs是什么
概念说明:
Hadoop Distributed File System 是分布式文件系统
特点特征:
高容错和高可用性:提供了文本的存储副本策略,可以实现错误的自检并且快速修复
流式数据访问:采用流式读取,做批量处理,提高吞吐量
弹性存储,支持大规模数据集 : 可以存储大量的数据
简单一致性模型: 实现了一次写,多次读的操作,也是提高了吞吐量
移动计算而非移动数据
协议和接口多样性
多样的数据管理功能
应用场景:
各大电信运营商
中大型互联网公司,如BAT、京东、乐视、美团等
金融银行保险类公司
各大云平台底层存储平台
其他本地系统无法承载存储能力的应用
代码实现:
跟shell操作类似
经典的问题:hdfs读取流文件
public class HdfsFileOperatorUtil {
/** 从HDFS上读取文件 */
public static String readFromFile(String srcFile) throws Exception {
//文件路径的空判断
if (srcFile == null || srcFile.trim().length() == 0) {
throw new Exception("所要读取的源文件" + srcFile + ",不存在,请检查!");
}
//将文件内容转换成字节数组
byte[] byteArray = readFromFileToByteArray(srcFile);
if (byteArray == null || byteArray.length == 0) {
return null;
}
//将utf-8编码的字节数组通过utf-8再进行解码
return new String(byteArray, "utf-8");
}
/**
* 将指定的文件路径从hdfs读取并转换为byte array.
* @param srcFile
* @return
*/
// 加载配置文件到内存对象
static Configuration hadoopConf = new Configuration();
public static byte[] readFromFileToByteArray(String srcFile)
throws Exception {
if (srcFile == null || srcFile.trim().length() == 0) {
throw new Exception("所要读取的源文件" + srcFile + ",不存在,请检查!");
}
//获取hadoopConf对应的hdfs集群的对象引用
FileSystem fs = FileSystem.get(hadoopConf);
//将给定的srcFile构建成一个hdfs的路径对象Path
Path hdfsPath=new Path(srcFile);
FSDataInputStream hdfsInStream = fs.open(hdfsPath);
//初始化一块字节数组缓冲区,大小为65536。缓存每次从流中读取出来的字节数组
byte[] byteArray = new byte[65536];
//初始化字节数输出流, 存放最后的所有字节数组
ByteArrayOutputStream bos = new ByteArrayOutputStream();
// 实际读过来多少
int readLen = 0;
//只要还有流数据能读出来,就一直读下去
while ((readLen = hdfsInStream.read(byteArray)) > 0) {
bos.write(byteArray,0,readLen);
//byteArray = new byte[65536];
}
//读取完成,将hdfs输入流关闭
hdfsInStream.close();
//将之前写到字节输出流中的字节,转换成一个整体的字节数组
byte[] resultByteArray=bos.toByteArray();
bos.close();
return resultByteArray;
}
public static void main(String[] args) throws Exception {
//定义要读入的hdfs的文件路径
String hdfsFilePath = "/tmp/tianliangedu/input.txt";
//将文件从hdfs读取下来,转化成字符串
String result = readFromFile(hdfsFilePath);
//根据题意,将字符串通过命令行输出
System.out.println(result);
}
}
二.hdfs的架构设计:(主从式 master/slave 的体系结构)
角色名称:
该架构是由client ,NameNode,DataNode组成
角色作用/联系:
client:面向client编程,与NameNode,DataNode进行交互,实现了解耦
NameNode:管理文件的元数据,记录文件如何被分成为数据块,并且他们存储在哪些节点上
DataNode:存储实际数据的地方,也是工作节点,根据NameNode发送的指令,进行数据块的读写和检索,并通过心跳机制向NameNode,汇报自己的工作情况,确定是否存活
三.mave仓库的分类
1.本地仓库
默认,自定义
2.中央仓库
3.第三方独立仓库源: 如阿里云
scope 本意是范围,视野
决定jar包在java项目中的声明周期
四.打包插件
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
五.maven依赖的分类
应用依赖:默认走镜像,仓库源
系统依赖:
默认走中央仓库
修改系统以来的配置,使自定义走仓库源
六.经典面试基础题
把文件路径的内容读取成字符串
第一种方法:
1.先给一个路径 String filePath="";
2.创一个文件的对象 File file=new File(filePath);
3.把文件以流的形式读出来 InputStream is = new FileInPutStream(file);
4.转换成字符流 Reader reader= new InPutStreamReader(is,"utf-8");
5. 把字符流准换成缓冲流 BufferReader br= new BufferedReader(reader);
6.给一个默认行开始读
String tempLine=null;
while((tempLine=br.readLine())!=null){
System.out.println(tempLine);
}
7.关闭流 ; 规则 先开的后关 后开的先关
第二种方法:以字节数组缓存的方式读取
以字节数组缓存的方式读取
File file=new File(filePath);
InputStream is = new FileInPutStream(file);
//定义内存的缓存数组
byte[] byteArray=new byte[1024];
//定义一个获取从is中读取的实际字节的大小
int realLength=0;
//定义一个缓存所有字节的大内存块
ByteArrayOutputStream baos=new ByteArrayOutputStream();
//循环读取文件的字节数组,并写入到大内存块中
while((realLength=is.read(byteArry))!=-1){
baos.write(byteArry,0,realLength);
}
//关闭字节流
is.close();
//将大内存块的流转换成一个大的字节数组
byte[] byteArrayTotal=baos.toByteArray();
//关掉流
baos.close();
//将字节数组转换成字符串
String content=new String(byteArrayTotal,"utf-8");
System.out.println(content);
java当中的输入流inputstream和输出流outputstream 的参考对象是谁: 内存
6.1如何阅读java文件
1.先读main函数
2.其次找构造函数
3.最次就是从上往下
6.2maven之package和install有什么区别
package:仅仅是将源码和依赖进行统一打包
install:将项目的本身打成的jar包会拷贝到Maven本地仓库一份
6.3jar包的分类
1.独立运行的jar包-runnable jar
2.被依赖的jar包
七.经典的问题
7.1Hdfs为何要将文件分成block块存储?:
减少系统的io读取的寻址时间,方便更高效的流式读取,提高吞吐量
7.2HDFS block的默认大小? :
在hdfs.sist.xml中的dfs.blocksize为设置block的大小的参数,版本不同,默认值不同
7.3HDFS block块的大小是否可以改变:
可以修改,修改对以前的文件不起作用,也对上传 文件临时修改啊,指定-D dfs.blocksize
7.4一个block块文件是否可以存多个数据:
不可以 一个block最多只存在一个文件的数据,不会跨文件存储
7.5如果一个文件的大小,小于一个blocksize,那么它实际占用多大空间?
文件有多大就占有多大
7.6HDFS block越大越好?还是越小越好?
适中就好 ,越大分块越少 namenode压力越小,并行的处理能力降低
越小的话分块越多,namenode压力越大,寻址时间就,不利于吞吐量.