Bootstrap

基于linux的Hadoop配置文件修改和启动

前言

        之前安装的步骤是安装hadoop的前置工作,现在我们来到了真正的操作环节,目前的操作只需要在master上进行执行,然后可以通过复制到s1,s2。

        eg:root/admin,三台都是

        eg:master/admin

        eg:worker1/admii

解压hadoop-2.7.7文件到/usr/local/ 目录下

之前我已经上传了hadoop配置文件在/opt目录下

现在我要将他解压到/usr/local目录下

命令:

tar -xzvf  /opt/hadoop-2.7.7.tar.gz  -C /usr/local/

   ,即将opt下hadoop文件解压到/usr/local目录下

 进入/usr/local目录下查看一下

修改hadoop 配置文件(hadoop-env.sh   core-site.xml )后面还有三个

前言

这一次是修改它的配置文件了,本次有hadoop-env.sh  yarn-env.sh  coresite.xml 三个xml文件。

进入到hadoop配置文件界面

 /usr/local/hadoop-2.7.7/etc/hadoop

 编辑hadoop-env.sh配置文件

添加环境变量,这个环境变量是JDK的

#配置java环境变量
export JAVA_HOME=/usr/java/jdk1.8.0_144
export JRE_HOME=$JAVA_HOME/jre
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

 修改完,保存退出,source一下,让文件生效

source hadoop-env.sh 

修改core-site.xml配置文件

vi core-site.xml

添加如下内容:

<configuration>
    <!--master及其端口-->
    <property>
        <name>fs.default.name</name>
        <value>hdfs://master:9000</value>
    </property>
    <!--指定hadoop运行时产生文件的存放目录,这个目录一定要创建,三台都要-->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/opt/hadooptmp</value>
    </property>
</configuration>

完事后保存配置 ,记得创建目录

注意:FS是给两个主机用的,单节点的用defaultname

如下图,配置到name,下面的value是主机名,9000端口 

 ​​​

下面的这个地址临时文件。hadoop运行的临时文件地址,我们自己指定一个目录,我想放在opt目录下:

修改hadoop 配置文件(hdfs-site.xml  mapred-site.xml  yarn-site.xml   slaves)

hdfs-site.xml  mapred-site.xml  yarn-site.xml   slaves

修改hdfs-site.xml配置文件

小技巧:注意hdfs-site.xml 中配置的副本在不同机器上,一般设置2~3就行,我们两台从机,就是增加容错性

vi hdfs-site.xml

修改如下图: 

<configuration>
    <!--保存副本数,默认是3,我配置为2-->
    <property>
        <name>dfs.replication</name>
        <value>2</value>
    </property>
    <!--是否启用hdfs权限,当值为false时,代表关闭-->
    <property>
        <name>dfs.permissions.enabled</name>
        <value>false</value>
    </property>
</configuration>

 保存配置。

mapred-site.xml

        对于mapred-site.xml ,如果我们这里没有这个文件怎么办:目录下是mapred-site.xml.tmplate,可以改完此配置后为其重命名mapred-site.xml 。我这里就没有,如果有,就不必重命名,直接修改就好。

  vi 

修改配置:
 

<configuration>
    <property>        
        <name>mapred.job.tracker</name>                  
        <value>master:9001</value>       
    </property>
  <property>
        <name>mapreduce.jobhistory.address</name>        
        <value>master:10020</value>
    </property>

    <!--配置MR资源调度框架YARN-->
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
    <property>
        <name>mapred.child.tmp</name>
        <value>/opt/tempmr</value>
    </property>

</configuration>

如下图

 修改完保存配置,随后重命名为 mapred-site.xml

mv mapred-site.xml.template  mapred-site.xml

功能

        配置这个是干啥用的,framework有三个模式,第一个class,yarn,local,这个最好看官网,我的解释能力有限。已知的是class已经淘汰了,yarn是计算系统,local是本地的,我们用的是yarn,构建框架,使用yarn进行资源配置和管理。

