一、大数据概况
(1)大数据的特征(4V)
Volume(大数据量):90% 的数据是过去两年产生
Velocity(速度快):数据增长速度快,时效性高
Variety(多样化):数据种类和来源多样化
结构化数据(表)、半结构化数据(json xml)、非结构化数据(视频 音频 日志文件)
Value(价值密度低):需挖掘获取数据价值
(2)分布式计算:将大数据拆分成小数据进行计算
二、Hadoop生态系统
**Zookeeper:**是一个分布式应用程序协调服务
解决分布式集群中应用系统的一致性问题
提供的功能
配置管理、命名服务、分布式同步、队列管理、集群管理等
hadoop是一个开源分布式系统架构
主要架构为:HDFS 分布式文件存储系统 解决大数据存储 但是其不适合低延迟的数据访问,不适合小文件的存取(解决方法:合并小文件 或者使用hbase)不适合并发写入。文件的随机修改。
HDFS中的角色:
(1)客户端
(2)NameNode 元数据节点
其是一个 管理者 一个集群中只有一个活动的namenode 主要负责管理文件系统命名空间和控制用户的访问
主要功能:提供名称查询功能 保存元数据信息(文件包含哪个块,块包含在哪个块中等)
(3)DataNode数据节点
是文件系统中真正存储数据的地方 一个集群中可以有多个datanode,客户端向namenode发起存储请求,然后去到对应的DataNode上操作数据块
(4)Secondary NameNode (SNN):从元数据节点
合并NameNode的edit logs到fsimage文件中
辅助namenode将内存中元数据信息持久化
HDFS副本机制:
数据块:block
HDFS最基本的存储单元
默认块大小:128M(2.x)
副本机制
作用:避免数据丢失
副本数默认为3
存放机制:
一个在本地机架节点
一个在同一个机架不同节点
一个在不同机架的节点
向hdfs中写入数据:
客户端发送一个请求上传第一个数据块请求给namenode ,namenode收到请求后判断目标路径是否存在 不存在抛异常 存在返回一个存储数据的DataNode列表给客户端(空闲的节点DN1,DN2,DN3),客户端根据获得列表,建立pi’peline,根据路由计算出离得最近的节点 把数据写到这个节点中 ,同时Datanode像这个节点的内存中写,同时传输给下一个datanode进行备份,如图所示,都完成后,回应客户端一个写入成功的响应,完成一个数据块的写操作。其他数据块重复以上步骤
注意:在向datanode中写入数据的时候,一边往内存中写,一边传输给下一个datanode
传输的过程中是以packet形式传输的,一般大小为64kb
而下图中的filesystem 和FSDataOutputStream是hdfs的API 为外界进行写服务的
java代码如下:
public class test{
public static void writeToHdfs(String hdfsFile,String hdfsUrl,String fineName){
Configuration conf=new Configuration();
conf.set("fs.defaultFS",hdfsUrl)
FileSystem fs=FileSystem.get(conf);
if (fs.exits(new Path(hdfsFile))){
FSDataOutputStream fsdos=fs.creat(new Path("hdfsFile"));
FileInputStream fis=new FileInputStream(fileName);
byte[] bytes=new byte[2048];
//首次读
int count=fis.read(bytes,0,2048);
while(count>0){
fsdos.write(bytes.0,2048);
count=fis.read(bytes,0,2048);
}
fis.close();
fsdos.close();
fs.close();
}
}
public static void main(String[] args) {
writeToHdfs(args[0].args[1],args[3]);
}
}
在hdfs中运行此java代码的语句为:
hadoop jar /opt/hadoop/share/hdfstest.jar cn.kgc.hdfs.test /b.txt hdfs://hadoop1:9000 /etc/profile
/opt/hadoop/share/hdfstest.jar
//在hdfs中存放打的上面的java工程的jar包 怎么打jar包,请看作者的另一篇博客
cn.kgc.hdfs.test
//java工程中的此代码的文件路径
/b.txt
//写到hdfs中的b.txt下
hdfs://hadoop1:9000
//连接hdfs的地址
/etc/profile
//本地路径
从hdfs中读文件
客户端发送一个请求下载第一个数据块请求给namenode ,namenode收到请求后判断目标路径是否存在 不存在抛异常 存在返回一个存储数据的DataNode列表给客户端(存有数据的节点DN1,DN2,DN3),客户端根据获得列表,建立pi’peline,根据路由计算出离得最近的节点 下载第一个数据块,完成后,回应客户端一个下载成功的响应,完成一个数据块的读操作。其他数据块重复以上步骤。client对获得数据块进行拼接,获得完整的文件数据。也是通过packet的形式进行传输的。
而下图中的filesystem 和FSDatainputStream是hdfs的API 为外界进行读服务的
java代码如下:
public class testto {
public static void readTohdfs(String hdfsfile ,String hdfsUrl,String filename) throws IOException {
Configuration cfg=new Configuration();
cfg.set("fs.defaultFS",hdfsUrl);
FileSystem fs=FileSystem.get(cfg);
if (fs.exists(new Path(hdfsfile))) {
FileOutputStream fis=new FileOutputStream(filename);
FSDataInputStream fsis = fs.open(new Path(hdfsfile));
byte[] bytes=new byte[2048];
//首次读
int count=fsis.read(bytes,0,2048);
while (count>0){
fis.write(bytes,0,2048);
count=fsis.read(bytes,0,2048);
}
fsis.close();
fis.close();
fs.close();
}
}
public static void main(String[] args) {
readToHdfs(args[0].args[1],args[3]);
}
}
在hdfs中运行此java代码的语句为:
hadoop jar /opt/hadoop/share/testto.jar cn.kgc.test.testto /b.txt hdfs://hadoop1:9000 /data/z.txt
代表的含义如上
通过javaAPI操作hdfs的其他实例:
public class hdfsClient {
//这是一种本地没有hadoop的情况下。创建hdfs的对象
@Test
public void testMkdir() throws URISyntaxException, IOException, InterruptedException {
//创建配置
Configuration conf =new Configuration();
//获取文件系统
//根据远程的NN节点,获取配置信息,创建HDFS对象 用户名(普通用户 需要先给做操作的文件附读写权限)
FileSystem fs=FileSystem.get(new URI("hdfs://192.168.255.105:9000"),conf,"root");
//调用API操作
fs.mkdirs(new Path("/hdfs"));
//关闭文件
fs.close();
}
//上传一个文件
@Test
public void testCopyFromLocal() throws URISyntaxException, IOException, InterruptedException {
//创建配置
Configuration conf =new Configuration();
//获取文件系统
FileSystem fs=FileSystem.get(new URI("hdfs://192.168.255.105:9000"),conf,"root");
fs.copyFromLocalFile(new Path("C:\\Users\\晴儿和小乐子\\Desktop\\mobile.txt"),new Path("/hdfs"));
fs.close();
}
//下载文件
@Test
public void testcopyTolacal() throws URISyntaxException, IOException, InterruptedException {
//创建配置
Configuration conf =new Configuration();
//获取文件系统
FileSystem fs = new Path("hdfs://192.168.255.105:9000").getFileSystem(conf);
//FileSystem fs=FileSystem.get(new URI("hdfs://192.168.255.105:9000"),conf,"root");
fs.copyToLocalFile(false,new Path("/hdfs/mobile.txt"),new Path("I:/"),true);
fs.close();
}
//删除文件
@Test
public void testDelete() throws URISyntaxException, IOException, InterruptedException {
//创建配置
Configuration conf =new Configuration();
//获取文件系统
FileSystem fs=FileSystem.get(new URI("hdfs://192.168.255.105:9000"),conf,"root");
//b代表是否递归删除 true是
fs.delete(new Path("/hdfs"),true);
fs.close();
}
Mapreduce:分布式计算框架 解决大数据的计算
YARN:分布式资源管理系统
特点:
高扩展性,可伸缩
高可靠性
多副本机制,容错高
低成本
无共享架构
灵活,可存储任意类型数据
开源,社区活跃