🛴这篇文章咱们就来讲讲如何安装HDFS

HDFS 概述

  1. 分布式
  2. commodity hardware
  3. fault-tolerant 容错
  4. high throughput
  5. 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 的架构

  1. NameNode(master) and DataNodes(slave)
  2. master/slave 的架构
  3. NN:
  • the file system namespace
    • /home/hadoop/software
    • /home/hadoop/app
    • regulates access to files by clients
  1. DN:storage

  2. HDFS exposes a file system namespace and allows user data to be stored in files.

  3. a file is split into one or more blocks

    • blocksize: 128M
    • 150M 拆成 2 个 block
  4. blocks are stored in a set of DataNodes

    • 为什么? 容错!!!
  5. NameNode executes file system namespace operations:CRUD

  6. 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
      _ 这个过程对于用户来说是不感知的

  7. 通常情况下: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
    • 创建课程中所需要的目录(合适的文件存放在合适的目录)
      1. [hadoop@hadoop000 ~]$ mkdir software 存放课程所使用的软件安装包 2. [hadoop@hadoop000 ~]$ mkdir app 存放课程所有软件的安装目录
      2. [hadoop@hadoop000 ~]$ mkdir data 存放课程中使用的数据 4. [hadoop@hadoop000 ~]$ mkdir lib 存放课程中开发过的作业jar存放的目录
      3. [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=JAVAHOME/bin:JAVA_HOME/bin: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
      _ 启动集群:HADOOPHOME/sbin/startdfs.sh:1.[hadoop@hadoop000sbin]HADOOP_HOME/sbin/start-dfs.sh * 验证: 1. [hadoop@hadoop000 sbin] 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. 进制防火墙开机启动:

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 常用命令:

    1. hadoop fs -ls /
    2. hadoop fs -put
    3. hadoop fs -copyFromLocal
    4. hadoop fs -moveFromLocal
    5. hadoop fs -cat
    6. hadoop fs -text
    7. hadoop fs -get
    8. hadoop fs -mkdir
    9. hadoop fs -mv 移动/改名
    10. hadoop fs -getmerge
    11. hadoop fs -rm
    12. hadoop fs -rmdir
    13. 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 进行操作

目的

  1. 掌握 HDFS API 的操作
  2. 通过这个案例,让你们对于后续要学习的 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