centos7下hadoop环境搭建

实验目的:

为5台主机搭建hadoop平台,为之后hbase做准备。

实验步骤:

0x01硬件条件:

5台centos7主机,IP地址:x.x.x.46~50。机器的名称分别为lk,node1,node2,node3,node4。
实验条件默认使用root账户,有需要切回普通用户的情况我会提到。

0x02材料准备

  1. 首先输入命令[root@lk ~]# which java
    返回:/usr/bin/java
  2. 之后输入[root@lk ~]# ls -lrt /usr/bin/java
    返回:lrwxrwxrwx. 1 root root 22 4月 29 2015 /usr/bin/java -> /etc/alternatives/java
  3. 之后输入:[root@lk ~]# ls -lrt /etc/alternatives/java
    返回lrwxrwxrwx. 1 root root 74 4月 29 2015 /etc/alternatives/java -> /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.79-2.5.5.1.el7_1.x86_64/jre/bin/java
  4. 之后编辑:[root@lk ~]# vim /etc/profile
    添加如下内容:
export PATH=$PATH:$HADOOP_HOME/bin
    export PATH=$PATH:$HADOOP_HOME/bin
    export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.79-2.5.5.1.el7_1.x86_64
    export JRE_HOME=$JAVA_HOME/jre
    export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
    export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH:$HADOOP_HOME/bin
  1. 使之生效:[root@lk ~]# source /etc/profile
  2. 以后可以验证一下:[root@lk ~]# echo $JAVA_HOME
    返回:/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.79-2.5.5.1.el7_1.x86_64
    代表成功生效

以上配置对本实验失效了。。。原因是openjdk的结构和普通的jdk包结构不太一样,导致有些hadoop有些地方找不到路径
正确配置如下:

export JAVA_HOME=/usr/jdk-9.0.1/
export CLASSPATH=$JAVA_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$PATH:$HADOOP_HOME/bin
  • 使之生效:source /etc/profile

0x03环境搭建

  • 将下载的hadoop包解压缩在/usr/hadoop-2.7.3目录下。
    解压后目录为/usr/hadoop-2.7.3/hadoop/
  • 创建如下文件夹
mkdir  /usr/hadoop-2.7.3/tmp  
mkdir  /usr/hadoop-2.7.3/var  
mkdir  /usr/hadoop-2.7.3/dfs  
mkdir  /usr/hadoop-2.7.3/dfs/name  
mkdir  /usr/hadoop-2.7.3/dfs/data
  • 设置环境变量:vim /etc/profile
  • 写入:
    export HADOOP_HOME=/usr/hadoop-2.7.3/hadoop
    export PATH=$PATH:$HADOOP_HOME/bin
  • 使之生效:source /etc/profile
  • hadoop配置
  • 进入$HADOOP_HOME/etc/hadoop目录,配置 hadoop-env.sh等。涉及的配置文件如下:
hadoop/etc/hadoop/hadoop-env.sh 
hadoop/etc/hadoop/yarn-env.sh 
hadoop/etc/hadoop/core-site.xml 
hadoop/etc/hadoop/hdfs-site.xml 
hadoop/etc/hadoop/mapred-site.xml 
hadoop/etc/hadoop/yarn-site.xml
hadoop/etc/hadoop/slaves

具体修改如下:
配置hadoop-env.sh

# The java implementation to use.
#export JAVA_HOME=/home/graph/Desktop/java
export JAVA_HOME=${JAVA_HOME}
  • 配置yarn-env.sh
    需要修改JAVA_HOME的路径不能直接用$JAVA_HOME需要把具体路径敲上去。
# some Java parameters
# export JAVA_HOME=/home/y/libexec/jdk1.6.0/
export JAVA_HOME=/usr/jdk-9.0.1/
  • 配置core-site.xml
    add:
