🛴这篇文章咱们就来讲讲如何安装HDFS
HDFS 概述
- 分布式
- commodity hardware
- fault-tolerant 容错
- high throughput
- large data sets
HDFS 是一个分布式的文件系统
- 文件系统:Linux、Windows、Mac....
- 目录结构: C /
- 存放的是文件或者文件夹
- 对外提供服务:创建、修改、删除、查看、移动等等
- 普通文件系统 vs 分布式文件系统
- 单机
- 分布式文件系统能够横跨 N 个机器
HDFS 前提和设计目标
- Hardware Failure 硬件错误
- 每个机器只存储文件的部分数据,blocksize=128M
- block 存放在不同的机器上的,由于容错,HDFS 默认采用 3 副本机制
- Streaming Data Access 流式数据访问
- The emphasis is on high throughput of data access
- rather than low latency of data access.
- Large Data Sets 大规模数据集
- Moving Computation is Cheaper than Moving Data 移动计算比移动数据更划算
HDFS 的架构
- NameNode(master) and DataNodes(slave)
- master/slave 的架构
- NN:
- the file system namespace
- /home/hadoop/software
- /home/hadoop/app
- regulates access to files by clients
-
DN:storage
-
HDFS exposes a file system namespace and allows user data to be stored in files.
-
a file is split into one or more blocks
- blocksize: 128M
- 150M 拆成 2 个 block
-
blocks are stored in a set of DataNodes
- 为什么? 容错!!!
-
NameNode executes file system namespace operations:CRUD
-
determines the mapping of blocks to DataNodes
-
a.txt 150M blocksize=128M
-
a.txt 拆分成 2 个 block 一个是 block1:128M 另一个是 block2:22M
block1 存放在哪个 DN?block2 存放在哪个 DN? -
a.txt
_ block1:128M, 192.168.199.1
_ block2:22M, 192.168.199.2
_ get a.txt
_ 这个过程对于用户来说是不感知的
-
-
通常情况下:1 个 Node 部署一个组件
课程环境介绍:
本课程录制的系统是 Mac,所以我采用的 linux 客户端是 mac 自带的 shell
- 如果你们是 win:xshell、crt
- 服务器/linux 地址:192.168.199.233
- 连接到 linux 环境
_ 登陆:ssh hadoop@192.168.199.233
_ 登陆成功以后:[hadoop@hadoop000 ~]$- linux机器:用户名hadoop、密码123456、hostname是* * hadoop000
- 创建课程中所需要的目录(合适的文件存放在合适的目录)
- [hadoop@hadoop000 ~]$ mkdir software 存放课程所使用的软件安装包 2. [hadoop@hadoop000 ~]$ mkdir app 存放课程所有软件的安装目录
- [hadoop@hadoop000 ~]$ mkdir data 存放课程中使用的数据 4. [hadoop@hadoop000 ~]$ mkdir lib 存放课程中开发过的作业jar存放的目录
- [hadoop@hadoop000 ~]$ mkdir shell 存放课程中相关的脚本 6. [hadoop@hadoop000 ~]$ mkdir maven_resp 存放课程中使用到的 maven 依赖包存放的目录
- 学员问:root 密码 1. 切换 hadoop 到 root 用户:[hadoop@hadoop000 ~]$ sudo -i 2. 切换 root 到 hadoop 用户:[root@hadoop000 ~]# su hadoop 3. 我 OOTB 环境中创建的 hadoop 用户是有 sudo 权限:sudo vi /etc/hosts
- Linux 版本: * 以前的课程是 centos6.4,本次课程升级成 centos7
Hadoop 环境搭建
- 使用的 Hadoop 相关版本:CDH
- CDH 相关软件包下载地址:http://archive.cloudera.com/cdh5/cdh/5/
- Hadoop 使用版本:hadoop-2.6.0-cdh5.15.1
- Hadoop 下载:wget http://archive.cloudera.com/cdh5/cdh/5/hadoop-2.6.0-cdh5.15.1.tar.gz
- Hive 使用版本:hive-1.1.0-cdh5.15.1
Hadoop/Hive/Spark 相关框架的学习:
-
使用单机版足够
-
如果使用集群学习会导致:从入门到放弃
-
使用 Linux/Mac 学习
-
一定不要使用 Windows 搭建 Hadoop 环境
-
所以 Linux 基础是要会的
Hadoop 安装前置要求
- Java 1.8+
- ssh
安装 Java
- 拷贝本地软件包到服务器:scp jdk-8u91-linux-x64.tar.gz hadoop@192.168.199.233:~/software/
- 解压 jdk 到~/app/:tar -zvxf jdk-8u91-linux-x64.tar.gz -C ~/app/
- 把 jdk 配置系统环境变量中: ~/.bash_profile - export JAVA_HOME=/home/hadoop/app/jdk1.8.0_91 - export PATH=PATH
- 使得配置修改生效:source .bash_profile
- 验证:java -version
安装 ssh 无密码登陆
-
ls
-
ls -a
-
ls -la 并没有发现一个.ssh 的文件夹
-
ssh-keygen -t rsa 一路回车
-
cd ~/.ssh
-
[hadoop@hadoop000 .ssh]$ ll
-
总用量 12
-rw------- 1 hadoop hadoop 1679 10月 15 02:54 id_rsa 私钥 -rw-r--r-- 1 hadoop hadoop 398 10月 15 02:54 id_rsa.pub 公钥 -rw-r--r-- 1 hadoop hadoop 358 10月 15 02:54 known_hosts cat id_rsa.pub >> authorized_keys chmod 600 authorized_keys
Hadoop(HDFS)安装
-
下载
_ 解压:~/app
_ 添加 HADOOP_HOME/bin 到系统环境变量
_ 修改 Hadoop 配置文件# hadoop-env.sh export JAVA_HOME=/home/hadoop/app/jdk1.8.0_91
_ core-site.xml
<property> <name>fs.defaultFS</name> <value>hdfs://hadoop000:8020</value> </property> hdfs-site.xml <property> <name>dfs.replication</name> <value>1</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/home/hadoop/app/tmp</value> </property>
- slaves
_ hadoop000
_ 启动 HDFS:
_ 第一次执行的时候一定要格式化文件系统,不要重复执行: hdfs namenode -format
_ 启动集群: jps 2. 60002 DataNode 3. 60171 SecondaryNameNode 4. 59870 NameNode 5. http://192.168.199.233:50070 6. 如果发现 jps ok,但是浏览器不 OK? 十有八九是防火墙问题 7. 查看防火墙状态:sudo firewall-cmd --state 8. 关闭防火墙: sudo systemctl stop firewalld.service 9. 进制防火墙开机启动:
- slaves
hadoop 软件包常见目录说明
- bin:hadoop 客户端名单
- etc/hadoop:hadoop 相关的配置文件存放目录
- sbin:启动 hadoop 相关进程的脚本
- share:常用例子
注意:
-
start/stop-dfs.sh 与 hadoop-daemons.sh 的关系
-
start-dfs.sh
hadoop-daemons.sh start namenode hadoop-daemons.sh start datanode hadoop-daemons.sh start secondarynamenode
-
stop-dfs.sh =
-
hadoop 常用命令:
- hadoop fs -ls /
- hadoop fs -put
- hadoop fs -copyFromLocal
- hadoop fs -moveFromLocal
- hadoop fs -cat
- hadoop fs -text
- hadoop fs -get
- hadoop fs -mkdir
- hadoop fs -mv 移动/改名
- hadoop fs -getmerge
- hadoop fs -rm
- hadoop fs -rmdir
- hadoop fs -rm -r
HDFS 存储扩展:
- put: 1file ==> 1...n block ==> 存放在不同的节点上的
- get: 去 nn 上查找这个 file 对应的元数据信息
- 了解底层的存储机制这才是我们真正要学习的东西,掌握 API 那是毛毛雨
使用 HDFS API 的方式来操作 HDFS 文件系统
- IDEA/Eclipse
- Java
- 使用 Maven 来管理项目
- 拷贝 jar 包
- 我的所有课程都是使用 maven 来进行管理的
Caused by: org.apache.hadoop.ipc.RemoteException
(org.apache.hadoop.security.AccessControlException):
Permission denied: user=rocky, access=WRITE,
inode="/":hadoop:supergroup:drwxr-xr-x
HDFS 操作:shell + Java API
- 综合性的 HDFS 实战:使用 HDFS Java API 才完成 HDFS 文件系统上的文件的词频统计
- 词频统计:wordcount
- /path/1.txt
- hello world hello
- /path/2.txt
- hello world hello
- ==> (hello,4) (world,2)
- 将统计完的结果输出到 HDFS 上去。
假设:有的小伙伴了解过 mr、spark 等等,觉得这个操作很简单
本实战的要求:只允许使用 HDFS API 进行操作
目的
- 掌握 HDFS API 的操作
- 通过这个案例,让你们对于后续要学习的 mr 有一个比较好的认识
硬编码 : 非常忌讳的
==> 可配置
可插拔的开发/管理方式 plugin
副本摆放策略
-
1-本 rack 的一个节点上
-
2-另外一个 rack 的节点上
-
3-与 2 相同的 rack 的另外一个节点上
-
1-本 rack 的一个节点上
-
2-本 rack 的另外一个节点上
-
3-不同 rack 的一个节点上
HDFS 的元数据管理
- 元数据:HDFS 的目录结构以及每个文件的 BLOCK 信息(id,副本系数、block 存放在哪个 DN 上)
- 存在什么地方:对应配置 ${hadoop.tmp.dir}/name/......
- 元数据存放在文件中:
/test1
/test1/a.txt
/test2
/test2/1.txt
/test2/2.txt