大数据学习笔记——基于 Linux CentOS 7 的 Hadoop 3.1.2 环境搭建(四)

  1. 伪分布式模式配置和部署
    所有操作用户均为: icss
    所有操作均在 master 上执行 ,只启动 master 即可。
    下载, 上传, 解压, 配置, 运行, 验证.
    0. 验证环境准备
    ssh localhost

    1. 下载\上传\解压
      移动
      mv ~/software/hadoop-3.1.2.tar.gz ~/
      解压
      tar -xzvf ~/hadoop-3.1.2.tar.gz
      目录改名
      mv ~/hadoop-3.1.2 ~/hadoop3
    2. 配置 & 运行
      伪分布式配置,需要配置 3 个部分:配 Hadoop 运行环境、配 Linux 运行环境、配 Hadoop 的 xml 配置文件
      1. 配置:

        1. 配置 Hadoop 运行环境 : hadoop-env.sh
          vi ~/hadoop3/etc/hadoop/hadoop-env.sh
          加入:
          # 设置 JAVA_HOME 环境变量, 可以使用 Linux 的 ~/.bash_profile 设置的环境变量, 推荐使用此处配置
          export JAVA_HOME=/usr/java/jdk1.8.0_211

        2. 配置 Linux 运行环境 : ~/.bash_profile
          vi ~/.bash_profile
          加入:
          # for Hadoop
          export HADOOP_HOME=$HOME/hadoop3
          export HADOOP_COMMON_LIB_NATIVE_DIR= $ HADOOP_HOME/lib/native
          export HADOOP_OPTS="-Djava.library.path= $ HADOOP_HOME/lib/native: $HADOOP_COMMON_LIB_NATIVE_DIR"
          export YARN_HOME= $HOME/hadoop3
          export HADOOP_CONF_DIR= $HADOOP_HOME/etc/hadoop
          # export YARN_CONF_DIR= $YARN_HOME/etc/hadoop
          # YARN_CONF_DIR 是降级的环境变量, 应该用 HADOOP_CONF_DIR 替换
          export HDFS_CONF_DIR= $HADOOP_HOME/etc/hadoop
          export PATH=.: $JAVA_HOME/lib: $HADOOP_HOME/sbin: $HADOOP_HOME/bin: $PATH

        更新环境变量,使之生效
        source .bash_profile
        3. 配置 xml 文件 之一: 配置 Hadoop核心和分布式文件系统
        1. vi ~/hadoop3/etc/hadoop/core-site.xml
        加入:<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://master:9000</value> <description> 设置分布式文件系统的访问端口号, 此处必须设置为 localhost </description> </property> </configuration>

  2. vi ~/hadoop3/etc/hadoop/hdfs-site.xml
    加入: <configuration> <property> <name>dfs.replication</name> <value>1</value> <description> 设置分布式文件系统的文件分块的复制块数, 推荐最大设置为3且不能大于集群中 Datanode 节点的数量 此处为单机版的伪分布式模式, 只有一个节点, 故此设置为 1 </description> </property> </configuration>

  3. 配置 xml 文件 之二: 配置 MapReduce 和 YARN
    3. vi ~/hadoop3/etc/hadoop/mapred-site.xml
    加入:<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> <description> mapreduce 计算框架使用 yarn 资源管理框架 </description> </property> <property> <name>mapreduce.application.classpath</name> <value>/home/icss/hadoop3/etc/hadoop:/home/icss/hadoop3/share/hadoop/common/lib/*:/home/icss/hadoop3/share/hadoop/common/*:/home/icss/hadoop3/share/hadoop/hdfs:/home/icss/hadoop3/share/hadoop/hdfs/lib/*:/home/icss/hadoop3/share/hadoop/hdfs/*:/home/icss/hadoop3/share/hadoop/mapreduce/lib/*:/home/icss/hadoop3/share/hadoop/mapreduce/*:/home/icss/hadoop3/share/hadoop/yarn:/home/icss/hadoop3/share/hadoop/yarn/lib/*:/home/icss/hadoop3/share/hadoop/yarn/*</value> </property> </configuration>

  4. vi ~/hadoop3/etc/hadoop/yarn-site.xml
    加入:
    `

     <configuration>
     					<property>
                         <name>yarn.nodemanager.aux-services</name>
                         <value>mapreduce_shuffle</value>
                         <description>
                         NodeManager上运行的附属服务。需配置成mapreduce_shuffle,才可运行MapReduce程序。
                         </description>
                     </property>
                          <property>
                         <name>yarn.resourcemanager.address</name>
                         <value>master:18040</value>
                     </property>
    
                     <property>
                         <name>yarn.resourcemanager.scheduler.address</name>
                         <value>master:18030</value>
                     </property>
    
                     <property>
                         <name>yarn.resourcemanager.resource-tracker.address</name>
                         <value>master:18025</value>
                     </property>
    
                     <property>
                         <name>yarn.resourcemanager.admin.address</name>
                         <value>master:18141</value>
                     </property>
    
                     <property>
                         <name>yarn.resourcemanager.webapp.address</name>
                         <value>master:18080</value>
                     </property>
                     <property>
                     <name>yarn.application.classpath</name>
                     <value>/home/icss/hadoop3/etc/hadoop:/home/icss/hadoop3/share/hadoop/common/lib/*:/home/icss/hadoop3/share/hadoop/common/*:/home/icss/hadoop3/share/hadoop/hdfs:/home/icss/hadoop3/share/hadoop/hdfs/lib/*:/home/icss/hadoop3/share/hadoop/hdfs/*:/home/icss/hadoop3/share/hadoop/mapreduce/lib/*:/home/icss/hadoop3/share/hadoop/mapreduce/*:/home/icss/hadoop3/share/hadoop/yarn:/home/icss/hadoop3/share/hadoop/yarn/lib/*:/home/icss/hadoop3/share/hadoop/yarn/*</value>
                     </property>
     				<property>
             <name>yarn.nodemanager.pmem-check-enabled</name>
             <value>false</value>
     				</property>
     				<property>
             <name>yarn.nodemanager.vmem-pmem-ratio</name>
             <value>10</value>
     				</property>
         <property>
     		<name>mapreduce.map.memory.mb</name>
     		<value>4096</value>
     		<source>mapred-default.xml</source>
     	</property>
    
    mapreduce.reduce.memory.mb 4096 mapred-default.xml `

/// 运行 & 启动 Hadoop HDFS
*** 日志: /home/icss/hadoop3/logs
0. 让运行环境变量生效
source .bash_profile
1. 启动 Hadoop HDFS
1. 格式化 HDFS文件系统, 首先格式 namenode (! 最初只做一次)
hdfs namenode -format
只要都是 INFO 的信息,就是没有错误。
2. 启动守护进程(Hadoop 的 HDFS 的守护进程)
start-dfs.sh
// 退出守护进程(Hadoop 的 HDFS 的守护进程)
stop-dfs.sh
3. 验证:
jps
1569 NameNode
1861 SecondaryNameNode
1672 DataNode
有这三个进程,就是配置正确了!前面的进程号不重要。
http://localhost:9870
杀死进程 kill - 9 进程号
这个操作执行不了, 因为我们使用字符界面。
hdfs dfsadmin -report // 查看 hdfs 的信息
/// 运行 & 启动 Hadoop
*** 日志: /home/icss/hadoop3/logs
1. 启动 Hadoop HDFS
1. 启动守护进程(Hadoop 的 HDFS 的守护进程)
start-dfs.sh
// 退出守护进程(Hadoop 的 HDFS 的守护进程)
stop-dfs.sh
2. 启动 Hadoop YARN
2. 启动守护进程(Hadoop 的 MapReduce & YARN 的守护进程)
start-yarn.sh
// 退出守护进程(Hadoop 的 MapReduce & YARN 的守护进程 ResourceManager nodemanager)
stop-yarn.sh
– 启动全部守护进程 : start-all.sh
– 退出全部守护进程 : stop-all.sh

  1. 验证:
    jps
    http://localhost:9870
    算pi值hadoop jar /home/icss/hadoop3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.2.jar pi 5 5 yarn resourcemanager -status // 查看 YARN 的ResourceManager 节点的状态 /* start-all.sh 和 start-dfs.sh & start-yarn.sh 自己看下!

参看: https://www.cnblogs.com/zhwl/p/3670997.html
关键内容:
start-all.sh脚本现在已经废弃,推荐使用start-dfs.sh和start-yarn.sh分别启动HDFS和YARN。
在新一代的Hadoop里面HDFS称为统一存储的平台,而YARN称为统一计算的平台。
(1)调用start-dfs.sh启动HDFS。之后JPS会出现NameNode,DataNode,SecondaryNameNode
(2)调用start-yarn.sh启动YARN。之后JPS会出现ResourceManager,NodeManager
对于每个start脚本首先甚至启动过程中用到的所有脚本,首先都是调用libexec/hadoop-config.sh配置相关环境变量
hadoop-config.sh
设置各种环境变量,包括:
HADOOP_PREFIX 整个Hadoop的安装目录
HADOOP_CONF_DIR 配置文件的目录,一般是Hadoop安装目录下的etc/hadoop/
JAVA_HOME 从操作系统环境变量获取,但是在SSH登陆到slave节点可能会出现问题,所以推荐在hadoop-env.sh中也设置一下。
JAVA_HEAP_MAX 启动每个JVM默认的堆大小,目前是-Xmx1000m
CLASSPATH 找Jar包的地方,一般情况下Jar包存在Hadoop安装目录下的share/hadoop/目录下的common,hdfs,httpfs,mapreduce,tools几个子目录下
HADOOP_LOG_DIR 就是存放日志的地方,默认是Hadoop安装目录下的logs目录,这个很重要,运行中出了问题都是要通过log定位的。
NameNode,DataNode,SecondNameNode,ResourceManager,NodeManager的日志默认都在这个目录下。
不过要注意默认的container的log是在/tmp/logs目录下。
HADOOP_LOGFILE
HADOOP_POLICYFILE
JAVA_LIBRARY_PATH Java运行时需要通过JNI调用native lib的环境变量。因为在Hadoop代码中与操作系统紧密相关的一些操作和一些压缩算法是有通过C编写的native的系统实现的。就是libhadoop.so和libhdfs.so这样的系统库,通常放在Hadoop安装目录下的lib/native/里面。
HADOOP_OPTS 这个是启动每个JVM时传递过去的参数
HADOOP_COMMON_HOME
HADOOP_HDFS_HOME
YARN_HOME
HADOOP_MAPRED_HOME
这些环境变量是运行Hadoop和YARN程序的环境变量,和把Hadoop安装在哪个目录下有关系。
start-dfs.sh
(1) 执行hdfs-config.sh设置HDFS专有的环境变量。目前没有HDFS专有的环境变量,在这个文件里再次执行了下hadoop-config.sh
(2) 启动参数:upgrade,rollback还是正常启动。
(3) 然后就是分别调用对应的脚本启动对应的模块
NameNode\DataNode\SecondaryNameNode\ZooKeeper Failover
每个模块都是调用hadoop-daemos.sh启动的。
hadoop-daemons.sh和hadoop-daemon.sh的区别是:
前者启动多台机器上的daemon,后者负责在一台机器上启动daemon,前者调用后者。
连接这两着的桥梁就是sbin/workers.sh,就是通过ssh登陆到slave机器上,然后在每台slave机器上执行hadoop-daemon.sh。
首先看看hadoop-daemons.sh
这个脚本的参数类似这样:
–config /home/orange/hadoop-2.0.0-alpha/etc/hadoop --hostnames localhost --script /home/orange/hadoop-2.0.0-alpha/sbin/hdfs start namenode
因为上面这个例子是启动NameNode,所以带了–hostnames参数,用于指明分别到哪台机器上去运行hadoop-daemon.sh去启动namenode。
如果是启动DataNode则不需要这个参数,因为如果不设定这个参数,会通过读取etc/hadoop/workers文件获取slaves机器信息。
这个脚本的最后有个非常长的命令:
exec " $ bin/workers.sh" --config $ HADOOP_CONF_DIR cd “$ HADOOP_PREFIX” ; “$ bin/hadoop-daemon.sh” --config $ HADOOP_CONF_DIR “$ @”
这个命令表示:在本shell内执行workers.sh脚本,参数是后面那么一堆东西。
workers.sh接收到的参数:
–config /home/orange/hadoop-2.0.0-alpha/etc/hadoop cd /home/orange/hadoop-2.0.0-alpha ; /home/orange/hadoop-2.0.0-alpha/sbin/hadoop-daemon.sh
–config /home/orange/hadoop-2.0.0-alpha/etc/hadoop --script /home/orange/hadoop-2.0.0-alpha/sbin/hdfs start namenode
在这个脚本里面通过ssh登陆到各个slave节点上,然后执行后面的cd进入slave节点的Hadoop安装目录,然后调用hadoop-daemon.sh去执行对应的操作。
hadoop-daemon.sh的参数是
localhost: --config /home/orange/hadoop-2.0.0-alpha/etc/hadoop --script /home/orange/hadoop-2.0.0-alpha/sbin/hdfs start namenode
执行hadoop-env.sh设置环境变量,因为即将启动的JVM是由这个shell启动的,所以这个环境变量会传给JVM。
配置启动单点NameNode或者DataNode的运行环境:
除了hadoop-config.sh里面的以外还有HADOOP_LOG_DIR,HADOOP_PID_DIR,HADOOP_IDENT_STRING等,
这些都是与运行这个daemon的本机相关的变量
最后通过
nohup nice -n $ HADOOP_NICENESS $ hdfsScript --config $ HADOOP_CONF_DIR $ command “$ @” > “$ log” 2>&1 < /dev/null &
启动对应的进程,也就是hdfs start namenode命令。其实是调用 bin/hdfs脚本,启动JVM。
hadoop-daemon.sh这个脚本是在每台机器上启动各种JVM前的准备工作,包括设置环境变量什么的。
因为每个脚本基本都会调用hadoop-config.sh,这个也不例外,
所以一般情况下hadoop-config.sh里面的环境变量。
但是从实际使用经验来看,由于操作系统和SSH的问题,会导致SSH登陆到slave节点之后执行shell脚本的时候获取系统环境变量失效的问题。例如,$ JAVA_HOME环境变量,看hadoop-config.sh这个文件可知 $ JAVA_HOME直接从操作系统环境变量获取。
但是当hadoop-daemons.sh调用workers.sh通过ssh登陆到各个slave节点之后去执行hadoop-daemon.sh时,在获取$ JAVA_HOME时出现失败的情况。而如果在对应的那台机器上执行 echo $ JAVA_HOME是没有问题的。也就是SSH之后的环境变量获取失败。
debian上就出现了这个问题,而在CentOS上却没有这样的问题。
通过搜索网络得知是因为~ /.bashrc不会被SSH调用,而~ /.bash_profile或者~/.profile是会被SSH调用的。
所以需要在~ /.bash_profile或者~ /.profile中通过类似下面的语句执行~/.bashrc
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
hadoop社区为了防止类似的问题,也做了很严谨的策略。在SSH登陆到每台slave之后,都会去调用hadoop-env.sh。
这个文件很重要啊。
要在这个hadoop-env.sh文件里设置$ JAVA_HOME,但是系统环境变量里已经设置了$JAVA_HOME,难道一个应用程序的环境变量比系统的还管用?
所以就试了下这个hadoop-env.sh不设置 $ JAVA_HOME,结果就出现了上面所说的问题。
看来hadoop-env.sh正如其名,有关Hadoop的环境变量应该设置在这里,这样才能在无论什么样的底层系统环境下都能稳定运行。
start-yarn.sh
注意到这个脚本里不再执行hadoop-config.sh,而是执行yarn-config.sh。配置环境变量。
(实际上yarn-config.sh还是会调用hadoop-config.sh的)
“$bin”/yarn-daemon.sh --config $YARN_CONF_DIR start resourcemanager
指定日志和pid的格式,也就是:yarn-orange-nodemanager-orange.log
yarn-orange-resourcemanager-orange.log
yarn-orange-nodemanager.pid
yarn-orange-resourcemanager.pid
通过执行下面这行代码,启动ResourceManager对应的JVM
nohup nice -n $YARN_NICENESS " $ YARN_HOME"/bin/yarn --config $YARN_CONF_DIR $command " $@" > " $log" 2>&1 < /dev/null &
" $bin"/yarn-daemons.sh --config $YARN_CONF_DIR start nodemanager
和启动DataNode类似,也是通过SSH到每台slave节点上之后,执行yarn-daemon.sh启动对应的NodeManager。
exec " $bin/slaves.sh" --config $YARN_CONF_DIR cd " $YARN_HOME" ; " $bin/yarn-daemon.sh" --config $YARN_CONF_DIR " $@"
注意这里面也存在和上面一样的问题,所以推荐在yarn-env.sh里面也设置相关环境变量,要不然就会出现启动Job的时候找不到类。。。
!!总的来说这个启动过程分为多个层次,分别是:整个集群级别的配置,单台机器OS级别的配置,单个JVM级别的配置。
对那句话“系统总是不可靠的,我们要通过软件冗余来使得系统更加可靠”有了更深层次的认识。
*/
至此,伪分布式模式安装配置完成。
备份,并还原,以便 集群(分布式)的安装。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值