<configuration>
        <property>
        <name>hadoop.tmp.dir</name>
        <value>/usr/hadoop-2.7.3/tmp</value>
        <description>Abase for other temporary directories.</description>
   </property>
   <property>
        <name>fs.default.name</name>
        <value>hdfs://lk:9000</value>
   </property>
</configuration>

注意修改路径和地址。

  • 配置hdfs-site.xml
    add:
<property>
   <name>dfs.name.dir</name>
   <value>/usr/hadoop-2.7.3/dfs/name</value>
   <description>Path on the local filesystem where theNameNode stores the namespace and transactions logs persistently.</description>
</property>
<property>
   <name>dfs.data.dir</name>
   <value>/usr/hadoop-2.7.3/dfs/data</value>
   <description>Comma separated list of paths on the localfilesystem of a DataNode where it should store its blocks.</description>
</property>
<property>
   <name>dfs.replication</name>
   <value>2</value>
</property>
<property>
      <name>dfs.permissions</name>
      <value>false</value>
      <description>need not permissions</description>
</property>
</configuration>
  • 配置mapred-site.xml
    add:
<configuration>
<property>
    <name>mapred.job.tracker</name>
    <value>lk:49001</value>
</property>
<property>
      <name>mapred.local.dir</name>
       <value>/usr/hadoop-2.7.3/var</value>
</property>
<property>
       <name>mapreduce.framework.name</name>
       <value>yarn</value>
</property>
</configuration>
  • 配置yarn-site.xml
    add:
<configuration>

<!-- Site specific YARN configuration properties -->

<property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
</property>
<property>
        <name>yarn.resourcemanager.webapp.address</name>
        <value>10.113.10.46:8099</value>
</property>
<property>
        <name>yarn.resourcemanager.hostname</name>
        <value>lk</value>
   </property>
   <property>
        <description>The https adddress of the RM web application.</description>
        <name>yarn.resourcemanager.webapp.https.address</name>
        <value>${yarn.resourcemanager.hostname}:8090</value>
   </property>
   <property>
        <name>yarn.resourcemanager.resource-tracker.address</name>
        <value>${yarn.resourcemanager.hostname}:8031</value>
   </property>
   <property>
        <description>The address of the RM admin interface.</description>
        <name>yarn.resourcemanager.admin.address</name>
        <value>${yarn.resourcemanager.hostname}:8033</value>
   </property>
   <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
   </property>
   <property>
        <name>yarn.scheduler.maximum-allocation-mb</name>
        <value>1537</value>
        <discription>每个节点可用内存,单位MB,默认8182MB</discription>
   </property>
   <property>
        <name>yarn.nodemanager.vmem-pmem-ratio</name>
        <value>2.1</value>
   </property>
   <property>
        <name>yarn.nodemanager.vmem-check-enabled</name>
        <value>false</value>
</property>

</configuration>
  • 配置slaves文件:vim slaves
node1
node2
node3
node4
  • 配置其他所有节点机器:由于lk是namenode,其余4台为datanode,所以除了最后一步配置slaves,其余完全相同,可以使用scp -r /usr/hadoop-2.7.3/ xxx@x.x.x.x:~/完全复制过来。注意台机器还需要配置java环境。
  • 最后调整权限,我们是在root权限下进行修改操作,之后需要退回到普通用户权限,但是普通用户默认是不可以修改usr文件夹内容的,所以将hadoop-2.7.3文件夹整体提权.
    具体权限如下:sudo chown xxx:xxx -R hadoop-2.7.3/对每台机器都操作一次。

0x04 Hadoop 启动测试

x.x.x.47~50的机器是datanode,不需要进行其他操作,以下在namenode下进行:

  • 进入bin目录,初始化:./hadoop namenode -format
    如果如图所示,没有报错,就说明初始化成功
  • centos7怎么安装xrdp centos7怎么安装hadoop_centos7怎么安装xrdp

  • 退出bin目录,进入sbin,执行:./start-all.sh
  • 如果是首次启动,系统会问yes/no,回答yes即可。
  • 之后输入jps查看,主节点:
