• Hadoop 入门


    Hadoop 组成

    图片

    HDFS 架构

    • NameNode(nn) 存储文件的元数据,如文件名、文件目录结构、文件属性(生成时间、副本数、文件权限),以及每个文件的块列表和块所在的 DataNode 等。
    • DataNode(dn) 在本地文件系统存储文件快数据,以及块数据的校验和。
    • Secondary NameNode(2nn) 用来监控 HDFS 状态的辅助后台程序,每隔一段时间获取 HDFS 元数据的快照。

    image

    YARN 架构

    • ResouceManager(RM)
      • 处理客户端请求
      • 监控 NodeManager
      • 启动或监控 ApplicationMaster
      • 资源的分配与调度
    • NodeManager(NM)
      • 管理单个节点上的资源
      • 处理来自 ResouceManager 的命令
      • 处理来自 ApplicationMaster 的命令
    • ApplicationMaster(AM)
      • 负责数据的切分
      • 为应用程序申请资源并分配给内部的任务
      • 任务的监控与容错
    • Container
      • YARN 中的资源抽象,封装了某个节点上的多维度资源,如内存、CPU、磁盘、网络等

    image

    MapReduce 架构

    • Map 阶段并行处理输入数据
    • Reduce 阶段对 Map 结果进行汇总

    图片

    生态体系

    图片

    配置环境

    使用 sudo vim /etc/sysconfig/network-scripts/ifcfg-eth0 配置网络:

    DEVICE=eth0
    HWADDR=你的MAC地址
    TYPE=Ethernet
    UUID=
    ONBOOT=yes	# 开机启动
    NM_CONTROLLED=yes
    BOOTPROTO=static	# 方式
    
    IPADDR=你的ip地址
    GATEWAY=网关地址
    DNS1=dns地址
    

    使用 sudo vim /etc/sysconfig/network 配置 HOSTNAME :

    NETWORKING=yes
    HOSTNAME=你的hostname
    

    如果是使用 VM 克隆出的虚拟机,则需要修改 MAC 地址对应的 IP 地址:

    使用 sudo vim /etc/udev/rules.d/70-persistent-net.rules 复制当前的 MAC 地址:

    图片

    将 MAC 地址复制到上面的 ifcfg-eth0 文件的 HWADDR 后面

    使用 sudo vim /etc/hosts 将当前虚拟机的 hostname 映射到 ip地址上:

    图片

    创建一个普通用户,然后使用 root 用户sudo vim /etc/sudoers 给普通用户 sudo 的权限:

    图片

    /opt 目录下创建两个目录并修改所属用户和组,然后将 jdk 和 hadoop 文件导入至 software 文件夹:

    [jkfx@hadoop101 ~]$ cd /opt
    [jkfx@hadoop101 opt]$ sudo mkdir module
    [sudo] password for jkfx:
    [jkfx@hadoop101 opt]$ sudo mkdir software
    [jkfx@hadoop101 opt]$ ll
    总用量 12
    drwxr-xr-x. 2 root root 4096 10月 16 10:38 module
    drwxr-xr-x. 2 root root 4096 10月  4 2017 rh
    drwxr-xr-x. 2 root root 4096 10月 16 10:38 software
    [jkfx@hadoop101 opt]$ sudo rm -rf rh
    [jkfx@hadoop101 opt]$ ll
    总用量 8
    drwxr-xr-x. 2 root root 4096 10月 16 10:38 module
    drwxr-xr-x. 2 root root 4096 10月 16 10:38 software
    [jkfx@hadoop101 opt]$ sudo chown jkfx:jkfx module/ software/
    [jkfx@hadoop101 opt]$ cd software/
    [jkfx@hadoop101 software]$ ls
    hadoop-2.7.2.tar.gz  jdk-8u241-linux-x64.tar.gz
    

    将 jdk 压缩至 module 文件夹下然后在 /etc/profile 文件配置 jdk 的目录和 PATH 环境变量:

    [jkfx@hadoop101 software]$ ls
    hadoop-2.7.2.tar.gz  jdk-8u241-linux-x64.tar.gz
    [jkfx@hadoop101 software]$ tar -zxf jdk-8u241-linux-x64.tar.gz -C /opt/module/
    [jkfx@hadoop101 software]$ cd ../module/jdk1.8.0_241/
    [jkfx@hadoop101 jdk1.8.0_241]$ pwd
    /opt/module/jdk1.8.0_241
    [jkfx@hadoop101 jdk1.8.0_241]$ sudo vim /etc/profile
    [jkfx@hadoop101 jdk1.8.0_241]$ tail /etc/profile -n 5
    ## JAVA_HOME
    export JAVA_HOME=/opt/module/jdk1.8.0_241
    
    export PATH=$PATH:$JAVA_HOME/bin
    
    [jkfx@hadoop101 jdk1.8.0_241]$ source /etc/profile
    [jkfx@hadoop101 jdk1.8.0_241]$ java -version
    java version "1.8.0_241"
    Java(TM) SE Runtime Environment (build 1.8.0_241-b07)
    Java HotSpot(TM) 64-Bit Server VM (build 25.241-b07, mixed mode)
    

    将 hadoop 压缩文件压缩至 module 文件夹下再次配置 /etc/profile 文件:

    [jkfx@hadoop101 software]$ ls
    hadoop-2.7.2.tar.gz  jdk-8u241-linux-x64.tar.gz
    [jkfx@hadoop101 software]$ tar -zxf hadoop-2.7.2.tar.gz -C /opt/module/
    [jkfx@hadoop101 software]$ cd ../module/hadoop-2.7.2/
    [jkfx@hadoop101 hadoop-2.7.2]$ pwd
    /opt/module/hadoop-2.7.2
    [jkfx@hadoop101 hadoop-2.7.2]$ sudo vim /etc/profile
    [jkfx@hadoop101 hadoop-2.7.2]$ tail /etc/profile -n 4
    export HADOOP_HOME=/opt/module/hadoop-2.7.2
    export PATH=$PATH:$HADOOP_HOME/bin
    export PATH=$PATH:$HADOOP_HOME/sbin
    
    [jkfx@hadoop101 hadoop-2.7.2]$ source /etc/profile
    [jkfx@hadoop101 hadoop-2.7.2]$ hadoop version
    Hadoop 2.7.2
    

    Hadoop 目录结构

    图片

    本地模式

    • Local (Standalone) Mode
    • Pseudo-Distributed Mode
    • Fully-Distributed Mode

    Grep 案例

    By default, Hadoop is configured to run in a non-distributed mode, as a single Java process. This is useful for debugging.

    The following example copies the unpacked conf directory to use as input and then finds and displays every match of the given regular expression. Output is written to the given output directory.

      $ mkdir input
      $ cp etc/hadoop/*.xml input
      $ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.1.jar grep input output 'dfs[a-z.]+'
      $ cat output/*
    

    output 文件夹下查看输出结果:

    图片

    WordCount 案例

    [jkfx@hadoop101 hadoop-2.7.2]$ mkdir wcinput
    [jkfx@hadoop101 hadoop-2.7.2]$ cd wcinput/
    [jkfx@hadoop101 wcinput]$ vim wc.input
    [jkfx@hadoop101 wcinput]$ cat wc.input
    hadoop yarn
    hadoop spark hive hbase
    hadoop hdfs
    hadoop mapreduce
    hadoop
    jkfx
    jkfx
    
    [jkfx@hadoop101 wcinput]$ cd ..
    [jkfx@hadoop101 hadoop-2.7.2]$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount wcinput wcoutput
    

    然后到 wcoutput 目录下查看运行结果:

    [jkfx@hadoop101 hadoop-2.7.2]$ cd wcoutput/
    [jkfx@hadoop101 wcoutput]$ ll
    总用量 4
    -rw-r--r--. 1 jkfx jkfx 65 10月 16 11:40 part-r-00000
    -rw-r--r--. 1 jkfx jkfx  0 10月 16 11:40 _SUCCESS
    [jkfx@hadoop101 wcoutput]$ cat part-r-00000
    hadoop  5
    hbase   1
    hdfs    1
    hive    1
    jkfx    2
    mapreduce       1
    spark   1
    yarn    1
    

    即可查看到输出文件中的单词计数的结果

    伪分布式模式

    • Local (Standalone) Mode
    • Pseudo-Distributed Mode
    • Fully-Distributed Mode

    启动 HDFS 并运行 MapReduce 程序

    配置集群

    首先 hadoop-env.sh 文件下的 JAVA_HOME 变量,将默认的 ${JAVA_HOME} 修改为绝对路径:

    图片

    图片

    配置 core-site.xml 文件为:

    <!-- 指定HDFS中NameNode的地址 -->
    <property>
    <name>fs.defaultFS</name>
        <value>hdfs://hadoop101:9000</value>
    </property>
    <!-- 指定Hadoop运行时产生文件的存储目录 -->
    <property>
    	<name>hadoop.tmp.dir</name>
    	<value>/opt/module/hadoop-2.7.2/data/tmp</value>
    </property>
    

    配置 hdfs-site.xml 文件:

    <!-- 指定HDFS副本的数量 -->
    <property>
    	<name>dfs.replication</name>
    	<value>1</value>
    </property>
    

    启动集群

    首先需要使用 bin/hdfs namenode -formatNameNode 进行格式化

    然后使用 sbin/hadoop-daemon.sh start namenode 启动 NameNode

    使用 sbin/hadoop-daemon.sh start datanode

    [jkfx@hadoop101 hadoop-2.7.2]$ hadoop-daemon.sh start namenode
    starting namenode, logging to /opt/module/hadoop-2.7.2/logs/hadoop-jkfx-namenode-hadoop101.out
    [jkfx@hadoop101 hadoop-2.7.2]$ jps
    2800 NameNode
    2869 Jps
    [jkfx@hadoop101 hadoop-2.7.2]$ hadoop-daemon.sh start datanode
    starting datanode, logging to /opt/module/hadoop-2.7.2/logs/hadoop-jkfx-datanode-hadoop101.out
    [jkfx@hadoop101 hadoop-2.7.2]$ jps
    2800 NameNode
    2901 DataNode
    2975 Jps
    

    可以使用 jps 命令查看进程是否启动

    jps 是 JDK 的命令,使用之前应该正确安装 JDK

    然后在 web 端访问地址:http://hadoop101:50070/dfshealth.html#tab-overview

    图片

    如果无法正常访问,可以查看 Linux 系统的防火墙状态,将其关闭:

    service iptables status	# 查看防火墙状态
    sertive iptables stop	# 关闭防火墙
    chkconfig iptables off	# 设置开机不启动防火墙
    

    可以在 logs 目录下查看产生的 Log 日志:

    [jkfx@hadoop101 hadoop-2.7.2]$ ll logs/
    总用量 152
    -rw-rw-r--. 1 jkfx jkfx 61880 10月 18 11:08 hadoop-jkfx-datanode-hadoop101.log
    -rw-rw-r--. 1 jkfx jkfx   715 10月 18 11:08 hadoop-jkfx-datanode-hadoop101.out
    -rw-rw-r--. 1 jkfx jkfx   715 10月 18 11:05 hadoop-jkfx-datanode-hadoop101.out.1
    -rw-rw-r--. 1 jkfx jkfx   715 10月 18 11:02 hadoop-jkfx-datanode-hadoop101.out.2
    -rw-rw-r--. 1 jkfx jkfx 59394 10月 18 11:21 hadoop-jkfx-namenode-hadoop101.log
    -rw-rw-r--. 1 jkfx jkfx  5007 10月 18 11:21 hadoop-jkfx-namenode-hadoop101.out
    -rw-rw-r--. 1 jkfx jkfx   715 10月 18 11:04 hadoop-jkfx-namenode-hadoop101.out.1
    -rw-rw-r--. 1 jkfx jkfx   715 10月 18 11:02 hadoop-jkfx-namenode-hadoop101.out.2
    -rw-rw-r--. 1 jkfx jkfx     0 10月 18 11:02 SecurityAuth-jkfx.audit
    [jkfx@hadoop101 hadoop-2.7.2]$ head logs/hadoop-jkfx-namenode-hadoop101.log
    2020-10-18 11:02:03,477 INFO org.apache.hadoop.hdfs.server.namenode.NameNode: STARTUP_MSG:
    /************************************************************
    STARTUP_MSG: Starting NameNode
    STARTUP_MSG:   host = hadoop101/192.168.106.101
    STARTUP_MSG:   args = []
    STARTUP_MSG:   version = 2.7.2
    

    如果需要第二次格式化,则需要先使用 jps 查看 NameNodeDataNode 进程是否还在运行,应该将其关闭,然后将 tmplogs 的目录删除,然后再进行格式化

    为什么不要总是格式化 NamoNode
    格式化 NameNode,会产生新的集群 id ,导致 NameNodeDataNode 的集群 id 不一致,集群找不到已往数据。所以,格式 NameNode 时,一定要先删除 data 数据和 log 日志,然后再格式化 NameNode

    可以查看 NameNodeDataNode 的集群 id:

    [jkfx@hadoop101 hadoop-2.7.2]$ cd data/tmp/dfs/
    [jkfx@hadoop101 dfs]$ ll
    总用量 8
    drwx------. 3 jkfx jkfx 4096 10月 18 11:08 data
    drwxrwxr-x. 3 jkfx jkfx 4096 10月 18 11:13 name
    [jkfx@hadoop101 dfs]$ cat name/current/VERSION
    #Sun Oct 18 11:13:37 CST 2020
    namespaceID=1127195070
    clusterID=CID-cb738158-9d00-4d9d-a3f8-6832bccc6a48
    cTime=0
    storageType=NAME_NODE
    blockpoolID=BP-1827602297-192.168.106.101-1602990817201
    layoutVersion=-63
    [jkfx@hadoop101 dfs]$ cat data/current/VERSION
    #Sun Oct 18 11:08:47 CST 2020
    storageID=DS-28e4f9e6-9cf2-43d8-b6f1-c51e1b1c03ef
    clusterID=CID-2d242b98-a0bf-4c72-b642-5591d0150769
    cTime=0
    datanodeUuid=8750d6f9-0099-41cc-b7f5-98b1d550b254
    storageType=DATA_NODE
    layoutVersion=-56
    

    NameNodeDataNodeclusterID 必须一样,否则将不会正常启动

    图片

    操作集群

    HDFS 文件系统上创建一个 input 文件夹: bin/hdfs dfs -mkdir -p /user/jkfx/input

    将测试文件上传到文件系统: bin/hdfs dfs -put wcinput/wc.input /user/jkfx/input

    查看 HDFS 文件系统:

    图片

    也可以不在 web 端查看文件,在服务器端可以直接查看 HDFS 中的内容:

    [jkfx@hadoop101 hadoop-2.7.2]$ hdfs dfs -cat /user/jkfx/input/wc.input
    hadoop yarn
    hadoop spark hive hbase
    hadoop hdfs
    hadoop mapreduce
    hadoop
    jkfx
    jkfx
    

    运行 MapReduce 程序并查看运行结果:

    [jkfx@hadoop101 hadoop-2.7.2]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /user/jkfx/input/wc.input /user/jkfx/output
    [jkfx@hadoop101 hadoop-2.7.2]$ hdfs dfs -cat /user/jkfx/output/*
    hadoop  5
    hbase   1
    hdfs    1
    hive    1
    jkfx    2
    mapreduce       1
    spark   1
    yarn    1
    

    Note: 在这里执行的 MapReduce 程序的输入和输出目录不再是服务器本地的路径,而是 HDFS 文件系统的路径

    也可以在 web 端查看运行结果:

    图片

    启动 YARN 并运行 MapReduce 程序

    配置集群

    首先配置 yarn-env.sh 中的 JAVA_HOME 将注释符号去除并且修改成 JDK 的路径:

    图片

    配置 yarn-site.xml

    <configuration>
    <!-- Reducer获取数据的方式 -->
    <property>
    	<name>yarn.nodemanager.aux-services</name>
    	<value>mapreduce_shuffle</value>
    </property>
    <!-- 指定YARN的ResourceManager的地址 -->
    <property>
    	<name>yarn.resourcemanager.hostname</name>
    	<value>hadoop101</value>
    </property>
    </configuration>
    

    配置 mapred-env.sh 中的 JAVA_HOME 值:

    图片

    配置 mapred-site.xml

    这里将 mapred-site.xml.template 重命名为 mapred-site.xml

    然后配置 MapReduce 程序运行在 YARN 上,默认是 local

    <configuration>
    <!-- 指定MR运行在YARN上 -->
    <property>
    		<name>mapreduce.framework.name</name>
    		<value>yarn</value>
    </property>
    </configuration>
    

    启动集群

    启动前需要保证 NameNodeDataNode 已经启动

    图片

    使用 ./sbin/yarn-daemon.sh start resourcemanager 启动 ResourceManager :c

    使用 ./sbin/yarn-daemon.sh start nodemanager 启动 NodeManager

    图片

    集群操作

    通过浏览器打开 http://hadoop101:8088 查看:

    图片

    使用 ./bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /user/jkfx/input /user/jkfx/output 执行 MapReduce 程序:

    可以在浏览器查看运行情况:

    图片

    配置历史服务器

    为了查看程序的历史运行情况,需要配置一下历史服务器

    首先配置 mapred-site.xml

    <!-- 历史服务器端地址 -->
    <property>
    	<name>mapreduce.jobhistory.address</name>
    	<value>hadoop101:10020</value>
    </property>
    <!-- 历史服务器web端地址 -->
    <property>
        <name>mapreduce.jobhistory.webapp.address</name>
        <value>hadoop101:19888</value>
    </property>
    

    然后可以使用 ./sbin/mr-jobhistory-deamon.sh start historyserver 直接启动历史服务器

    可以使用 jps 查看服务器进程是否启动

    [jkfx@hadoop101 hadoop-2.7.2]$ vim etc/hadoop/mapred-site.xml
    [jkfx@hadoop101 hadoop-2.7.2]$ ./sbin/mr-jobhistory-daemon.sh start historyserver
    starting historyserver, logging to /opt/module/hadoop-2.7.2/logs/mapred-jkfx-historyserver-hadoop101.out
    [jkfx@hadoop101 hadoop-2.7.2]$ jps
    2913 NameNode
    3862 NodeManager
    4472 JobHistoryServer
    3609 ResourceManager
    4510 Jps
    3007 DataNode
    

    图片

    然后进入到了历史服务器的 web 界面:

    图片

    配置日志聚集

    日志聚集概念:应用运行完成以后,将程序运行日志信息上传到HDFS系统上。

    日志聚集功能好处:可以方便的查看到程序运行详情,方便开发调试。

    注意:开启日志聚集功能,需要重新启动 NodeManagerResourceManagerHistoryManager

    首先配置 yarn-site.xml

    <!-- 日志聚集功能使能 -->
    <property>
    	<name>yarn.log-aggregation-enable</name>
    	<value>true</value>
    </property>
    <!-- 日志保留时间设置7天 -->
    <property>
    	<name>yarn.log-aggregation.retain-seconds</name>
    	<value>604800</value>
    </property>
    

    关闭并重新启动 NodeManager / ResourceManager / JobHistoryServer

    [jkfx@hadoop101 hadoop-2.7.2]$ vim etc/hadoop/yarn-site.xml
    [jkfx@hadoop101 hadoop-2.7.2]$ jps
    2913 NameNode
    3862 NodeManager
    4472 JobHistoryServer
    3609 ResourceManager
    27370 Jps
    3007 DataNode
    [jkfx@hadoop101 hadoop-2.7.2]$ ./sbin/yarn-daemon.sh stop nodemanager
    stopping nodemanager
    nodemanager did not stop gracefully after 5 seconds: killing with kill -9
    [jkfx@hadoop101 hadoop-2.7.2]$ jps
    27408 Jps
    2913 NameNode
    4472 JobHistoryServer
    3609 ResourceManager
    3007 DataNode
    [jkfx@hadoop101 hadoop-2.7.2]$ ./sbin/yarn-daemon.sh stop resourcemanager
    stopping resourcemanager
    [jkfx@hadoop101 hadoop-2.7.2]$ jps
    2913 NameNode
    27444 Jps
    4472 JobHistoryServer
    3007 DataNode
    [jkfx@hadoop101 hadoop-2.7.2]$ ./sbin/mr-jobhistory-daemon.sh stop historyserver
    stopping historyserver
    [jkfx@hadoop101 hadoop-2.7.2]$ jps
    2913 NameNode
    27484 Jps
    3007 DataNode
    [jkfx@hadoop101 hadoop-2.7.2]$ ./sbin/yarn-daemon.sh start nodemanager
    starting nodemanager, logging to /opt/module/hadoop-2.7.2/logs/yarn-jkfx-nodemanager-hadoop101.out
    [jkfx@hadoop101 hadoop-2.7.2]$ ./sbin/yarn-daemon.sh start resourcemanager
    starting resourcemanager, logging to /opt/module/hadoop-2.7.2/logs/yarn-jkfx-resourcemanager-hadoop101.out
    [jkfx@hadoop101 hadoop-2.7.2]$ ./sbin/mr-jobhistory-daemon.sh start historyserver
    starting historyserver, logging to /opt/module/hadoop-2.7.2/logs/mapred-jkfx-historyserver-hadoop101.out
    [jkfx@hadoop101 hadoop-2.7.2]$ jps
    2913 NameNode
    27666 ResourceManager
    27955 Jps
    27917 JobHistoryServer
    27519 NodeManager
    3007 DataNode
    

    然后重新在 YARN 上运行 MapReduce 程序,记得删除输出文件夹后在运行

    
    

    即可在历史服务器的 web 端界面查看 log

    图片

    图片

    配置文件说明

    Hadoop 配置文件分两类: 默认配置文件自定义配置文件 ,只有用户想修改某一默认配置值时,才需要修改自定义配置文件,更改相应属性值

    默认配置文件

    要获取的默认文件 文件存放在Hadoop的jar包中的位置
    [core-default.xml] hadoop-common-2.7.2.jar / core-default.xml
    [hdfs-default.xml] hadoop-hdfs-2.7.2.jar / hdfs-default.xml
    [yarn-default.xml] hadoop-yarn-common-2.7.2.jar / yarn-default.xml
    [mapred-default.xml] hadoop-mapreduce-client-core-2.7.2.jar / mapred-default.xml

    也可以在 Hadoop 文档的网站中查看默认配置文件:

    图片

    自定义配置文件

    core-site.xml / hdfs-site.xml / yarn-site.xml / mapred-site.xml 四个配置文件存放在 $HADOOP_HOME/etc/hadoop 这个路径上,用户可以根据项目需求重新进行修改配置

    完全布式模式

    • Local (Standalone) Mode
    • Pseudo-Distributed Mode
    • Fully-Distributed Mode

    首先将之前最原始的虚拟机的镜像克隆 3 份,分别是 hadoop102 / hadoop103 / hadoop104 ,并修改 ip 地址、 hostname等

    图片

    scp 安全拷贝

    scp (secure copy) 可以实现服务器与服务器之间的数据拷贝(from server1 to server2)

    可以将 hadoop101 上已经解压好的软件通过 scp 直接复制到其他服务器集群上

    cp	-r	$pdir/$fname	$user@hadoop$host:$pdir/$fname
    命令	递归	要拷贝的文件路径/名称	目的用户@主机:目的路径/名称
    

    在 hadoop101 将 hadoop101 复制到 hadoop102

    在源主机上将自己的目录复制到目标服务器主机

    使用命令 scp -r module root@hadoop102:/opt 即可通过网络复制到目标服务器

    图片

    然后可以在目标服务器上修改下文件目录的所属者和所属组:

    [jkfx@hadoop102 opt]$ ll
    总用量 8
    drwxr-xr-x. 5 root root 4096 10月 24 19:42 module
    drwxr-xr-x. 2 jkfx jkfx 4096 10月 24 04:28 software
    [jkfx@hadoop102 opt]$ sudo chown -R jkfx:jkfx module
    [sudo] password for jkfx:
    [jkfx@hadoop102 opt]$ ll
    总用量 8
    drwxr-xr-x. 5 jkfx jkfx 4096 10月 24 19:42 module
    drwxr-xr-x. 2 jkfx jkfx 4096 10月 24 04:28 software
    

    在 hadoop103 将 hadoop101 复制到 hadoop103

    在目标服务器上将源目录主机复制到自己主机上

    因为登陆的是 jkfx 用户而 /opt 目录所属者是 root ,所以需要加 sudo ,使用 sudo scp -r jkfx@hadoop101:/opt/module ./

    图片

    在 hadoop103 将 hadoop101 复制到 hadoop104

    在中间的服务器将一个服务器的文件目录复制到另一个服务器中,需要知道两者的用户密码

    使用 scp -r jkfx@hadoop101:/opt/module root@hadoop104:/opt/

    图片

    复制到目标主机后不要忘记修改下目录的所属者:所属目录

    rsync 远程同步

    rsync 主要用于备份和镜像,具有速度快、避免复制相同内容和支持符号链接的优点

    rsyncscp 区别:用 rsync 做文件的复制要比 scp 的速度快, rsync 只对差异文件做更新, scp 是把所有文件都复制过去

    基本语法: rsync -rvl source/dir user@hostname:dest/dir

    选项 功能说明
    -r 递归
    -v 显示复制过程
    -l 拷贝符号链接

    把 hadoop101 机器上的 /opt/software 目录同步到 hadoop102 机器的 root 用户下的 /opt 目录:

    [jkfx@hadoop101 opt]$ ll
    总用量 12
    -rw-r--r--. 1 root root   13 10月 25 18:49 jkfx.txt
    drwxr-xr-x. 5 jkfx jkfx 4096 10月 24 04:28 module
    drwxr-xr-x. 2 jkfx jkfx 4096 10月 24 04:28 software
    [jkfx@hadoop101 opt]$ sudo vim jkfx.txt
    [jkfx@hadoop101 opt]$ cat jkfx.txt
    Hello World!
    Hello mxnet!
    [jkfx@hadoop101 opt]$ sudo rsync -rvl jkfx.txt root@hadoop102:/opt
    root@hadoop102's password:
    sending incremental file list
    jkfx.txt
    
    sent 100 bytes  received 37 bytes  54.80 bytes/sec
    total size is 26  speedup is 0.19
    

    集群分发脚本

    循环复制文件到所有节点的相同目录下

    #!/bin/bash
    
    #1. 获取输入参数的个数,如果没有参数,直接退出
    pcount=$#
    if((pcount==0)); then
    	echo no args;
    	exit;
    fi
    
    #2. 获取文件名称
    p1=$1
    fname=`basename $p1`
    echo fname=$fname
    
    #3. 获取上级目录到绝对路径
    pdir=`cd -P $(dirname $p1); pwd`
    echo pdir=$pdir
    
    #4. 获取当前用户名称
    user=`whoami`
    
    #5. 循环分发
    for((host=103; host<105; host++)); do
    	echo ------------------- hadoop$host --------------
    	rsync -rvl $pdir/$fname $user@hadoop$host:$pdir
    done
    

    然后查看运行结果:

    [jkfx@hadoop102 bin]$ xsync /home/jkfx/bin/xsync
    fname=xsync
    pdir=/home/jkfx/bin
    ------------------- hadoop103 --------------
    The authenticity of host 'hadoop103 (192.168.186.103)' can't be established.
    RSA key fingerprint is b6:22:10:22:59:5a:57:10:55:ac:9a:2f:2d:43:f6:57.
    Are you sure you want to continue connecting (yes/no)? yes
    Warning: Permanently added 'hadoop103,192.168.186.103' (RSA) to the list of known hosts.
    jkfx@hadoop103's password:
    Permission denied, please try again.
    jkfx@hadoop103's password:
    sending incremental file list
    xsync
    
    sent 573 bytes  received 31 bytes  48.32 bytes/sec
    total size is 502  speedup is 0.83
    ------------------- hadoop104 --------------
    The authenticity of host 'hadoop104 (192.168.186.104)' can't be established.
    RSA key fingerprint is b6:22:10:22:59:5a:57:10:55:ac:9a:2f:2d:43:f6:57.
    Are you sure you want to continue connecting (yes/no)? yes
    Warning: Permanently added 'hadoop104,192.168.186.104' (RSA) to the list of known hosts.
    jkfx@hadoop104's password:
    sending incremental file list
    xsync
    
    sent 573 bytes  received 31 bytes  172.57 bytes/sec
    total size is 502  speedup is 0.83
    

    集群配置

    集群部署规划

    hadoop102 hadoop103 hadoop104
    HDFS NameNode
    DataNode

    DataNode
    SecondaryNameNode
    DataNode
    YARN
    NodeManager
    ResourceManager
    NodeManager

    NodeManager

    配置集群配置文件

    核心配置文件

    配置 core-site.xml :

    <!-- 指定 HDFS 中 NameNode 的地址 -->
    <property>
    		<name>fs.defaultFS</name>
          <value>hdfs://hadoop102:9000</value>
    </property>
    
    <!-- 指定 Hadoop 运行时产生文件的存储目录 -->
    <property>
    		<name>hadoop.tmp.dir</name>
    		<value>/opt/module/hadoop-2.7.2/data/tmp</value>
    </property>
    
    HDFS 配置文件

    配置 hadoop-env.sh :

    export JAVA_HOME=/opt/module/jdk1.8.0_144
    

    配置 hdfs-site.xml :

    <!-- 默认不写也为 3 -->
    <property>
    		<name>dfs.replication</name>
    		<value>3</value>
    </property>
    
    <!-- 指定 Hadoop 辅助名称节点主机配置 -->
    <property>
          <name>dfs.namenode.secondary.http-address</name>
          <value>hadoop104:50090</value>
    </property>
    
    YARN 配置文件

    配置 yarn-env.sh :

    export JAVA_HOME=/opt/module/jdk1.8.0_144
    

    配置 yarn-site.xml :

    <!-- Reducer 获取数据的方式 -->
    <property>
    		<name>yarn.nodemanager.aux-services</name>
    		<value>mapreduce_shuffle</value>
    </property>
    
    <!-- 指定 YARN 的 ResourceManager 的地址 -->
    <property>
    		<name>yarn.resourcemanager.hostname</name>
    		<value>hadoop103</value>
    </property>
    
    MapReduce 配置文件

    配置 mapred-env.sh :

    export JAVA_HOME=/opt/module/jdk1.8.0_144
    

    配置 mapred-site.xml :

    <!-- 指定MR运行在Yarn上 -->
    <property>
    		<name>mapreduce.framework.name</name>
    		<value>yarn</value>
    </property>
    

    在集群上分发配置文件

    xsync /opt/module/hadoop-2.7.2/
    
    [jkfx@hadoop102 hadoop-2.7.2]$ vim etc/hadoop/core-site.xml
    [jkfx@hadoop102 hadoop-2.7.2]$ vim etc/hadoop/hadoop-env.sh
    [jkfx@hadoop102 hadoop-2.7.2]$ vim etc/hadoop/hdfs-site.xml
    [jkfx@hadoop102 hadoop-2.7.2]$ vim etc/hadoop/yarn-env.sh
    [jkfx@hadoop102 hadoop-2.7.2]$ vim etc/hadoop/yarn-site.xml
    [jkfx@hadoop102 hadoop-2.7.2]$ vim etc/hadoop/mapred-env.sh
    [jkfx@hadoop102 hadoop-2.7.2]$ vim etc/hadoop/mapred-site.xml
    [jkfx@hadoop102 hadoop-2.7.2]$ xsync /opt/module/hadoop-2.7.2/
    

    集群单点启动

    如果集群是第一次启动,需要使用 ./bin/hadoop namenode -formatNameNode 进行格式化

    格式化之前需要删除 rm -rf data/ logs/ 这两个目录,并且确保 jps 没有 NameNode 进程在运行

    然后手动开启每个集群:

    在 hadoop102 开启 NameNode :

    ./sbin/hadoop-daemon.sh start namenode
    jps
    

    在 hadoop102 / hadoop103 / hadoop104 开启 DataNode :

    ./sbin/hadoop-daemon.sh start datanode
    jps
    

    如果每个集群节点需要手动启动,那么将会是非常浪费时间的

    ssh 无密登录

    ssh ipaddr

    图片

    分别在 hadoop102 / hadoop103 上执行 ssh-keygen 命令:

    [jkfx@hadoop103 .ssh]$ ssh-keygen -t rsa
    Generating public/private rsa key pair.
    Enter file in which to save the key (/home/jkfx/.ssh/id_rsa):
    Enter passphrase (empty for no passphrase):
    Enter same passphrase again:
    Your identification has been saved in /home/jkfx/.ssh/id_rsa.
    Your public key has been saved in /home/jkfx/.ssh/id_rsa.pub.
    The key fingerprint is:
    85:26:61:2e:16:71:fc:61:e7:f8:3b:a9:ee:f3:ec:e6 jkfx@hadoop103
    The key's randomart image is:
    +--[ RSA 2048]----+
    |    oo+          |
    |     =..o..      |
    |    o ooo=.      |
    |   . . oo..      |
    |        S.       |
    |          .      |
    |           o     |
    |        ..=      |
    |       o+BE.     |
    +-----------------+
    

    生成公钥和私钥后使用 ssh-copy-id 将公钥复制到其它 3 台集群的 authorized_keys 里(包括自己):

    [jkfx@hadoop103 .ssh]$ ssh-copy-id hadoop102
    [jkfx@hadoop103 .ssh]$ ssh-copy-id hadoop103
    [jkfx@hadoop103 .ssh]$ ssh-copy-id hadoop104
    The authenticity of host 'hadoop104 (192.168.186.104)' can't be established.
    RSA key fingerprint is b6:22:10:22:59:5a:57:10:55:ac:9a:2f:2d:43:f6:57.
    Are you sure you want to continue connecting (yes/no)? yes
    Warning: Permanently added 'hadoop104,192.168.186.104' (RSA) to the list of known hosts.
    jkfx@hadoop104's password:
    Now try logging into the machine, with "ssh 'hadoop104'", and check in:
    
      .ssh/authorized_keys
    
    to make sure we haven't added extra keys that you weren't expecting.
    

    还需要使用 hadoop101 集群的 root 账户配置无密登录到三台集群服务器

    • known_hosts : 记录 ssh 访问过计算机的公钥(public key)
    • id_rsa : 生成的私钥
    • id_rsa.pub : 生成的公钥
    • authorized_keys : 存放授权过的无密登录服务器公钥

    群起集群

    首先需要配置 slaves

    [jkfx@hadoop102 hadoop-2.7.2]$ vim etc/hadoop/slaves
    [jkfx@hadoop102 hadoop-2.7.2]$ cat etc/hadoop/slaves
    hadoop102
    hadoop103
    hadopp104
    

    注意:该文件内不允许有多余的空格、空行

    然后使用 xsync 脚本分发配置文件:

    [jkfx@hadoop102 hadoop-2.7.2]$ xsync etc/hadoop/slaves
    fname=slaves
    pdir=/opt/module/hadoop-2.7.2/etc/hadoop
    ------------------- hadoop103 --------------
    sending incremental file list
    slaves
    
    sent 102 bytes  received 37 bytes  278.00 bytes/sec
    total size is 30  speedup is 0.22
    ------------------- hadoop104 --------------
    sending incremental file list
    slaves
    
    sent 102 bytes  received 37 bytes  278.00 bytes/sec
    total size is 30  speedup is 0.22
    

    如果是第一次启动,需要格式化 NameNode ,注意格式化之前先停止进程,然后删除 data 和 log 数据

    启动 HDFS

    注意是在 hadoop102 集群上开启 HDFS 因为 hadoop102 配置的 NameNode

    图片

    启动 YARN

    注意是在 hadoop103 机器上启动 YARN 并且如果 NameNodeResourceManager 不在同一台机器,就不能再 NameNode 上启动 YARN 应该在 ResourceManager 机器上启动 YARN

    图片

    启动之后在 Web 端查看 SecondaryNameNode

    浏览器输入 http://hadoop104:50090/status.html

    图片

    注意:启动之后一定要在每台服务器上使用 jps 查看每个进程是否正常启动!

    基本测试

    启动集群完成后,我们需要上传大小不同的文件进行测试,为了更好的阐述 HDFS 的存储机制,我们分别存储一个小于一个块大小的(128M)的文件和一个大于块大小的文件

    首先上传文件:

    [jkfx@hadoop102 hadoop-2.7.2]$ ./bin/hdfs dfs -put wcinput/wc.input /
    [jkfx@hadoop102 hadoop-2.7.2]$ ./bin/hdfs dfs -put /opt/software/hadoop-2.7.2.tar.gz /
    [jkfx@hadoop102 hadoop-2.7.2]$ ./bin/hdfs dfs -ls /
    Found 2 items
    -rw-r--r--   3 jkfx supergroup  197657687 2020-10-30 18:10 /hadoop-2.7.2.tar.gz
    -rw-r--r--   3 jkfx supergroup         82 2020-10-30 18:10 /wc.input
    

    如果刚启动集群时,上传文件显示 put: Cannot create file/wc.input._COPYING_. Name node is in safe mode. 则说明当前的 NameNode 正处于安全模式,无需强制退出安全模式,等待一会儿即可,也可以使用 hadoop dfsadmin -safemode leave 强制退出

    分别上传了两个文件,在浏览器中打开 http://hadoop102:50070/ 查看两个文件的存储情况:

    图片

    首先查看小文件的属性:

    图片

    然后查看大文件的属性:

    图片

    然后查看上传到 HDFS 的文件存储在了:/opt/module/hadoop-2.7.2/data/tmp/dfs/data/current/BP-2100340801-192.168.186.102-1604114055352/current/finalized/subdir0/subdir0

    [jkfx@hadoop102 subdir0]$ pwd
    /opt/module/hadoop-2.7.2/data/tmp/dfs/data/current/BP-2100340801-192.168.186.102-1604114055352/current/finalized/subdir0/subdir0
    [jkfx@hadoop102 subdir0]$ ll
    总用量 194552
    -rw-rw-r--. 1 jkfx jkfx        82 10月 31 11:17 blk_1073741825
    -rw-rw-r--. 1 jkfx jkfx        11 10月 31 11:17 blk_1073741825_1001.meta
    -rw-rw-r--. 1 jkfx jkfx 134217728 10月 31 11:17 blk_1073741826
    -rw-rw-r--. 1 jkfx jkfx   1048583 10月 31 11:17 blk_1073741826_1002.meta
    -rw-rw-r--. 1 jkfx jkfx  63439959 10月 31 11:17 blk_1073741827
    -rw-rw-r--. 1 jkfx jkfx    495635 10月 31 11:17 blk_1073741827_1003.meta
    

    可以查看这几个 blk_* 文件的内容为:

    图片

    我们将后缀为 26、27 的两个文件拼接到一起,查看会发生什么:

    [jkfx@hadoop102 subdir0]$ cat blk_1073741826 >> temp.file
    [jkfx@hadoop102 subdir0]$ cat blk_1073741827 >> temp.file
    [jkfx@hadoop102 subdir0]$ tar -zxf temp.file
    [jkfx@hadoop102 subdir0]$ ll
    总用量 387584
    -rw-rw-r--. 1 jkfx jkfx        82 10月 31 11:17 blk_1073741825
    -rw-rw-r--. 1 jkfx jkfx        11 10月 31 11:17 blk_1073741825_1001.meta
    -rw-rw-r--. 1 jkfx jkfx 134217728 10月 31 11:17 blk_1073741826
    -rw-rw-r--. 1 jkfx jkfx   1048583 10月 31 11:17 blk_1073741826_1002.meta
    -rw-rw-r--. 1 jkfx jkfx  63439959 10月 31 11:17 blk_1073741827
    -rw-rw-r--. 1 jkfx jkfx    495635 10月 31 11:17 blk_1073741827_1003.meta
    drwxr-xr-x. 9 jkfx jkfx      4096 5月  22 2017 hadoop-2.7.2
    -rw-rw-r--. 1 jkfx jkfx 197657687 10月 31 11:32 temp.file
    [jkfx@hadoop102 subdir0]$ cd hadoop-2.7.2/
    [jkfx@hadoop102 hadoop-2.7.2]$ ll
    总用量 52
    drwxr-xr-x. 2 jkfx jkfx  4096 5月  22 2017 bin
    drwxr-xr-x. 3 jkfx jkfx  4096 5月  22 2017 etc
    drwxr-xr-x. 2 jkfx jkfx  4096 5月  22 2017 include
    drwxr-xr-x. 3 jkfx jkfx  4096 5月  22 2017 lib
    drwxr-xr-x. 2 jkfx jkfx  4096 5月  22 2017 libexec
    -rw-r--r--. 1 jkfx jkfx 15429 5月  22 2017 LICENSE.txt
    -rw-r--r--. 1 jkfx jkfx   101 5月  22 2017 NOTICE.txt
    -rw-r--r--. 1 jkfx jkfx  1366 5月  22 2017 README.txt
    drwxr-xr-x. 2 jkfx jkfx  4096 5月  22 2017 sbin
    drwxr-xr-x. 4 jkfx jkfx  4096 5月  22 2017 share
    

    可以看到两个文件拼接后就是原文件的内容,没有经过任何修改。

    集群的启动 / 停止

    各个服务组件逐一启动 / 停止

    HDFS 组件

    hadoop-daemon.sh start / stop namenode / datanode

    YARN 组件

    yarn-daemon.sh start / stop resourcemanager / nodemanager

    各个模块启动 / 停止

    配置 ssh 是关键

    整体启动 HDFS

    start-dfs.sh / stop-dfs.sh

    整体启动 YARN

    start-yarn.sh / stop-yarn.sh

    crond 服务管理

    重新启动一下服务: service crond restart

    基本语法

    crondtab [选项]

    选项说明:

    选项 功能
    -e 编辑 crondtab 定时任务
    -l 查询 crondtab 任务
    -r 删除当前用户所有的 crondtab 任务

    参数说明

    首先使用 crondtab -e 进入编辑界面,使用 vim 编辑定时任务:

    编辑格式: * * * * * 要执行的任务

    项目 含义 范围
    第一个 * 一小时当中的第几分钟 0-59
    第二个 * 一天当中的第几小时 0-23
    第三个 * 一个月当中的第几天 1-31
    第四个 * 一年当中的第几个月 1-12
    第五个 * 一周当中的星期几 0-7

    特殊符号

    特殊符号 含义
    * 代表任何时间。比如第一个 * 代表一小时的每分钟都执行一次
    , 代表不连续的时间。比如 0 8,12,16 * * * 表示每天的 8 点、12点、16点整执行一次
    - 代表连续的时间范围。比如 0 5 * * 1-6 表示在周一到周六的凌晨 5 点整执行
    * 代表每隔多久时间执行一次。比如 *10 * * * * 表示每隔 10 分钟就执行一次

    举例说明

    时间 含义
    45 22 * * * 在 22 点 45 分执行
    0 17 * * 1 在周一的 17 点 0 分执行
    0 5 1,15 * * 在每月的 1 号和 15 号的凌晨 5 点 0 分执行
    40 4 * * 1-5 在周一到周五的凌晨 4 点 40 分执行
    *10 4 * * * 每天的凌晨 4 点,每隔 10 分钟执行一次
    0 0 1,15 * 1 每月 1 号和 15 号,每周一的 0 点 0 分执行

    注意 星期几和几号最好不要同时出现,它们的定义都是天,容易让人混乱

    集群时间同步

    时间同步的方式:找一个机器,作为时间服务器,所有的机器与这台集群时间进行定时的同步,比如,每隔十分钟,同步一次时间。

    图片

    时间服务器配置

    首先使用 rpm -qa | grep ntp 查看服务是否安装,然后修改 /etc/ntp.conf 配置文件

    [jkfx@hadoop102 hadoop-2.7.2]$ su root
    密码:
    [root@hadoop102 hadoop-2.7.2]# rpm -qa | grep ntp
    fontpackages-filesystem-1.41-1.1.el6.noarch
    ntp-4.2.6p5-12.el6.centos.2.x86_64
    ntpdate-4.2.6p5-12.el6.centos.2.x86_64
    [root@hadoop102 hadoop-2.7.2]# vim /etc/ntp.conf
    

    打开 ntp.conf 配置文件后,首先授权 192.168.1.0 这个网段的机器可以向本机器查询和同步时间:

    图片

    然后将 ntp 默认的 5 个其它互联网上的时间服务器注释掉,表示集群只在局域网内同步查询时间:

    图片

    然后为当前节点添加,当该节点丢失网络连接时,依然采用本地时间作为时间服务器为集群中的其它节点提供时间同步,在文件尾添加如下两行:

    server 127.127.1.0
    fudge 127.127.1.0 stratum 10
    

    修改完 ntp.conf 文件后,开始修改 /etc/sysconfig/ntpd 文件,添加 SYNC_HWCLOCK=yes 表示让硬件时间和系统时间一起同步

    然后使用 service ntpd restart 重启 ntpd 服务

    然后使用 chkconfig ntpd onntpd 服务开机自启动

    [root@hadoop102 hadoop-2.7.2]# vim /etc/sysconfig/ntpd
    [root@hadoop102 hadoop-2.7.2]# service ntpd status
    ntpd (pid  1727) 正在运行...
    [root@hadoop102 hadoop-2.7.2]# service ntpd restart
    关闭 ntpd:                                                [确定]
    正在启动 ntpd:                                            [确定]
    [root@hadoop102 hadoop-2.7.2]# chkconfig ntpd on
    

    其它机器配置

    在其它机器上配置 crondtab 定时任务让机器每 10 分钟与时间服务器同步一次时间

    首先使用 root 用户,使用 crontab -e 打开编辑界面,编写定时任务 */10 * * * * /usr/sbin/ntpdate hadoop102 配置完成后,每个集群就可以时间同步

    [jkfx@hadoop103 hadoop-2.7.2]$ su root
    密码:
    [root@hadoop103 hadoop-2.7.2]# date
    2020年 10月 31日 星期六 12:38:54 CST
    [root@hadoop103 hadoop-2.7.2]# date -s "1999-10-30 10:30:00"
    1999年 10月 30日 星期六 10:30:00 CST
    [root@hadoop103 hadoop-2.7.2]# ntpdate hadoop102
    31 Oct 12:39:12 ntpdate[25673]: step time server 192.168.186.102 offset 662868545.048074 sec
    [root@hadoop103 hadoop-2.7.2]# date
    2020年 10月 31日 星期六 12:39:13 CST
    
    不一定每天 code well 但要每天 live well
  • 相关阅读:
    sql2005新特性 for xml , outer apply ,多行转成单列方法
    数据库备份还原到指定时间
    在 64 位版本的 Windows 上,如何在 32 位版本的 ASP.NET 1.1 和 64 位版本的 ASP.NET 2.0 之间切换
    人事管理系统的一般功能需求
    转支持非主键排序的SQL存储过程
    正则表达式删除指定的HTML 标签
    PAZU 4Fang WEB 打印控件
    ASP.NET木马及Webshell安全解决方案
    vue3+element 父组件子组件传值
    彻底理解01背包问题
  • 原文地址:https://www.cnblogs.com/geekfx/p/13825638.html
Copyright © 2020-2023  润新知