1Hadoop核心组件与应用
HDFS:分布式海量数据存储功能
Yarn:提供资源调度与任务管理功能
资源调度:根据申请的计算任务,合理分配集群中的计算节点
任务管理:任务在执行过程中,负责过程监控,状态反馈,任务在调度等工作
MapReduce:分布式并行编程模型和计算框架
Hive:提供数据摘要和查询的数据仓
Streaming:解决非Java开发人员使用Hadoop平台语言的问题
Hbase:基于列式存储模型的分布式数据库
Zookeeper:分布式协同服务
2Hadoop生态圈
3Ambari平台环境介绍
1) Apache Ambari是一种基于Web的工具,支持Apache Hadoop集群的供应、管理和监控。同类产品为Cloudera Manager的CDH
2)优点:
Web安装图形界面操作便捷
Hadoop家族各组件支持全面
社区资源比较丰富
3)缺点
Bug较多:安装过程中,莫名其妙的出现错误。系统运维过程中偶尔出错。以上两种情况重启就正常。
安装速度与网络质量关系较大,往往时间较长。
在合理避免大坑的情况下,3小时内可以搭建一个基本版的集群。
分布式文件系统HDFS
1特点介绍
a高容错和高可用性,硬件错误是常态而不是异常
b流式数据访问
c弹性存储,支持大规模数据集
d简单一致性模型
e移动计算而非移动数据
f协议和接口多样性
h 多样的数据管理功能
2、应用场景
- 各大电信运营商
- 中大型互联网公司,如BAT、京东、乐视、美团等
- 金融银行保险类公司
- 各大云平台底层存储平台
- 其他本地系统无法承载存储能力的应用
- HDFS架构设计(理解为主)
1HDFS(Hadoop Distributed File System )Hadoop分布式文件系统。
2 HDFS 组件角色
2.1NameNode(简称NN)HDFS元数据管理者,管理NameSpace. NameSpace 或其本身属性的任何更改都由NameNode记录
2.2 DataNode(简称DN) DataNode是文件系统的工作节点 。 通过心跳机制定期向NameNode发送他们的存储块的列表
2.3Client
- 客户端Client代表用户与NameNode或者DataNode交互来访问整个文件系统的对象。
开发人员面向Client API来编程实现,对NameNode、DataNode来说透明无感
3、HDFS架构设计
3.1基本架构
HDFS是一个主从式(Master/Slave)的体系结构。HDFS集群中有一个NameNode和一些DataNodes,
NameNode管理文件的元数据,DataNode存储实际的数据。从用户的角度看,就像操作传统的文件系统一样,可以通过目录路径对文件执行创建、读取、删除操作。客户端联系NameNode来获取元数据信息,而真正的文件I/O是直接和DataNode进行交互的
3.2读文件流程
详细步骤:
- 第一步:Client向NameNode发送数据请求后,寻找数据对应的数据块的位置信息。
- 第二步:NameNode返回文件对应的数据块元数据信息,如所属机器、数据块的block_id、数据块的先后顺序等。
- 第三步:由Client与DataNode直接通信,读取各个block数据块的信息。过程为并行读取,由客户端合并数据。
写文件流程
详细步骤:
- 第一步:
- Client向NameNode发送写数据请求后,寻找可以写入的数据块block信息的机器位置。
- 若文件过大,写入可能会分成很多block数据块,实际上是通过一个block一个block的申请。
- 若副本为3,则每次请求后返回一个block的对应的3个副本的block的存放位置。
- 第二步:
- Client获取到对应的block数据块所处的DataNode节点位置后,Client开始写操作。
- Client先写入第一个DataNode,以数据包package的方式逐个发送和接收。如64K大小的package包大小来发送和接收。
- 存在多个副本时,package包的写入是依次进行的。写入到第一个DataNode后,第一个向第二个DataNode传输。第二个写完后,由第二个向第三个DataNode传输package。以此类推。
- 写完一个block数据块后,如果还有则反复进行第一步和第二步。
- 第三步:
- 待所有的数据块block均写完后,Client接收到全部写完的ack答复,告诉NameNode数据已写完,Client关闭socket流。
- DataNode也会向NameNode报告新增block数据块的信息。
三 HDFS高可用性措施
1、冗余备份
2、跨机架副本存放
3、心跳检测
4、数据完整性检测
5、安全模式
6、核心文件备份
7、空间回收
HDFS shell 应用
2常用命令
-
- 查看hdfs dfs下的所有可用命令: hads dfs
2 查看hdfs 根目录下的文件列表: hdfs dfs -ls/
3 查看某文本文件的内容: hdfs dfs -cat /tmp/index.html
4 在hdfs 中创建目录 hdfs dfs -mkdif /tmp/目录
5删除 hdfs dfs -rm -r /目录
6 将hdfs 中文件下载到本地文件的当前路径: hdfs dfs -copyTolacal /文件
7从本地上传文件到hdfs : hdfs dfs -copyFromLocal 文件 /地址
8 查看压缩文本文件的格式: hdfs dfs -text /tmp/tianliang/index.html.gz | more
9 查看hdfs 中目录文件站磁盘大小 : hdfs dfs -du -h /文件
10创建文件 :hdfs dfs -touchz /文件
11查看命令帮助信息,如cp : hdfs dfs -usage cp
3 hdfs dfsadmin
hdfs dfsadmin是集群管理员的常用命令,用来对HDFS集群的整体运行进行管理和运维。常用的管理命令如下
1查看可用的管理命令:hdfs dfsadmin -help
2报告文件系统的基本信息和统计信息 :hdfs dfsadmin -report
3设置目录配额
-
- 设置目录配额,目录配额是一个长整型数,限定指定目录下的名字个数:
- hdfs dfsadmin -setQuota <quota> <dirname>……<dirname>
- 比如:hdfs dfsadmin -setQuota 10 /tmp/tianliangedu
4安全模式管理
-
- hdfs dfsadmin -safemode get ##返回安全模式是否开启的信息,返回Safe mode is OFF/OPEN
- hdfs dfsadmin -safemode enter ##进入安全模式
- hdfs dfsadmin -safemode leave ##强制NameNode退出安全模式
- hdfs dfsadmin -safemode wait ##等待,一直到安全模式结束
HDFS JAVA API应用
1
2操作实现
1搭建Maven
2Pom依赖引用
<dependencies>
<!-- 引入hadoop-cli-2.7.4依赖 -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.7.4</version>
<scope>provided</scope>
</dependency>
<build>
<finalName>TlHadoopCore</finalName>
<plugins>
<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>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>com.tl.job009.hdfs.HdfsFileRead</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>assembly</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
3编码实现
1定义读取文件的路径
2创建hdfs配置
3打开创建FileSystem 对hdfs的抽象
4创建一个Path 对文件的引用
5FileSystem 打开输入流
6 将输入流的字节数组都读取出来
7将字节数组都转化成字符串输出
4本地运行
5打包上传