0


推荐系统(5)——Hadoop完全分布式(开发重点)

开发重点,Hadoop完全分布式搭建

** 1. 将hadoop100上的拷贝到101和102上**

** 2. ssh免密登录**

** 3. 集群配置**

** 4. **制作并使用xsync分发脚本(可忽略)

** 5. 群起集群并测试**

1. 将hadoop100上的拷贝到101和102上

**** (1)scp(secure copy安全****拷贝

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

   (2)基本语法

            **scp    -r          $pdir/$fname                  $user@$host:$pdir/$fname**

** 命令 递归 要拷贝的文件路径/名称 目的地用户@主机:目的地路径/名称**

    (3)案例实操(可以从hadoop100上推到101和102上,对应下列(a)操作,也可以在101和102上从hadoop100上拉取,对应下列(b)操作,其实a,b任选一个即可)

    **(a)在hadoop100上,将hadoop100中/opt/module/jdk1.8.0_212目录拷贝到hadoop101,hadoop102上。**
# 都在hadoop100上操作,将jdk和hadoop分别推给101和102
sudo scp -r jdk1.8.0_212/ [用户名]@hadoop101:/opt/module
sudo scp -r hadoop-3.1.3/ [用户名]@hadoop101:/opt/module

sudo scp -r jdk1.8.0_212/ [用户名]@hadoop102:/opt/module
sudo scp -r hadoop-3.1.3/ [用户名]@hadoop102:/opt/module

注意:这个地方可能会报一个错误说没有权限,那么我们需要登录到目标机器上也就是101上,修改权限。102同理

sudo chmod 777 module
sudo chmod 777 software
   **(b)在hadoop101和102上,将hadoop100中/opt/module/hadoop-3.1.3目录拷贝到hadoop101,102上。**
# 在hadoop101上操作,将100上的jdk和hadoop拉了过来
scp -r [用户名]@hadoop100:/opt/module/hadoop-3.1.3 ./
scp -r [用户名]@hadoop100:/opt/module/hadoop-3.1.3 ./

# 在hadoop102上操作,将100上的jdk和hadoop拉了过来
scp -r [用户名]@hadoop100:/opt/module/hadoop-3.1.3 ./
scp -r [用户名]@hadoop100:/opt/module/hadoop-3.1.3 ./

2. ssh免密登录

(1)免密登录原理

(2)生成公钥和私钥

ssh-keygen -t rsa

然后敲(三个回车),就会生成两个文件id_rsa(私钥)、id_rsa.pub(公钥)

(3)将公钥拷贝到要免密登录的目标机器上

ssh-copy-id hadoop100
ssh-copy-id hadoop101
ssh-copy-id hadoop102

注意:

还需要在hadoop103上配置一下无密登录到hadoop102、hadoop103、hadoop104服务器上。

还需要在hadoop104上配置一下无密登录到hadoop102、hadoop103、hadoop104服务器上。

还需要在hadoop102上配置一下无密登录到hadoop102、hadoop103、hadoop104服务器上。

(4).ssh文件夹下(~/.ssh)的文件功能解释

known_hosts

记录ssh访问过计算机的公钥(public key)

id_rsa

生成的私钥

id_rsa.pub

生成的公钥

authorized_keys

存放授权过的无密登录服务器公钥

3. 集群配置

**** (1)****集群部署规划

    注意:

            1. NameNode和SecondaryNameNode不要安装在同一台服务器

            2. ResourceManager也很消耗内存,不要和NameNode、SecondaryNameNode配置在同一台机器上。

hadoop100

hadoop101

hadoop102

HDFS

NameNode

DataNode

DataNode

SecondaryNameNode

DataNode

YARN

NodeManager

ResourceManager

NodeManager

NodeManager

**** (2)配置文件说明****

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

            (1)默认配置文件:

要获取的默认文件

文件存放在Hadoop的jar包中的位置

[core-default.xml]

hadoop-common-3.1.3.jar/core-default.xml

[hdfs-default.xml]

hadoop-hdfs-3.1.3.jar/hdfs-default.xml

[yarn-default.xml]

hadoop-yarn-common-3.1.3.jar/yarn-default.xml

[mapred-default.xml]

hadoop-mapreduce-client-core-3.1.3.jar/mapred-default.xml

          (2)自定义配置文件:

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

**** (3)配置集群****

             (1)核心配置文件:配置core-site.xml
cd /opt/module/hadoop-3.1.3/etc/hadoop
vim core-site.xml
# 配置内容如下
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
    <!-- 指定NameNode的地址,这个配置的是三台服务器之间的内部通讯地址 -->
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://hadoop100:8020</value>
    </property>

    <!-- 指定hadoop数据的存储目录 -->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/opt/module/hadoop-3.1.3/data</value>
    </property>

    <!-- 配置HDFS网页登录使用的静态用户为atguigu -->
    <property>
        <name>hadoop.http.staticuser.user</name>
        <value>[用户名]</value>
    </property>
</configuration>
            (2) HDFS配置文件:配置hdfs-site.xml
cd /opt/module/hadoop-3.1.3/etc/hadoop
vim hdfs-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
    <!-- nn web端访问地址-->
    <property>
        <name>dfs.namenode.http-address</name>
        <value>hadoop100:9870</value>
    </property>
    <!-- 2nn web端访问地址-->
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>hadoop102:9868</value>
    </property>
</configuration>
           (3)YARN配置文件: 配置yarn-site.xml
cd /opt/module/hadoop-3.1.3/etc/hadoop
vim yarn-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
    <!-- 指定MR走shuffle -->
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>

    <!-- 指定ResourceManager的地址-->
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>hadoop101</value>
    </property>

    <!-- 环境变量的继承 -->
    <property>
        <name>yarn.nodemanager.env-whitelist</name>
        <value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
    </property>
</configuration>
            (4)MapReduce配置文件:配置mapred-site.xml

            默认是在本地运行,通过自定义的配置让mapredece在YARN的资源调度下运行
cd /opt/module/hadoop-3.1.3/etc/hadoop
vim mapred-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
    <!-- 指定MapReduce程序运行在Yarn上 -->
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>
    目前我们只是在hadoop100上将自定义的文件进行了配置,而101和102上并没有,那么我们需要将配置好的文件分别分发到101和102上。

            (5)配置workers
vim /opt/module/hadoop-3.1.3/etc/hadoop/workers
    ![](https://img-blog.csdnimg.cn/33be9a72c2eb4427952c2f2422dbd8d0.png)        

    **注意:这个配置文件中,千万不要又空格或者空行 **

4. 制作并使用xsync分发脚本****(如果大家想要在每个机子上自己手动修改这四个配置文件,那么可以忽略这一步,只是为了简便操作)

    我们期望写一个xsync的脚本,在任何路径下都可以使用,也就是全局的环境变量,那么我们只需要打印看一下全局的环境变量都有哪些,然后找一个目录下边进行创建即可。

    查看所有的全局环境变量: echo $PATH

    发现在我们的用户目录下即可

     脚本实现:

    在/home/[用户名]/bin目录下创建xsync文件
cd /home/[用户名]
mkdir bin
cd bin
vim xsync
    在该文件中编写如下代码
#!/bin/bash

#1. 判断参数个数
if [ $# -lt 1 ]
then
    echo Not Enough Arguement!
    exit;
fi

#2. 遍历集群所有机器
for host in hadoop100 hadoop101 hadoop102
do
    echo ====================  $host  ====================
    #3. 遍历所有目录,挨个发送

    for file in $@
    do
        #4. 判断文件是否存在
        if [ -e $file ]
            then
                #5. 获取父目录
                pdir=$(cd -P $(dirname $file); pwd)

                #6. 获取当前文件的名称
                fname=$(basename $file)
                ssh $host "mkdir -p $pdir"
                rsync -av $pdir/$fname $host:$pdir
            else
                echo $file does not exists!
        fi
    done
done
# 修改脚本 xsync 具有执行权限
chmod +x xsync

# 测试脚本,同步分发一个bin目录尝试一下,这个自定义的命令能不能使用
xsync /home/[用户名]/bin

*! 注意此时的xsync命令虽然可以分发,但是如果一些需要传输权限的为文件还没有解决
    同步分发脚本做完以后,将我们刚才在hadoop100上修改的**配置文件**同时分发到101和102服务器上。同时把修改的**workers**也分发给每个机器
# 分发修改完的hadoop配置文件
xsync /opt/module/hadoop-3.1.3/etc/hadoop/

# 查看是否分发成功,在101和102机子上输入
cat /opt/module/hadoop-3.1.3/etc/hadoop/core-site.xml

# 分发修改完的workers
xsync /opt/module/hadoop-3.1.3/etc

5. 群起集群并测试

  **  (1)启动集群**

            1)****如果集群是第一次启动****,需要在hadoop100节点格式化NameNode(注意:格式化NameNode,会产生新的集群id,导致NameNode和DataNode的集群id不一致,集群找不到以往数据。如果集群在运行过程中报错,需要重新格式化NameNode的话,一定要先停止namenode和datanode进程,并且要删除所有机器的**data**和**logs**目录,然后再进行格式化。)
# 格式化namenode
hdfs namenode -format
            2)启动HDFS:进入到hadoop-3.1.3目录下执行  **sbin/start-dfs.sh**

    注意:再此启动阶段报了错如下图:

明明已经配置了jdk呀,每个机子也都能查到,如果小伙伴们碰到了同样问题

解决方法:

                     在hadoop-env.sh中,再显示地重新声明一遍JAVA_HOME

成功!!!

    (3)Web端查看HDFS的NameNode

            (a)浏览器中输入:http://hadoop100:9870

            (b)查看HDFS上存储的数据信息        

    (4)****在配置了ResourceManager的节点(********hadoop101********)****启动YARN: sbin/start-yarn.sh

    (5)Web端查看YARN的ResourceManager

            (a)浏览器中输入:http://hadoop101:8088

            (b)查看YARN上运行的Job信息

当我们设置完成了以后可以跟我们得需求图对比一下:

hadoop100

hadoop101

hadoop102

HDFS

NameNode

DataNode

DataNode

SecondaryNameNode

DataNode

YARN

NodeManager

ResourceManager

NodeManager

NodeManager

**** (2)集群基本测试****

             1)上传文件到集群
# 在根目录下创建一个input
hadoop fs -mkdir /wcinput

# 把word.txt上传上去
hadoop fs -put /opt/module/hadoop-3.1.3/wcinput/word.txt  /wcinput

    那么这只是一个页面的显示,而实际的数据是存储在这个路径下的。

3)执行wordcount程序(还是以wordcount为例,只不过这次我们使用集群的方式)

hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /input /output
    **注意这个地方在使用集群的方式运行wordcount的时候又又又出错了,报错信息如下图**

这个提示也很明显说java环境不好使了,提供一下我得解决办法

cd etc/hadoop
vim hadoop-env.sh

# 添加一个全局的java环境变量
export JAVA_HOME=/opt/module/jdk1.8.0_212 


本文转载自: https://blog.csdn.net/qq_58165390/article/details/124562073
版权归原作者 Xiaoduan~ 所有, 如有侵权,请联系我们删除。

“推荐系统(5)&mdash;&mdash;Hadoop完全分布式(开发重点)”的评论:

还没有评论