编辑yarn配置文件 yarn-site.xml 

        在这里,资源管理器的hostname我们指定机器名,设置为主机,我的是master;还有一个shuffle参数,它的值是对shuffle的一个命名,高本版后只允许 字符,数字,下划线等,以前有. ,我们把.改为_

vi yarn-site.xml 

加入下面的内容,如下图

<configuration>

<!-- Site specific YARN configuration properties -->
    <!--资源管理器,master节点-->
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>master</value>
    </property>
    <!--配置节点管理器上运行的附加服务-->
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <!--关闭虚拟内存检测-->
    <property>
        <name>yarn.nodemanager.vmem-check-enabled</name>
        <value>false</value>
    </property>
</configuration>


 

修改完保存一下配置

slaves文件

(注:现在由于非洲老表那边,在3.几版本的hadoop,都叫做worker,我现在用的是2.7.7,所以这个文件名还是slaves )

这个文件里文件名和ip地址都行,我的叫做worker1,worker2,填进slaves就行,一行一个主机名

(注:我之前主机名前都带一个hadoop-,我现在简化了把他删了。)

主:namenode ,用来管理NN机器的名称

从:datanode ,数据节点的机器名称

编辑yarn-env.sh配置文件(待定,目前不用修改)

将master上的hadoop-2.7.7分配到worker1及worker2机器中

 将master文件夹拷贝到worker1及worker2中了。

在master上使用scp -r 命令递归的复制到worker中,如果之前有直接覆盖就行

scp -r /usr/local/hadoop-2.7.7 worker1:/usr/local/hadoop-2.7.7

scp -r /usr/local/hadoop-2.7.7 worker2:/usr/local/hadoop-2.7.7

。。 

备注:

1、如果此命令报错,我的问题是我在后面把三台的hostname改了,因此主机找到不worker地址,需要把三台的/etc/hosts中对应的主机名改了就行,当然可以直接使用hadoop-worker1也行。原来的是

改过后

2、还有一点,我使用scp命令传输文件时,出现传输过去了,但是在另一台机器上打开时发现不是我传输过去的文件,需要我讲源文件删除,再重新scp发送就可以了。

        一开始我以为传输不过去,于是我做了一个小demo,将文件传输到/opt文件下,scp命令没问题,因此我意识到是文件未删除无法进行覆盖的缘故。

(希望后续随水平提高能够有更好的解释)

记录一个问题

在后续进行测试时:发现三台机子的时间对不上,只有master是正确的,如图所示,定位问题为

我只在master上配置了时间,忘记在worker上配置时间同步了,因此需要在这两台机器上进行对应的时间同步操作。

Hadoop系统环境变量配置

 ​​前言

系统环境变量

添加 

三台都要配置,现在master上,追加到文件末尾就行,我之前实在/etc/profile中添加的 

source一下

source 文件才会生效,不然会找不到命令

source /etc/profile

创建数据目录

这个配置好文件其实就可以创建了,三台都要配置i

  之前修改 core-site.xml文件时,我们有一个hadoop.tmp.dir,要建立好这个文件夹,三台机器都要建立。

 

没格式化之前使用命令

会出现如下错误,因此需要格式化一下,保存快照

启动Hadoop集群

启动hadoop集群以此检验我们的配置是否正确

格式化文件系统

在格式化之前最好给三台机子做一个快照,保存一次,因为格式化只能执行一次。在master节点上执行如下命令        

hadoop namenode -format

如果看到如下信息,则表示格式化成功,出现其他例如exception及error则表示出现异常

启动Hadoop

1、只需要在master上面启动,进入如下sbin目录下

cd /usr/local/hadoop-2.7.7/sbin/

随后执行start-all.sh,启动所有,包括了start-dfs.sh及start-yarn.sh,启动完毕

 ./start-all.sh