24816 ResourceManager
24387 NameNode
27619 Jps
24635 SecondaryNameNode

slaves节点:

27955 NodeManager
30564 Jps
27816 DataNode
  • 如果结果如上所示,说明成功。
  • 进入网页:x.x.x.46:8088查看工作节点
  • 进入网页:x.x.x.46:50070查看概述

0x05错误提示:

  • 首先如果jps 其他节点发现没有datanode的话说明配置有问题,可以去子节点的目录下logs文件夹里hadoop-qsb-datanode-xxx.log查看出错原因。我这里出现过2次错误,如果有相同问题的话可以直接参照修改。
    首先是复制过去的时候新建的那几个文件夹里要空的,如果有东西的话需要手动删除。
    其次是权限问题,如果遇到如无法访问的报错的话试着重新执行一遍指令:sudo chown xxx:xxx -R hadoop-2.7.3/
  • 诶还有实例需要跑呀,那随便跑一下吧,然后boom,,,运行一个search的实例,具体命令如下:
hadoop dfs -mkdir input //创建input文件夹有的童鞋可能需要加上-p
hadoop dfs -put /usr/hadoop-2.7.3/hadoop/etc/hadoop/*.xml input //倒入一些文件进去 
hadoop dfs -ls input //查看一下文件
hadoop jar ../share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar grep input output 'dfs[a-z.]+' //筛选出格式为dfs*的字符串
hadoop dfs -ls output
hadoop dfs -cat output/part-r-00000 //查看输出文件

然后第一次报这个错误:

17/11/17 09:10:24 INFO mapreduce.Job:  map 0% reduce 0%
17/11/17 09:10:35 INFO mapreduce.Job:  map 20% reduce 0%
17/11/17 09:10:36 INFO mapreduce.Job:  map 60% reduce 0%
17/11/17 09:10:38 INFO mapreduce.Job:  map 80% reduce 0%
17/11/17 09:10:43 INFO mapreduce.Job:  map 100% reduce 0%
17/11/17 09:10:48 INFO mapreduce.Job:  map 100% reduce 7%

17/11/17 09:13:40 INFO mapreduce.Job: Task Id : attempt_1510879394295_0002_r_000000_0, Status : FAILED
Error: org.apache.hadoop.mapreduce.task.reduce.Shuffle$ShuffleError: error in shuffle in fetcher#2

可以看到啊,哪个map应该是没啥毛病,然后reduce在7%卡住了,然后过一会报下面的错误,百度一下发现是内存爆炸,结合我当时在yarn-site.xml里的配置:

<property>
        <name>yarn.scheduler.maximum-allocation-mb</name>
        <value>2048</value>
        <discription>每个节点可用内存,单位MB,默认8182MB</discription>
   </property>
   <property>
        <name>yarn.nodemanager.resource.memory-mb</name>
        <value>2048</value>
</property>

好吧是我的虚拟机太渣了,把第一段去掉,第二段的2048改成1537(最小1536),再试一次成功。
输出应该如下:

17/11/17 20:58:37 INFO mapreduce.Job:  map 0% reduce 0%
17/11/17 20:59:15 INFO mapreduce.Job:  map 67% reduce 0%
17/11/17 20:59:37 INFO mapreduce.Job:  map 100% reduce 0%
17/11/17 20:59:40 INFO mapreduce.Job:  map 100% reduce 100%
17/11/17 20:59:42 INFO mapreduce.Job: Job job_1510923270204_0002 completed successfully
17/11/17 20:59:43 INFO mapreduce.Job: Counters: 50
...
下面是一些统计信息
...

实例跑起来应该没什么问题了吧,之后又问题再改。
对输出如下:

2   dfs.replication
1   dfsadmin
1   dfs.permissions
1   dfs.name.dir
1   dfs.data.dir