360SDN.COM

首页/Hadoop/列表

hadoop运行环境搭建

来源:大数据和云计算技术  2016-12-01 12:37:42    评论:0点击:

森哥/洋哥hadoop系列,非常适合初学者:

Hive 元数据表结构详解

HDFS学习:HDFS机架感知与副本放置策略

Yarn【label-based scheduling】实战总结(一)

Yarn【label-based scheduling】实战总结(二)


1     Hadoop运行环境搭建

1.1        单机伪分布式环境

1.1.1 系统信息

Linux版本:


 

1.1.2  准备工作

1.1.2.1  安装jdk7.0


 

1.1.2.2  配置/etc/profile

增加以下配置项,然后执行source /etc/profile

#set java environment

export JAVA_HOME=/opt/java/

exportCLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar

exportPATH=$JAVA_HOME/bin:$PATH

 

#for hadoop

exportHADOOP_HOME=/home/hadoop-2.7.1

exportPATH=$PATH:$HADOOP_HOME/bin

exportPATH=$PATH:$HADOOP_HOME/sbin

 

1.1.2.3  修改Linux机器名

  • 执行hostname master命令,其中master是要修改的机器名

  • 修改/etc/sysconfig/network文件,如下所示:

  • 修改/etc/hosts,如下所示


 

1.1.2.4  ssh无密码验证配置

  • 在本地主机生成密钥对

ssh-keygen -t rsa 

执行以上命令并一直回车,生成一个密钥对:id_rsa(私钥文件和id_rsa.pub(公钥文件。默认被保存在~/.ssh/目录下。

  • 将公钥追加到 authorized_keys 文件中

cat ~/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys (自己与自己交换密钥)

 

1.1.2.5  关闭系统防火墙

通过以下方式查看防火墙是否关闭,如果出现以下结果,则说明防火墙没关闭:

如果结果如下:


则说明防火墙已经关闭了。

注:还有一种查看防火墙是否关闭的方式,即使用命令:chkconfig--list | grep iptables

如下所示则说明防火墙已经关闭:


以下场景则说明防火墙没有关闭:

以下提供三种方式关闭防火墙:

(1)   chkconfig --level 2345 iptablesoff chkconfig iptables off

(2)   service iptables stop

(3)   关闭方式如下图:

这三种方式,只有第一种是永久关闭,(2)(3)只要机器重启,则又需要重新去关闭。

关闭防火墙之后的场景如下图:

搭建Hadoop时一定要记得关闭防火墙,不然会出现一些很诡异的问题。

 

1.1.2.6  分区【非必要操作,除非搭环境时用到分区】

parted -s /dev/sdb mkpartdata 0 898G(修改为实际的大小)

如此会报下面的警告:

Warning: The resultingpartition is not properly aligned for best performance.

但用下面的语句来分区时,并不会报上面的警告了

parted -s /dev/sdb mkpartdata 2048s 100%

 

知识点扩展-->>

如果要把/dev/sdb划分为四个相等大小的分区,可如下操作:

parted /dev/sdc

mkpart primary 2048s 25%

mkpart primary 25% 50%

mkpart primary 50% 75%

mkpart primary 75% 100%

备注:执行parted /dev/sdb print(显示分区信息)rm(删除分区)

 

1.1.2.7  创建文件系统【非必要操作】

mkfs.ext4 /dev/sdb1

 

1.1.2.8  创建并挂载目录【非必要操作】

mkdir /data

mount /dev/sdb1  /data [临时挂载]

echo "/dev/sdb1  /srv/smartcare ext4 defaults 1 2">> /etc/fstab  [永久挂载]

 

1.1.2.9  下载并解压hadoop安装包

tar -xvf hadoop-2.7.1.tar.gz

 

1.1.3 修改配置文件

1.1.3.1  hadoop-env.sh

vim hadoop-env.sh增加以下配置项:

exportJAVA_HOME=/usr/java/jdk1.7.0_21

 

1.1.3.2  core-site.xml

<configuration>

<property>

  <name>fs.defaultFS</name>

 <value>hdfs://169.10.35.123:9000</value>

</property>

<property>

  <name>hadoop.tmp.dir</name>

  <value>/hadoop-2.7.1/tmp</value>

</property>

</configuration>

 

1.1.3.3  hdfs-site.xml

<configuration>

<property>

  <name>dfs.replication</name>

  <value>1</value>

</property>

<property>

 <name>dfs.namenode.name.dir</name>

  <value>/hadoop-2.7.1/name</value>

</property>

<property>

 <name>dfs.datanode.data.dir</name>

  <value>/data/data1</value>

</property>

</configuration>

 

1.1.3.4  mapred-site.xml

<configuration>

<property>

   <name>mapreduce.framework.name</name>

    <value>yarn</value>

</property>

</configuration>

 

1.1.3.5  yarn-site.xml

<configuration>

<property>

 <name>mapreduce.framework.name</name>

  <value>yarn</value>

</property>

<property>

 <name>yarn.nodemanager.aux-services</name>

  <value>mapreduce_shuffle</value>

</property>

</configuration>

1.1.4 启动Hadoop

  • 格式化Hadoop

在命令行执行 hdfs namenode -format

  • 启动Hadoop

在命令行执行 tart-all.sh

1.1.5 查看Hadoop安装

  • Jps命令

[root@lsn hadoop-2.6.0]# jps

6215 Jps

6037 ResourceManager

5623 NameNode

5743 DataNode

5898 SecondaryNameNode

6132 NodeManager

  • hdfs dfsadmin –report


  • hdfs web界面

通过master_IP:50070访问hdfsweb界面,如下所示:

通过该web界面能获取到很多的hdfs集群信息,平时多用用,大有帮助。

 

1.1.6 常见问题


原因是hadoop-2.6.0.tar.gz安装包是在32位机器上编译的,64位的机器加载本地库.so文件时出错,不影响使用。

可用如下方式解决:

1、重新编译源码后将新的lib/native替换到集群中原来的lib/native

2、修改hadoop-env.sh ,增加 export HADOOP_OPTS="-Djava.library.path=$HADOOP_PREFIX/lib:$HADOOP_PREFIX/lib/native"

1.2        分布式集群环境

1.2.1 操作系统安装

1.2.1.1  系统盘做raid1

重启系统,按提示按按Ctrl+H,进入WebBIOS,给系统盘做raid1 (

    参数项 参数值

    RAID Level 1

    Strip Size 64KB

    Access RW

    Read   Normal

    Default Write   Write Through

    Current Write   Write Through

    Disable BGI No

    Disk Cache Disable

    I/O Direct

),之后重启;

 

1.2.1.2  安装Linux操作系统

在系统盘上安装操作系统【略】

 

1.2.1.3  启用硬盘jbod模式

重启系统,当提示按ctrl+H或者ctrl+y进行选择时,按crtl+y 进入输入命令的界面,启用硬盘位jbod模式-adpsetprop -enablejbod -1 -a0(附:禁用jbod模式命令 -adpsetprop -enablejbod -0 -a0),之后再重启。

 

1.2.1.4  硬盘分区、创建文件系统

parted -s /dev/sdb mklabelgpt         //gpt,对大于2T的硬盘分区

parted -s /dev/sdb mkpartdata 2048s 100%

mkfs.ext4 /dev/sdb1                 //格式化,创建文件系统

mount /dev/sdb1 /data1              //挂载硬盘

echo "/dev/sdb1  /srv/smartcare ext4 defaults 1 2">> /etc/fstab  //设置永久挂载

1.2.2 系统环境配置

1.2.2.1  配置/etc/hosts

修改/etc/hosts文件,配置子节点ip


 

1.2.2.2  配置SSH

1) 在本地主机生成密钥对

ssh-keygen -t rsa 

这个命令生成一个密钥对:id_rsa(私钥文件和id_rsa.pub(公钥文件。默认被保存在~/.ssh/目录下。

2) 将公钥添加到远程主机的 authorized_keys 文件中

将文件上传到远程主机中

scp ~/.ssh/id_rsa.pubroot@192.168.21.8:/root/

SSH到登陆到远程主机,将公钥追加到 authorized_keys 文件中

cat /root/id_rsa.pub>> /root/.ssh/authorized_keys

注:cat ~/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys (自己与自己交换密钥)

 

1.2.2.3  关闭系统防火墙

编写并执行以下脚本,可批量关闭集群防火墙:

#! /bin/bash

ALL_CLIENTS=`cat /etc/hosts| grep "193.168.1" | awk '{print $2}'`

CLIENTS=""

for client in $ALL_CLIENTS

do

    echo "==================close iptablesat $client=================="

    ssh $client " chkconfig --level 2345iptables off "

    ssh $client " service iptables stop"

done

 

1.2.2.4  关闭selinux

编写并执行以下脚本,可批量关闭集群selinux

#! /bin/bash

ALL_CLIENTS=`cat /etc/hosts| grep "193.168.1" | awk '{print $2}'`

CLIENTS=""

for client in $ALL_CLIENTS

do

    echo "=====set close selinux at$client,need restart server======"

    ssh $client " sed -i"s/SELINUX=enforcing/SELINUX=disabled/" /etc/selinux/config "

    echo "=====close selinux at $client,noneed restart server======"

    ssh $client " setenforce 0 "

done

 

1.2.2.5  调整最大文件句柄数

编写并执行以下脚本,可批量调整集群最大文件句柄数群:

#! /bin/bash

ALL_CLIENTS=`cat /etc/hosts| grep "169.10.35" | awk '{print $2}'`

CLIENTS=""

for client in $ALL_CLIENTS

do

    echo "======set/etc/security/limits.conf at $client ======="

    ssh $client " echo '* soft nofile65536' >> /etc/security/limits.conf "

          ssh $client " echo '* hardnofile 65536' >> /etc/security/limits.conf "

          ssh $client " echo '* soft nproc131072' >> /etc/security/limits.conf "

          ssh $client " echo '* hard nproc131072' >> /etc/security/limits.conf "

          echo "=====set /etc/security/limits.d/90-nproc.confat $client ======"

          ssh $client " echo '* soft nproc131072' >> /etc/security/limits.d/90-nproc.conf "

          ssh $client " echo '* hard nproc131072' >> /etc/security/limits.d/90-nproc.conf "

done

 

1.2.2.6  打开磁盘预读

重启系统,按提示按按Ctrl+H,进入WebBIOS,给系统盘做raid1 (

编写并执行以下脚本,可批量打开集群磁盘预读:

#! /bin/bash

ALL_CLIENTS=`cat /etc/hosts| grep "169.10.35" | awk '{print $2}'`

CLIENTS=""

for client in $ALL_CLIENTS

do

    echo "=====set disk ahead read in/etc/rc.local file at $client ====="

    ssh $client " echo '/sbin/blockdev--setra 16384 /dev/sd*' >> /etc/rc.local "

 

done

 

1.2.2.7  关闭大页内存(THP

RedHat6操作系统中需关闭大页内存(THP):

echo never >/sys/kernel/mm/redhat_transparent_hugepage/enabled

 

1.2.2.8  配置nmon【非必要操作】

在命令行执行crontab –e,然后配置:

0 */1 * * * nmon -f -m/opt/nmonResult/ -t -r test -s 3 -c 1200

 

1.2.3 集群环境配置

1.2.3.1  安装jdk

在集群的各个节点上安装jdk,如下所示:


 

1.2.3.2  修改Hadoop配置文件

Hadoop主节点上修改Hadoop集群配置文件hadoop-env.shcore-site.xmlhdfs-site.xmlmapred-site.xmlyarn-site.xmlslaves

hadoop-env.sh配置文件中,只需修改jdk的路径配置就行了,如下所示:

exportJAVA_HOME=/usr/java/jdk1.7.0_25

 

core-site.xml参考配置如下:

<configuration>

<property>

   <name>fs.defaultFS</name>

   <value>hdfs://169.10.35.57:8020</value>

</property>

<property>

   <name>hadoop.tmp.dir</name>

   <value>/data/version3/tmp</value>

</property>

</configuration>

 

yarn-site.xml参考配置如下:

<configuration>

<property>

   <name>yarn.resourcemanager.hostname</name>

   <value>slave2</value>

</property>

<property>

   <name>yarn.nodemanager.local-dirs</name>

   <value>/data/version3/mapred</value>

</property>

<property>

    <name>yarn.nodemanager.aux-services</name>

    <value>mapreduce_shuffle</value>

</property>

<property>

   <name>mapreduce.jobhistory.webapp.address</name>

   <value>169.10.35.57:19888</value>

</property>

<property>

   <name>yarn.node-labels.fs-store.root-dir</name>

    <value>hdfs://slave2:8020/yarn/node-labels</value>

</property>

<property>

    <name>yarn.node-labels.enabled</name>

    <value>true</value>

</property>

<property>

 <name>yarn.resourcemanager.scheduler.class</name>

<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value>

</property>

<property>

   <name>yarn.node-labels.manager-class</name>

<value>org.apache.hadoop.yarn.server.resourcemanager.nodelabels.RMNodeLabelsManager</value>

</property>

<property>

   <name>yarn.nodemanager.vmem-check-enabled</name>

   <value>false</value>

</property>

</configuration>

 

mapred-site.xml参考配置如下:

<configuration>

<property>

     <name>mapreduce.framework.name</name>

     <value>yarn</value>

</property>

</configuration>

 

hdfs-site.xml参考配置如下:

<configuration>

<property>

   <name>dfs.replication</name>

   <value>1</value>

</property>

<property>

   <name>dfs.namenode.name.dir</name>

   <value>/data/version3/name</value>

</property>

<property>

  <name>dfs.datanode.data.dir</name>

   <value>/data/version3/data</value>

</property>

<property>

   <name>dfs.permissions.enabled</name>

   <value>true</value>

</property>

<property>

   <name>dfs.namenode.acls.enabled</name>

   <value>true</value>

</property>

<property>

   <name>dfs.namenode.dfs-zone-labels.enabled</name>

   <value>true</value>

</property>

</configuration>

 

slaves参考配置如下(集群节点名称)

Slave1

Slave2

Slave3

这些配置文件中需要修改<configuration>标签内的一些属性配置,特别提醒一下的是IP以及一些目录需要按照实际安装环境做相应修改。

最后将主节点上的Hadoop安装包以及hadoop的各配置文件拷贝到各slave节点,需要注意的是slave节点的jdk版本以及各种目录配置最好与主节点保持一致,要不然则需要在slave节点上修改以上各个配置文件。

 

1.2.3.3  配置Hadoop集群节点

修改slaves配置文件,如果主节点也作为从节点使用,则可以配置为:


如果主节点不作为从节点使用,则可以配置为:

 

1.2.3.4  设置ntp服务

  • 先在Hadoop的主节点设置正确的时间:

date -s month/day/year  (修改年月日,例如date -s 11/15/2012)

date -s hh:mm:ss      (修改时分秒,例如date -s 10:10:10)

hwclock w        (将设置的时间固化,不受系统重启的影响)

  • Hadoop主节点创建ntp服务器

根据需要考虑是否需修改/etc/ntp.conf文件

chkconfig ntpd on

service ntpd start

  • 在各子节点上设置定时ntp同步

执行crontab –e然后配置定时ntp,如下为一个例子:

0 */1 * * * root ntpdate 169.10.35.32

 

1.2.3.5  启动Hadoop集群

  • 在主节点上,格式化hdfs名字节点:hdfs namenode –format

  • 启动hadoop集群:start-all.sh

 

1.2.4 集群环境清理

1、  关闭hadoop集群

2、  清理/tmp目录

3、  清理数据目录中的文件 /data*/

4、  清理内存:echo 3 >/proc/sys/vm/drop_caches

1.3        搭环境常见问题

1.3.1.1  主节点的datanode进程启动不了

解决方案:

  • 清除主节点的元数据目录(name)内容、数据目录(data)内容、/tmp目录内容以及

日志目录内容。

  • 清除从节点的数据目录(data)内容、日志目录内容以及/tmp目录内容。

  • 重新格式化名字节点:hdfs namenode –format

  • 启动hadoop集群

 

1.3.1.2  java.net.BindException

启动HDFS(start-dfs.sh)时,namenodedatanodelog日志报java.net.BindException,如下所示:


这往往是因为端口被占用导致的,可以采用Linux命令:lsof -i:50010 查看端口的占用情况,如下所示:

也可以使用netstat命令查看端口的占用情况:

然后关闭端口即可.

 

1.3.1.3  java.net.ConnectException

启动yarnNodeManager日志报java.net.ConnectException,具体报错信息如下:

报以上重连日志一段时间后,最后报以下异常:

解决办法:在yarn的配置文件yarn-site.xml中增加以下配置项:

然后重启yarn进程就可以了。

 

1.3.1.4  运行mapreduce程序报错

报错信息如下所示:

hadoop日志文件hadoop-root-datanode-slave2.log中还报以下异常:


报错原因是因为hadoop集群中有机器没有关闭防火墙,把之关闭就可以了。

备注:在此提供一个测试hadoop集群网络是否异常的java socket程序,clientserver端代码如下所示:

Server.java

import java.io.BufferedReader;

import java.io.DataInputStream;

import java.io.IOException;

import java.io.InputStreamReader;

import java.net.ServerSocket;

import java.net.Socket;

 

public class Server {

   public static void main(String[] args) throws IOException {

    ServerSocket ss = new ServerSocket(9527);

    ss.setReceiveBufferSize(100);

    Socket socket = ss.accept();

     System.out.println(socket.getReceiveBufferSize());

 

    DataInputStream din = new  DataInputStream(socket.getInputStream());

    int round = 0;

    while (true) {

      try {

        Thread.sleep(1 * 1000);

      } catch (InterruptedException e) {

        e.printStackTrace();

      }

    }

   }

}

 

Client.java

import java.io.BufferedInputStream;

import java.io.BufferedReader;

import java.io.DataOutputStream;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.PrintStream;

import java.net.InetSocketAddress;

import java.net.Socket;

import java.net.SocketAddress;

 

public class Client {

  public static void  main(String[] args) throws IOException {

    Socket socket = new  Socket();

    socket.setSendBufferSize(4);

     System.out.println(socket.getSendBufferSize());

    SocketAddress remote =  new InetSocketAddress("127.0.0.1", 9527);

 

    socket.connect(remote);

 

    DataOutputStream dos =  new DataOutputStream(socket.getOutputStream());

 

    try {

      Thread.sleep(1000);

    } catch  (InterruptedException e) {

      e.printStackTrace();

    }

 

    for (int i = 0; i <  10240; i++) {

      dos.writeInt(i);

      dos.flush();

       System.out.println("wrote: " + i);

      try {

        Thread.sleep(1);

      } catch  (InterruptedException e) {

        e.printStackTrace();

      }

    }

 

    dos.close();

    socket.close();

  }

}

 

将代码分别放在两台机器上运行则可以测试网络是否故障,先运行server端,再运行client端,都是比较简单的java代码,在此就不做解释了。

Javac Server.java   javaServer

 

1.3.1.5   Yarn平台运行mapreduce程序导致虚拟内存溢出

问题现象1:=>运行mapreduce程序时直接卡死

查看hadoop日志文件hadoop-root-nodemanager-slave3.log报如下错误信息:

一种解决方案:修改yarn-site.xml配置文件,增加以下配置项:

<property>

 <name>yarn.nodemanager.vmem-check-enabled</name>

 <value>false</value>

</property>

该配置项的意思是:是否启动一个线程检查每个任务正使用的虚拟内存量,如果任务超出分配值,则直接将其杀掉,默认是true

网上解决方案参考:

http://stackoverflow.com/questions/21005643/container-is-running-beyond-memory-limits

http://blog.chinaunix.net/uid-28311809-id-4383551.html


来源:微信公众号

为您推荐

友情链接 |九搜汽车网 |手机ok生活信息网|ok生活信息网|ok微生活
 Powered by www.360SDN.COM   京ICP备11022651号-4 © 2012-2016 版权