启动结果如下:

 以上我们就启动完毕了,注意我使用root用户启动的。

2、另一种启动方式分布启动,分两步

        1)第一步启动文件系统start-dfs.sh

        如果报错,查看日志logs,并检查响应配置文件hdfs-site.xml及core-site.xml.

        2)第二步启动yarn计算框架

        如果报错,查看logs,并检查对应配置文件yarn-site.xml及mapred-site.xml。

启动集群可能会遇到ssh权限问题

到这一步,能使得启动出现问题的无非是权限问题,另一个就是配置文件的问题,排除配置文件问题,那就是权限问题,搞定了,后面就可以了

报错如下:
        root@worker2's password: worker2: Permission denied, please try again.

        root@worker1's password: worker1: Permission denied, please try again.

        0.0.0.0: Host key verification failed.
        worker1: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
        worker2: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).

解决:

权限问题,我的解决方法比较暴力,我把root用户,hadoop用户的三台机子的ssh免密都配置了一遍,ssh公钥忘记追加到authorized_keys中了,将master节点的id_rsa.pub 文件内容追加到authorized_keys文件中。

关于ssh:如何使用id_rsa.pub密钥在远程服务器上附加authorized_keys | 码农家园

#使用终端查看集群状态

hadoop dfsadmin -report

 

jps查看进程

namenode,datanode, RM ,SN,NM,出现代表启动成功,安装一大半了。

 测试Hadoop集群实例

蒙特卡洛方法

进入到 /usr/local/hadoop-2.7.7/share/hadoop/mapreduce看看jar包是否存在,再执行下面语句:

hadoop jar /usr/local/hadoop-2.7.7/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar pi 10 10

 出现下面的情况,说明我们的hadoop安装成功了

测试mapreduce时如果出现的问题:

搭建好Hadoop环境后,执行命令测试MapReduce环境出现如下错误:

Hadoop之hadoop-mapreduce-examples测试执行及报错处理_恒悦sunsite的博客-CSDN博客

hadoop :java.io.FileNotFoundException: File does not exist:_wx5caecf2ed0645的技术博客_51CTO博客

java.io.FileNotFoundException: File does not exist: hdfs://xxx_FishMAN_已存在的博客-CSDN博客

hadoop jar /usr/local/hadoop-2.7.7/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar pi 10 10
......
java.io.FileNotFoundException: File does not exist: hdfs://master:9000/user/root/QuasiMonteCarlo_1688449896784_1689988777/out/reduce-out
        at org.apache.hadoop.hdfs.DistributedFileSystem$22.doCall(DistributedFileSystem.java:1301)
        at org.apache.hadoop.fs.FileSystemLinkResolver.resolve(FileSystemLinkResolver.java:81)
......

 问题分析:看这条,

        java.io.FileNotFoundException: File does not exist:         hdfs://master:9000/user/root/QuasiMonteCarlo_1688449896784_1689988777/out/reduce-out
        说是找不到文件,什么文件?怎么创建?再查资料,可能是找不到主类?并不是,再查,是否是hadoop文件的配置和项目代码的引用配置文件是否冲突了?并没有,

可能是java环境配置问题,还有一个可能是执行语句写错了,检查配置文件,没啥问题啊!!

解决:我切换到hadoop用户,再切换回来root用户,在执行就行了?!!!!!

这是什么鬼?

shit! 消耗好几个小时。。。。什么鬼。

Hadoop集群的状态查看

 我用的是谷歌浏览器,直接地址栏键入50070端口的链接

http://master:50070/

 以此查看DataNode与NameNode是否正常。

 

 停止Hadoop 

普通停止和分布式停止

1、普通停止:

在sbin目录下执行

  ./stop-all.sh

2、分布停止hadoop集群:

在sbin目录下执行 ./stop-dfs.sh 停止文件系统    ./stop-yarn.sh 停止yarn调度

;