Hadoop的特点:
扩容能力(Scalable):能可靠地(reliably)存储和处理千兆节点(PB)的数据。
成本低(Economical):可以通过普通机器组成的服务器群来分发以及处理数据。这些服务器群总计可达数千个节点。
高效率(Efficient):通过分发数据,hadoop可以在数据所在的节点上并行地(parallel)处理它们,这使得处理非常的快速。
可靠性(Reliable):hadoop能自动地维护数据的多份副本,并且在任务失败后能自动重新部署(redeploy)计算任务。
单节点物理结构:
HDFS:Hadoop Distributed File System 分布式文件系统
分布式文件管理系统:可以统一管理多台机器上的文件,比较适用于一次写入多次查询的情况,不支持并发写情况,小文件不适合。
特点:
通透性: 让实际上是通过网络来访问文件的动作,由程序与用户看来就像是访问本地的磁盘一般。
容错: 即使系统中有某些节点脱机,整体来说系统仍然可以持续运作而不会有数据损失。
调用文件系统(FS)Shell命令应使用bin/hadoop fs的形式
如:hadoop fs -ls
主从结构:
主节点,只有一个:namenode
从节点,有很多个:datanodes
Namenode负责:
接收用户操作请求
维护文件系统的目录结构
管理文件与block之间关系,block与datanode之间关系
Datanode负责:
存储文件
文件被分成block存储在磁盘上
为保证数据安全,文件会多个副本保存在多个节点
Namenode:是整个文件的管理节点。它维护着整个文件系统的文件目录树,文件/目录的
元信息和每个文件对应的数据块列表。接收用户的操作请求。
hdfs-site.xml的dfs.name.dir属性中操作
文件包括有:
fsimage:元数据镜像文件,存储某一时段NameNode内存元数据信息。
edits:操作日志文件。
fstime:保存最近一次checkpoint的时间。
提供真实文件数据的存储服务。
文件块(block):最基本的存储单位。对于文件内容而言,一个文件的长度大小是size,那么从文件的0偏移开始,按照固定的大小,顺序对文件进行划分并编号,划分好的每一个块称为一个block。HDFS默认Block大小是64MB,以一个256MB文件,共有256/64=4个block。
不同与普通文件系统的是,HDFS中,如果一个文件小于一个数据块的大小,并不占用整个数据块存储空间,(实际使用了多少就占用多少,只不过是划分为size)。
Replication。多副本,默认是三个。想修改在hdfs-site.xml的dfs.replication属性中。
HA的一个解决方案。但不支持热备,配置即可。
执行过程:从NameNode上下载元数据信息(fsimage,edits),然后把二者合并,生成新的fsimage,在本地保存,并将其推送到NameNode,同时重置NameNode的edits。
默认安装在Namenode节点上。但不太安全。
用户代码操作HDFS时,是直接调用FileSystem的子类完成的。
package com.hadoop.hdfs;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.net.URISyntaxException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import org.junit.Before;
import org.junit.Test;
public class HDFSDemo {
private FileSystem fs = null;
public static final String HDFS_PATH = "hdfs://namenode:9000"; //hdfs路径
public static final String DIR_PATH = "/d1000"; //hdfs文件夹路径
public static final String FILE_PATH = "/hello.txt"; //hdfs文件路径
//设置初始化文件 设置hdfs的路径,权限为root
@Before
public void init() throws IOException, URISyntaxException, InterruptedException{
fs = FileSystem.get(new URI("hdfs://namenode:9000"), new Configuration(),"root");
}
//删除文件 在hdfs删除一个文件(或者文件夹)
@Test
public void testDel() throws IllegalArgumentException, IOException{
boolean flag = fs.delete(new Path("/iamkevin"), true);
System.out.println(flag);
}
//创建文件 在hdfs创建一个文件(或者文件夹)
@Test
public void testMkdir() throws IllegalArgumentException, IOException{
boolean flag = fs.mkdirs(new Path("/iamkevin"));
System.out.println(flag);
}
//上传文件 将本地文件上传到hdfs
@Test
public void testUpload() throws IllegalArgumentException, IOException{
//FSDataOutputStream out = fs.create(new Path("hdfs://namenode:9000/track/track_input/"));//hsfd路径上的文件
//FileInputStream in = new FileInputStream(new File("F:/TrackFile/"));//本地文件
//IOUtils.copyBytes(in, out, 2048, true);
Path in = new Path("F:/track_file/");
Path out = new Path("hdfs://namenode:9000/track/");
fs.copyFromLocalFile(false, in, out);
fs.close();
System.out.println("文件上传成功...");
}
//下载文件 将hdfs上的文件下载到本地
@Test
public void downloadData() throws IOException {
FSDataInputStream in = fs.open(new Path(FILE_PATH)); //打开hdfs源文件
FileOutputStream out = new FileOutputStream(new File("C://Users//caonanqing//Desktop//Test"));
IOUtils.copyBytes(in, out, 1024, true); //输出到本地
}
public static void main(String[] args) throws IOException, URISyntaxException {
FileSystem fs = FileSystem.get(new URI("hdfs://cnq:9000"), new Configuration());
InputStream in = fs.open(new Path("/hello"));
FileOutputStream out = new FileOutputStream(new File("C://Users//caonanqing//Desktop//hello.txt"));
//IOUtils.copyBytes(in, System.out, 2048, true); //输出到控制台
IOUtils.copyBytes(in, out, 2048,true);//输出到
}
}
RPC(Remote Procedure Call):远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议,RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据,在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。
RPC采用客户机/服务器模式,请求程序就是一个客户机,而服务提供程序就是一个服务器。首先客户机调用发送一个有进程参数的调用信息到信息进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息的到达为止,当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。
Hadoop的整个体系结构就是构建在RPC之上的。
RPC示例:
public interface Bizable extends VersionedProtocol{
public abstract String hello(String name);
}
class Biz implements Bizable{
@Override
public String hello(String name){
System.out.println("被调用了");
return "hello "+name;
}
@Override
public long getProtocolVersion(String protocol, long clientVersion)
throws IOException {
System.out.println("Biz.getProtocalVersion()="+MyServer.VERSION);
return MyServer.VERSION;
}
}
//服务器
public class MyServer {
public static int PORT = 3242;
public static long VERSION = 23234l;
public static void main(String[] args) throws IOException {
final Server server = RPC.getServer(new Biz(), "127.0.0.1", PORT, new Configuration());
server.start();
}
}
//客户端
public class MyClient {
public static void main(String[] args) throws IOException {
final InetSocketAddress inetSocketAddress = new InetSocketAddress("127.0.0.1", MyServer.PORT);
final Bizable proxy = (Bizable) RPC.getProxy(Bizable.class, MyServer.VERSION, inetSocketAddress, new Configuration());
final String ret = proxy.hello("kevin");
System.out.println(ret);
RPC.stopProxy(proxy);
}
}
RPC的调用流程:
ClientProtocol:是客户端(FileSystem)与NameNode通信的接口。
DatanodeProtocol:是DataNode与NameNode通信的接口。
NamenodeProtocol:是SecondaryNameNode与NameNode通信的接口。
DFSClient:
是直接调用NameNode接口的对象。
用户代码是通过DistributedFileSystem调用DFSClient对象,才能与NameNode打交道。
HDFS:是将客户端的大文件存放在很多节点的数据块中。
NameNode:NameNode的作用是管理文件目录结构,是管理数据节点的。
NameNode维护两套数据,一套是文件目录与数据块之间的关系(数据是静态,放在磁盘上,通过fsimage和edits文件来维护),
另一套是数据块与节点之间的关系(数据是动态,不持久化到磁盘,每当集群启动会自动建立这些信息)
DataNode:DataNode的作用是HDFS中真正存储数据的。
Block:Block本质上是一个逻辑概念,不会真正的存储数据,只是划分文件的。每个Block是64MB
如果不想使用64MB大小,可以在core-site.xml中的dfs.block.size参数覆盖该值(单位字节)
Block划分文件后存放的位置可以在core-default.xml中的dfs.data.dir参数查看,
以"blk_"开头的文件就是存储数据的block,后缀是"meta"的文件就是block的源数据文件,存放一些元数据信息
副本:副本就是备份,目的是为了安全,因为集群环境的不可靠,所有使用副本机制保证数据的安全性。
默认的副本数量为3,在hdfs-default.xml中的dfs.replication参数中设置
SecondaryNameNode:作用是合并NameNode中的edits到fsimage中。
50070端口,查看NameNode状态
50075端口,查看DataNode
50090端口,查看SecondaryNameNode
50030端口,查看JobTracker状态
50060端口,查看TaskTracker
HDFS shell
1.0查看帮助
hadoop fs -help
1.1上传(linux路径,hdfs路径)
hadoop fs -put /hadoop/test/demo.txt /test
1.2下载文件(hdfs路径,linux路径)
hadoop fs -get /test/demo.txt /hadoop/test
1.3查看文件列表
hadoop fs -ls /
1.4递归查看目录结构
hadoop fs -lsr /user
1.5查看文件内容
hadoop fs -cat /hbase-env.sh
1.6统计目录下个文件大小(单位字节)
hadoop fs -du /hbase
1.7汇总统计目录下文件大小
hadoop fs -dus /hbase
1.8统计文件夹数量
hadoop fs -count /usr
1.9移动文件(第一个路径是源文件,第二个路径是目的目录)
hadoop fs -mv /user/root/abc /user
1.10复制文件(第一个路径是源文件,第二个路径是目的目录)
hadoop fs -cp /user/abc /user/root
1.11删除文件/空白文件夹(不能删除非空目录)
hadoop fs -rm /user/abc
1.12递归删除(删除指定目录的所有子目录和文件)
hadoop fs -lsr /user
1.13从本地复制(与put上传一样)
hadoop fs -copyFromLocal /hadoop/test/demo.txt /test
1.14从本地移动(linux路径,hdfs路径)
hadoop fs -moveFromLocal /hadoop/test/demo.txt /test
1.15合并到本地(hdfs路径,linux路径)
hadoop fs -getmerge /hbase abc
1.16查看文件内容(与cat一样)
hadoop fs -text /hbase-env.sh
1.17创建空白文件夹
hadoop fs -mkdir /abc
1.18设置副本数量(副本数默认1改为2,多了一个副本,hdfs会自动执行文件的复制工作,产生新的副本)
hadoop fs -setrep 2 /install.log(文件)
hadoop fs -setrep -R 2 /install.log(文件夹需要加个-R)
hadoop fs -setrep -R -w 2 /install.log(加个-w表示等待副本操作结束才退出命令)
1.19创建空白文件
hadoop fs -touchz /emptyfile
1.20显示文件的统计信息(依次表示文件大小,文件名称,块大小,副本数,访问时间)
hadoop fs -stat '%b %n %o %r %Y' /install.log
1.21查看文件尾部内容
hadoop fs -tail /install.log
1.22修改文件权限
hadoop fs -chmod 755 /emptyfile
1.23修改文件属主
hadoop fs -chown root /emptyfile
1.24修改文件属组
hadoop fs -chgrp supergroup /emptyfile