一.大数据概况
- 1.什么是大数据?
- 大数据是指无法在一定时间内用常规软件工具对其内容进行抓取、管理和处理的数据集合。
- 2.大数据的特征
- 1)4V特征
- Volume(大数据量):90% 的数据是过去两年产生
- Velocity(速度快):数据增长速度快,时效性高
- Variety(多样化):数据种类和来源多样化结构化数据、半结构化数据、非结构化数据
- Value(价值密度低):需挖掘获取数据价值
- 2)固有特征
- 时效性
- 不可变性
- 3.分布式计算
- 分布式计算将较大的数据分成小的部分进行处理。
- 传统分布式计算和Hadoop分布式计算比较如下:
|
传统分布式计算 |
新的分布式计算 - Hadoop |
计算方式 |
将数据复制到计算节点 |
在不同数据节点并行计算 |
可处理数据量 |
小数据量 |
大数据量 |
CPU性能限制 |
受CPU限制较大 |
受单台设备限制小 |
提升计算能力 |
提升单台机器计算能力 |
扩展低成本服务器集群 |
二.Hadoop介绍
1.Hadoop概念
- Hadoop是一个开源分布式系统架构
- 分布式文件系统HDFS——解决大数据存储
- 分布式计算框架MapReduce——解决大数据计算
- 分布式资源管理系统YARN
- 处理海量数据的架构首选
- 非常快得完成大数据计算任务
- 已发展成为一个Hadoop生态圈
2.使用Hadoop原因
- 高扩展性,可伸缩
- 高可靠性 -->多副本机制,容错高
- 低成本
- 无共享架构
- 灵活,可存储任意类型数据
- 开源,社区活跃
3.Hadoop与关系型数据库对比
|
RDBMS |
Hadoop |
格式 |
写数据时要求 |
读数据时要求 |
速度 |
读数据速度快 |
写数据速度快 |
数据监管 |
标准结构化 |
任意结构数据 |
数据处理 |
有限的处理能力 |
强大的处理能力 |
数据类型 |
结构化数据 |
结构化,半结构化,非结构化 |
应用场景 |
交互式OLAP分析,ACID事务处理,企业业务系统 |
处理非结构化数据,海量数据存储计算 |
4.Hadoop生态圈
- Hadoop核心
- HDFS、MapReduce、YARN
- 数据查询分析
- Hive、Pig、Impala、Presto
- 协调管理
- HCatalog、Zookeeper、Ambari
- 数据迁移
- Sqoop、Flume
- Spark、NoSQL、机器学习、任务调度等
5.Zookeeper
- 是一个分布式应用程序协调服务
- 解决分布式集群中应用系统的一致性问题
- 提供的功能
- 配置管理、命名服务、分布式同步、队列管理、集群管理等
- 特性
- 全局数据一致
- 可靠性、顺序性、实时性
- 数据更新原子性
- Zookeeper集群
- 角色:Leader、Follower、Observer
6.Hadoop架构
- HDFS(Hadoop Distributed File System)
- 分布式文件系统,解决分布式存储
- MapReduce
- 分布式计算框架
- YARN
- 分布式资源管理系统
- 在Hadoop 2.x中引入
- Common
- 支持所有其他模块的公共工具程序
7.HDFS特点
- HDFS优点
- 支持处理超大文件
- 可运行在廉价机器上
- 高容错性
- 流式文件写入
- HDFS缺点
- 不适合低延时数据访问场景
- 不适合小文件存取场景
- 不适合并发写入,文件随机修改场景
8.HDFS CLI (command line)
- 基本格式
- hdfs dfs -cmd
- hadoop fs -cmd(已过时)
- 命令和Linux相似
- -ls 查看
- -mkdir 创建目录
- -put 将本地文件传输到hdfs目录下
- -rm 删除
- -du 统计目录下文件大小
- -get 将hdfs文件copy到本地文件
- -help 帮助
- hdfs dfsadmin 命令用于管理HDFS集群,说明如下:
命令 |
说明 |
hdfs dfsadmin -report |
返回集群的状态信息 |
hdfs dfsadmin -safemode enter/leave |
进入和离开安全模式 |
hdfs dfsadmin -saveNamespace |
保存集群的名字空间 |
hdfs dfsadmin -rollEdits |
回滚编辑日志 |
hdfs dfsadmin -refreshNodes |
刷新节点 |
hdfs dfsadmin -getDatanodeInfo node1:8010 |
获取数据节点信息 |
hdfs dfsadmin -setQuota 10 /hdfs |
设置文件目录配额 |
三.详解HDFS分布式存储文件系统
1.HDFS角色
- Client:客户端
- NameNode (NN):元数据节点
- 管理文件系统的Namespace/元数据
- 一个HDFS集群只有一个Active的NN
- DataNode (DN):数据节点
- 数据存储节点,保存和检索Block
- 一个集群可以有多个数据节点
- Secondary NameNode (SNN):从元数据节点
- 合并NameNode的edit logs到fsimage文件中
- 辅助NN将内存中元数据信息持久化
2.HDFS副本机制
- Block:数据块
- HDFS最基本的存储单元
- 默认块大小:128M(2.x)
- 副本机制
- 作用:避免数据丢失
- 副本数默认为3
- 存放机制:
- 一个在本地机架节点
- 一个在同一个机架不同节点HDFS高可用(High Availability)
- 一个在不同机架的节点
3.HDFS高可用(High Availability)
- 在1.x版本中
- 存在Namenode单点问题
- 在2.x版本中
- 解决:HDFS Federation方式,共享DN资源
- Active Namenode -->对外提供服务
- Standby Namenode 是NameNode的备用节点
- Active故障时可切换为Active
4.HDFS文件格式
- HDFS支持以不同格式存储所有类型的文件
- 文本、二进制
- 未压缩、压缩
- 为了最佳的Map-Reduce处理,文件需可分割
- SequenceFile
- Avro File
- RCFile&ORCFile
- Parquet File
四.使用java实现HDFS文件读写(实质是hadoop所在系统和hdfs文件系统之间读写操作)
- 1.先建一个maven项目
- 2.在pom.xml文件的依赖包标签<dependencies>下添加如下内容,等几分钟下载相关的依赖包:
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.6.0</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>2.6.0</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.6.0</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-mapreduce-client-core</artifactId>
<version>2.6.0</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
package HDFS.hdfs;
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 java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class WriteToLocal {
public static void writeToHdfs(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 fos = new FileOutputStream(fileName);
FSDataInputStream fsdis = fs.open(new Path(hdfsFile));
byte[] bytes=new byte[2048];
int count=fsdis.read(bytes,0,2048);
while (count>0){
fos.write(bytes,0,count);
count=fsdis.read(bytes,0,2048);
}
fsdis.close();
fos.close();
fs.close();
}
}
public static void main(String[] args) throws IOException {
writeToHdfs(args[0],args[1],args[2]);
}
}
package HDFS.hdfs;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import java.io.FileInputStream;
import java.io.IOException;
public class WriteToHdfs {
public static void writeToHdfs(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))) {
FSDataOutputStream fsdos = fs.create(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,count);
count=fis.read(bytes,0,2048);
}
fis.close();
fsdos.close();
fs.close();
}
}
public static void main(String[] args) throws IOException {
writeToHdfs(args[0],args[1],args[2]);
}
}
- 4.打jar包,将jar包传输到hadoop安装目录的share目录下,如下图:
- 5.启动hadoop的hdfs服务,执行
hdfs dfs -touchz /c.txt
,在hdfs文件系统中创建一个空文件
- 6.在hadoop环境执行如下命令,向hdfs文件系统中写入文件(从本地读一个文件):
hadoop jar /opt/install/hadoop/share/HDFS_Practice.jar HDFS.hdfs.WriteToHdfs /c.txt hdfs://hadoop110:9000 /etc/profile
- 7.若执行无错误,查看内容:
hdfs dfs -cat /c.txt
,效果如下:
- 8.在Hadoop环境执行如下命令,向本地写入文件(从hdfs读一个文件):
hadoop jar /opt/install/hadoop/share/HDFS_Practice.jar HDFS.hdfs.WriteToLocal /c.txt hdfs://hadoop110:9000 a.txt
- 9.若执行无错误,查看内容:
cat a.txt
,效果如下: