### 2.1 实验目的
1. 理解HDFS存在的原因;
2. 理解HDFS体系架构;
3. 理解master/slave架构;
4. 理解为何配置文件里只需指定主服务、无需指定从服务;
5. 理解为何需要客户端节点;
6. 学会逐一启动HDFS和统一启动HDFS;
7. 学会在HDFS中上传文件。
### 2.2 实验要求
要求实验结束时,已构建出以下HDFS集群:
1. master上部署主服务NameNode;
2. Slave1、2、3上部署从服务DataNode;
3. client上部署HDFS客户端。
待集群搭建好后,还需在client上进行下述操作:
1. 在HDFS里新建目录;
2. 将client上某文件上传至HDFS里刚才新建的目录。
### 2.3 实验原理
#### 2.3.1 分布式文件系统
分布式文件系统(Distributed File System)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连。该系统架构于网络之上,势必会引入网络编程的复杂性,因此分布式文件系统比普通磁盘文件系统更为复杂。
#### 2.3.2 HDFS
HDFS(Hadoop Distributed File System)为大数据平台其它所有组件提供了基本的存储功能。它具有高容错、高可靠、可扩展、高吞吐率等特征,为大数据存储和处理提供了强大的底层存储架构。
HDFS是一个主/从(master/slave)体系结构,从最终用户的角度来看,它就像传统的文件系统,可通过目录路径对文件执行CRUD操作。由于其分布式存储的性质,HDFS集群拥有一个NameNode和一些DataNodes,NameNode管理文件系统的元数据,DataNode存储实际的数据。
HDFS开放文件系统的命名空间以便用户以文件形式存储数据,秉承“一次写入、多次读取”的原则。客户端通过NameNode和DataNodes的交互访问文件系统,联系NameNode以获取文件的元数据,而真正的文件I/O操作是直接和DataNode进行交互的。
#### 2.3.3 HDFS基本命令
HDFS基本命令格式如下:
~~~
hadoop fs -cmd args
~~~
其中,cmd为具体的操作,args为参数。
部分HDFS命令示例如下:
~~~
hadoop fs -mkdir /user/trunk #建立目录/user/trunk
hadoop fs -ls /user #查看/user目录下的目录和文件
hadoop fs -lsr /user #递归查看/user目录下的目录和文件
hadoop fs -put test.txt /user/trunk #上传test.txt文件至/user/trunk
hadoop fs -get /user/trunk/test.txt #获取/user/trunk/test.txt文件
hadoop fs -cat /user/trunk/test.txt #查看/user/trunk/test.txt文件内容
hadoop fs -tail /user/trunk/test.txt #查看/user/trunk/test.txt文件的最后1000行
hadoop fs -rm /user/trunk/test.txt #删除/user/trunk/test.txt文件
hadoop fs -help ls #查看ls命令的帮助文档
~~~
#### 2.3.4 HDFS适用场景
HDFS 提供高吞吐量应用程序数据访问功能,适合带有大型数据集的应用程序,以下是一些常用的应用场景:
数据密集型并行计算:数据量极大,但是计算相对简单的并行处理,如大规模Web信息搜索;
计算密集型并行计算:数据量相对不是很大,但是计算较为复杂的并行计算,如3D建模与渲染、气象预报和科学计算;
数据密集与计算密集混合型的并行计算,如3D电影的渲染。
HDFS在使用过程中有以下限制:
HDFS不适合大量小文件的存储,因NameNode将文件系统的元数据存放在内存中,因此存储的文件数目受限于NameNode的内存大小;
HDFS适用于高吞吐量,而不适合低时间延迟的访问;
流式读取的方式,不适合多用户写入一个文件(一个文件同时只能被一个客户端写),以及任意位置写入(不支持随机写);
HDFS更加适合写入一次,读取多次的应用场景。
### 2.4 实验步骤
部署HDFS主要步骤如下:
1. 配置Hadoop的安装环境;
2. 配置Hadoop的配置文件;
3. 启动HDFS服务;
4. 验证HDFS服务可用。
#### 2.4.1 在master服务器上确定存在hadoop安装目录
~~~
[root@master ~]# ls /usr/cstor/hadoop
~~~
显示结果如图2-1所示:
![](https://box.kancloud.cn/27a1461414591469905af37c637cd26f_467x239.png)
#### 2.4.2 确认集群服务器之间可SSH免密登录
使用ssh工具登录到每一台服务器,执行命令ssh 主机名,确认每台集群服务器均可SSH免密登录。若无法SSH免密登录,请参照实验一的1.4.4节进行配置。
#### 2.4.3 修改HDFS配置文件
(1)设置JDK安装目录
~~~
编辑文件“/usr/cstor/hadoop/etc/hadoop/hadoop-env.sh”,找到如下一行:
export JAVA_HOME=${JAVA_HOME}
将这行内容修改为:
export JAVA_HOME=/usr/local/jdk1.7.0_79/
~~~
这里的“/usr/local/jdk1.7.0_79/”就是JDK安装位置,如果不同,请根据实际情况更改。
(2)指定HDFS主节点
编辑文件“/usr/cstor/hadoop/etc/hadoop/core-site.xml”,将如下内容嵌入此文件里最后两行的\<configuration>\\\</configuration>标签之间:
~~~
<property><name>hadoop.tmp.dir</name><value>/usr/cstor/hadoop/cloud</value></property>
<property><name>fs.defaultFS</name><value>hdfs://master:8020</value></property>
~~~
(3)拷贝集群配置至其它服务器
在master机上执行下列命令,将配置好的hadoop拷贝至slaveX、client。
~~~
[root@master ~]# cat ~/data/2/machines
slave1
salve2
slave3
client
[root@master ~]# for x in `cat ~/data/2/machines` ; do echo $x ; scp -r /usr/cstor/hadoop/etc $x:/usr/cstor/hadoop ; done;
~~~
#### 2.4.4 启动HDFS
在master服务器上格式化主节点:
~~~
[root@master ~]# hdfs namenode -format
~~~
配置slaves文件,将localhost修改为slave1~3:
~~~
[root@master ~]# vi /usr/cstor/hadoop/etc/hadoop/slaves
slave1
slave2
slave3
统一启动HDFS:
[root@master ~]#cd /usr/cstor/hadoop
[root@master hadoop]# sbin/start-dfs.sh
~~~
#### 2.4.5 通过查看进程的方式验证HDFS启动成功
分别在master、slave1~3四台机器上执行如下命令,查看HDFS服务是否已启动。
~~~
[root@master sbin]# jps #jps查看java进程
~~~
若启动成功,在master上会看到类似的如下信息:
~~~
6208 NameNode
6862 Jps
6462 SecondaryNameNode
~~~
而在slave1、slave2、slave3上会看到类似的如下信息:
~~~
6208 DataNode
6862 Jps
~~~
#### 2.4.6 使用client上传文件
从client服务器向HDFS上传文件。
~~~
[root@client ~]# hadoop fs -put ~/data/2/machines /
~~~
执行命令:hadoop fs -ls /,查看文件是否上传成功。
如图2-2所示:
![](https://box.kancloud.cn/f2da8d696e1301f9cd74a258c74eda88_275x49.jpg)
- GitHub---资源收集
- 【GitHub】收录总榜单
- 【Office & Markdown & PDF】资源收集
- 【前端】资源收集
- 【开源项目】资源收集
- 【代码备份】资源收集
- 【代码加密】资源收集
- 【好文章推荐】资源收集
- GitHub---实践方案
- 【Laradock】实践方案
- 【开发规范】实践方案
- 【laravel-snappy】实践方案
- 【队列---Laravel-Horizon 】实践方案
- 【检索---Elasticsearch】实践方案---简单了解
- 【Laravel-admin】实践方案
- 技术选型
- 技术选型结果
- PHP开发流程
- Laravel自带异常
- 技术选型问题 & 解决方法
- 修改(Admin)文件夹路径
- 两个用户表合并
- 创建Token,获取接口数据
- CreateFreshApiToken中间件使用
- Generator从表生成文件,不包括迁移文件
- 添加用户的同时生产令牌
- 其它参考文章
- Laravel-admin常见问题
- form(),show()获取对象数据
- Form右上角按钮重写
- form回调中的错误提醒,回调传参
- 【小工具类】实践方案
- 字符串
- 数组
- 无限级分类递归
- 时间
- 正则表达式
- 文件
- 经纬度、时区
- DataEdit快捷操作类库
- 数据库表结构管理
- 【Guzzle】实践方案---工具类
- Java---大数据在线实验
- 基础实验操作
- 【一】基础操作实验
- HDFS
- 【二】部署HDFS
- 【三】读写HDFS文件
- YARN
- 【四】部署YARN集群
- MapReduce
- 【五】单词计数
- Hive
- 【十】部署Hive
- 【十一】新建Hive表
- 【十二】Hive分区
- ZooKeeper
- 【二十】部署ZooKeeper
- 【二十一】进程协作
- HBase
- 【二十二】部署HBase
- 【二十三】新建HBase表
- Storm
- 【二十四】部署Storm
- 【二十五】实时WordCountTopology
- Kafka
- 【二十七】Kafka订阅推送示例
- Redis
- 【二十九】Redis部署与简单使用
- 【三十】MapReduce与Spark读写Redis
- MongoDB
- 【三十一】读写MongoDB
- MySQL
- 关于最重要的参数选项调整建议
- 索引,Explain优化工具
- 事务级别
- sql好的书写习惯
- limit(分页)
- 赶集网Mysql36条军规
- 分库分表技术演进&最佳实践
- MariaDB 和 MySQL 全面对比
- 永远不要在 MySQL 中使用“utf8”
- 看云--推荐的Mysql优化
- 完整、详细的MySQL规范
- 慢查询日志
- pt-query-digest结果分析
- Redis
- 看云-推荐的redis学习
- Memcache和Redis不同
- 阿里云Redis开发规范
- Centos7
- 虚拟机配置网络
- 硬盘挂载、分区、文件大小
- 防火墙(firewalld、firewalld-cmd、systemctl、iptables)
- 两个机器互相拷贝文件
- 查进程、查端口
- 压缩、解压
- 查看物理CPU个数、CPU内核数、线程数
- apt-get源--阿里
- RAID磁盘阵列
- Docker
- Dockerfile制作常用命令
- registry私有仓库
- PHP_7.2
- Dockerfile
- php.ini
- 使用说明
- Nginx_1.15
- Dockerfile
- nginx.conf
- prod_nginx.conf
- 使用说明
- MySql_5.7
- Dockerfile
- my.cnf
- 使用说明
- redmine_3.4
- Dockerfile
- 使用说明
- gitlab-ce_11.9.6-ce.0
- 使用说明
- Redis_5.0
- Dockerfile
- redis.conf
- 使用说明
- Jenkins
- Dockerfile
- 使用说明
- webssh--python3.7
- Dockerfile
- 使用说明
- 进阶使用
- 高阶使用
- minio
- 使用说明
- aws_cloud9_ide
- 使用说明
- VNC
- 使用说明
- jdk1.8——yum安装
- tomcat9——安装
- guacamole——0.9.13
- libreoffice
- Dockerfile
- 使用说明
- Kubernetes
- kubectl常用命令
- 环境搭建(1.9.6)
- kubernetes1.9.6墙内离线部署
- kubernetes1.9.6单机器部署
- helm安装
- helm常用命令
- Swoole
- 环境的搭建
- swoole的简单实例
- 服务端的cli方式运行
- 客户端的运行方式
- 定时任务的入门
- 删除定时任务
- 初始化定时任务
- 日志管理
- 具体任务的异常捕获
- 手动重启shell脚本
- 阅读感受
- 【读书】登天的感觉——岳晓东
- 【读书】为何家会伤人——武志红
- 【感受】箭扣,一次就好
- 【读书】思考与致富——拿破仑-希尔
- 【感受】做事讲方法
- 【感受】未来畅想
- 【素材】智力问答
- 【百家】曾国藩家训
- 【百家】正说和珅
- 【感受】谈判小技巧
- 【读书】股票作手回忆录——利弗莫尔
- 【感受】最幸福的人——工匠
- 【收藏】土味情话大合集
- 【读书】解忧杂货店——东野圭吾
- 【收藏】家乡名人
- 【读书】把时间当作朋友——李笑来
- 【感受】舆论和八卦
- 【读书】老人与海——海明威
- 【读书】必然——凯文凯利
- 【经典】逍遥游——庄周
- Git+PHPStorm+Composer
- Git命令
- .gitignore忽略规则
- PHPStorm第一次使用
- PHPStorm关联gitlab
- Composer修改镜像源
- Xdebug
- PHP进阶
- 缓存在高并发场景下的常见问题
- 一、缓存一致性问题
- 二、缓存并发问题
- 三、缓存穿透问题
- 四、缓存颠簸问题
- 五、缓存的雪崩现象
- 六、缓存无底洞现象
- Laravel源码解析(知识点)
- 闭包、IOC容器服务绑定延迟加载
- 延迟静态绑定基类
- 反射,依赖注入
- __callStatic 魔术方法,Facade 工作原理
- array_reduce,中间件解析
- Eloquent核心
- Laravel框架加载流程
- 线程、进程、协程
- Linux进程、线程、协程
- poll、epoll
- epoll原理
- Liunx线程调度算法
- 红黑树
- 同步/异步、阻塞/非阻塞
- PHP-FPM
- Nginx
- Swoole
- Go
- 惊群问题
- 线程模型比较
- 并发模型比较
- Lua
- OpenResty
- 数据一致性
- 悲观锁--VS--乐观锁
- 事务--mysql VS redis
- 事务嵌套--Doctrine VS Laravel
- 单体应用中执行顺序问题
- 数据一致性问题描述
- 分布式理论
- 数据一致性---接口幂等性
- 分布式事务---2PC VS 3PC
- 分布式事务---TCC
- 分布式事务---基于消息
- 接口安全性
- PHP & Nginx
- 请求超时问题
- 两者之间的通信原理
- TCP三次握手
- Nginx常用优化
- PHP数组底层原理
- PHP排序函数sort底层原理
- PHP函数---trim()
- 树形数据在关系型库中存储
- 标签(Tag)的各种设计