Contents
  1. 1. 1. 环境及版本介绍
    1. 1.1. 1.1 机器Centos6.8
    2. 1.2. 1.2 yarn 2.7.2
    3. 1.3. 1.3 jdk1.8/1.7
  2. 2. 2. 目标机器
  3. 3. 3. 配置文件介绍
    1. 3.1. 3.1 core-site.xml
    2. 3.2. 3.2 hdfs-site.xml
    3. 3.3. 3.3 mapred-site.xml
    4. 3.4. 3.4 yarn-site.xml
    5. 3.5. 3.5 环境变量设置
  4. 4. 4. 配置工作
    1. 4.1. 4.1 创建单独用户
    2. 4.2. 4.2 将配置文件复制到slave1中
    3. 4.3. 4.3 ssh登录配置
    4. 4.4. 4.4 master下执行文件夹初始化
  5. 5. 5. 测试
    1. 5.1. 5.1 运行状况测试
    2. 5.2. 5.2 作业运行测试
  6. 6. 6 Spark配置
    1. 6.1. 疑难
    2. 6.2. RM的内存资源配置, 配置的是资源调度相关
    3. 6.3. NM的内存资源配置,配置的是硬件资源相关
    4. 6.4. AM内存配置相关参数,配置的是任务相关
  7. 7. 7 zeppelin配置
  1. 环境及版本介绍
  2. 目标机器
  3. 配置文件介绍
  4. 配置工作
  5. 测试

1. 环境及版本介绍

1.1 机器Centos6.8

关闭防火墙服务启动 chkconfig iptables off
停止防火墙 service iptables stop

1.2 yarn 2.7.2

外层的启动脚本在sbin目录
Native的so文件都在lib/native目录
配置程序文件都放置在libexec
配置文件都在etc目录,对应以前版本的conf目录
所有的jar包都在share/hadoop目录下面

1.3 jdk1.8/1.7

2. 目标机器

IP hostname 机器身份 作用 备注
192.168.1.11 master NameNode、SecondaryNameNode、ResourceManager product环境namenode与resourceManager分开
192.168.1.10 slave1 DataNode、NodeManager

3. 配置文件介绍

3.1 core-site.xml

<!-- master 为IP主机名映射 -->
<configuration >
    <property>
        <name>fs.default.name</name>
        <value>hdfs://master:9000</value>
        <description>指定NameNode的IP地址和端口号</description>
    </property>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/home/hadoop/tmp</value>
        <description>必须能被相互的ssh-public-key访问及修改</description>
    </property>
</configuration>

3.2 hdfs-site.xml

<!-- master 为IP主机名映射 -->
<configuration>
        <property>
                <name>fs.defaultFS</name>
                <value>hdfs://master:9000</value>
        </property>

        <property>
                <name>io.file.buffer.size</name>
                <value>131072</value>
        </property>
</configuration>

3.3 mapred-site.xml

<configuration>
        <property>
                <name>mapreduce.framework.name</name>
                <value>yarn</value>
        </property>
        <property>
                <name>mapreduce.jobhistory.address</name>
                <value>slave1:10020</value>
        </property>
        <property>
                <name>mapreduce.jobhistory.webapp.address</name>
                <value>slave1:19888</value>
        </property>
      <property> 
        <name>yarn.app.mapreduce.am.resource.mb</name>  
        <!-- 默认值为 1536,可根据需要调整,调小一些也是可接受的 -->  
        <value>512</value> 
      </property>  
      <property> 
        <name>mapreduce.map.memory.mb</name>  
        <!-- 每个map task申请的内存,每一次都会实际申请这么多 -->  
        <value>384</value> 
      </property>  
      <property> 
        <name>mapreduce.map.java.opts</name>  
        <!-- 每个map task中的child jvm启动时参数,需要比 mapreduce.map.memory.mb 设置的小一些 -->  
        <!-- 注意:map任务里不一定跑java,可能跑非java(如streaming) -->  
        <value>-Xmx256m</value> 
      </property>  
      <property> 
        <name>mapreduce.reduce.memory.mb</name>  
        <value>384</value> 
      </property>  
      <property> 
        <name>mapreduce.reduce.java.opts</name>  
        <value>-Xmx256m</value> 
      </property>  
      <property> 
        <name>mapreduce.tasktracker.map.tasks.maximum</name>  
        <value>2</value> 
      </property>  
      <property> 
        <name>mapreduce.tasktracker.reduce.tasks.maximum</name>  
        <value>2</value> 
      </property>  
      <property> 
        <name>mapred.child.java.opts</name>  
        <!-- 默认值为 -Xmx200m,生产环境可以设大一些 -->  
        <value>-Xmx384m</value> 
      </property>  
      <property> 
        <name>mapreduce.task.io.sort.mb</name>  
        <!-- 任务内部排序缓冲区大小 -->  
        <value>128</value> 
      </property>  
      <property> 
        <name>mapreduce.task.io.sort.factor</name>  
        <!-- map计算完全后的merge阶段,一次merge时最多可有多少个输入流 -->  
        <value>100</value> 
      </property>  
      <property> 
        <name>mapreduce.reduce.shuffle.parallelcopies</name>  
        <!-- reuduce shuffle阶段并行传输数据的数量 -->  
        <value>50</value> 
      </property>  

</configuration>

3.4 yarn-site.xml

<pre name="code" class="html"><configuration>

<!-- Site specific YARN configuration properties -->
<!-- master 为IP主机名映射 最好为局域网ip,若为127.0.0.1则只监听lo本地回环网卡 -->
        <property>
                <name>yarn.resourcemanager.address</name>
                <value>master:8032</value>
        </property>
        <property>
                <name>yarn.resourcemanager.scheduler.address</name>
                <value>master:8033</value>
        </property>
        <property>
                <name>yarn.resourcemanager.resource-tracker.address</name>
                <value>master:8034</value>
        </property>
        <property>
                <name>yarn.resourcemanager.admin.address</name>
                <value>master:8035</value>
        </property>
        <property>
                <name>yarn.resourcemanager.webapp.address</name>
                <value>master:8036</value>
        </property>
        <property>
                <name>yarn.nodemanager.aux-services</name>
                <value>mapreduce_shuffle</value>
        </property>
        <property> 
        <name>yarn.log-aggregation-enable</name>  
        <!-- 打开日志聚合功能,这样才能从web界面查看日志 -->  
        <value>true</value> 
      </property>  
      <property> 
        <name>yarn.log-aggregation.retain-seconds</name>  
        <!-- 聚合日志最长保留时间 -->  
        <value>86400</value> 
      </property>  
      <property> 
        <name>yarn.nodemanager.resource.memory-mb</name>  
        <!-- NodeManager总的可用内存,这个要根据实际情况合理配置 -->  
        <value>1024</value> 
      </property>  
      <property> 
        <name>yarn.scheduler.minimum-allocation-mb</name>  
        <!-- MapReduce作业时,每个task最少可申请内存 -->  
        <value>256</value> 
      </property>  
      <property> 
        <name>yarn.scheduler.maximum-allocation-mb</name>  
        <!-- MapReduce作业时,每个task最多可申请内存 -->  
        <value>512</value> 
      </property>  
      <property> 
        <name>yarn.nodemanager.vmem-pmem-ratio</name>  
        <!-- 可申请使用的虚拟内存,相对于实际使用内存大小的倍数。实际生产环境中可设置的大一些,如4.2 -->  
        <value>2.1</value> 
      </property>  
      <property> 
        <name>yarn.nodemanager.vmem-check-enabled</name>  
        <value>false</value> 
      </property>  
      <property> 
        <name>yarn.nodemanager.local-dirs</name>  
        <!-- 中间结果存放位置。注意,这个参数通常会配置多个目录,已分摊磁盘IO负载。 -->  
        <value>/home/hadoop/data/localdir2</value> 
      </property>  
      <property> 
        <name>yarn.nodemanager.log-dirs</name>  
        <!-- 日志存放位置。注意,这个参数通常会配置多个目录,已分摊磁盘IO负载。 -->  
        <value>/home/hadoop/data/logdir2</value> 
      </property>  
      <property> 
        <name>yarn.nodemanager.aux-services</name>  
        <value>mapreduce_shuffle</value> 
      </property>  
      <property> 
        <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>  
        <value>org.apache.hadoop.mapred.ShuffleHandler</value> 
      </property>

</configuration>

3.5 环境变量设置

  • 追加以下内容已添加到/etc/profile
  • 未验证该操作的必要性,追加以下内容到/etc/hadoop/yarn-env.sh mapred-env.sh hadoop-env.sh
export JAVA_HOME=/usr/java/default
export CLASS_PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/lib

export HADOOP_HOME=/usr/local/hadoop

# /home/{username}/pids确定ssh登陆用户名为hadoop
export HADOOP_PID_DIR=/home/hadoop/pids
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="$HADOOP_OPTS -Djava.library.path=$HADOOP_HOME/lib/native"

export HADOOP_PREFIX=$HADOOP_HOME

export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME

export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export HDFS_CONF_DIR=$HADOOP_HOME/etc/hadoop
export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop

export JAVA_LIBRARY_PATH=$HADOOP_HOME/lib/native

export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

4. 配置工作

以下4.1内容在master、slave1中分别执行

4.1 创建单独用户

  • 为进行安全隔离,另设账户运行
    #切换su
    useradd hadoop
    passwd hadoop
    tar -zxvf hadoop-2.7.4.tar.gz -C /usr/local/hadoop
    chown -r hadoop /usr/local/hadoop
    sudo yum -y install openssl openssl-devel bzip2 lz4 snappy zlib openssh-clients
    #切换hadoop
    mkdir -p /home/hadoop/yarn/yarn_data/hdfs/namenode
    mkdir -p /home/hadoop/yarn/yarn_data/hdfs/datanode
    mkdir /home/hadoop/pids
    cp /usr/local/hadoop/etc/hadoop/mapred-site.xml.template /usr/local/hadoop/etc/hadoop/mapred-site.xml
    # master  backup   互备签名  hosts   分别在master backup上运行
    # 默认生成~/.ssh/authorized_keys文件
    cd ~/
    ssh-keygen
    chmod 600 ~/.ssh/authorized_keys
    cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
    
  • /etc/hosts增加以下两行,如果环境有更多机器,在每台机器上都设立所有hostname的IP映射
    192.168.1.11 master
    192.168.1.10 slave1
    
  • 将以下内容覆盖到etc/slaves中,作用是设置datanode,使用start-all脚本时启动所有datanode
    master
    slave1
    

    4.2 将配置文件复制到slave1中

    scp -r /usr/local/hadoop/etc hadoop@slave1:/usr/local/hadoop
    

4.3 ssh登录配置

  • 将master ~/.ssh/id_rsa.pub的内容拷贝至slave1的~/.ssh/authorized_keys
  • 将slave1 ~/.ssh/id_rsa.pub的内容拷贝至master的~/.ssh/authorized_keys
  • 测试:以下命令分别在master slave1中运行,执行中首次需输入yes确认,无需密码,即认为ssh配置完毕
  • 如果正确配置了public key仍显示invalid,可尝试清空对应用户目录下.ssh/know_hosts文件
    ssh hadoop@master
    ssh hadoop@slave1
    
  • 如果使用scp命令将.ssh文件夹全然拷贝到其他机器,可能引发.ssh文件夹的安全上下文环境错误,导致仍然无法访问。下列命令是用于恢复重置安全上下文。
    restorecon -FRvv ~/.ssh
    

4.4 master下执行文件夹初始化

cd /usr/local/hadoop/
bin/hdfs namenode -format
sbin/start-all.sh
# 开启history service
sbin/mr-jobhistory-daemon.sh start historyserver

5. 测试

5.1 运行状况测试

  • master下运行netstat -tunlp 是否存在8032 8033 8034 8035 8036 9000 50090 50075 50070 50020 50010的网络监听
  • master下50070 50090 8036可以进入网页查看当前yarn&hadoop系统状态
  • 如果有不正常情况,查看/usr/local/hadoop/logs下的日志
  • cluster id 不一致
    Incompatible clusterIDs in /home/hadoop/…
    该情况下需要重新format datanode

5.2 作业运行测试

cd /usr/local/hadoop
bin/hadoop fs -mkdir /wordcount
#home/hadoop/index.md   目标分析文件
bin/hadoop fs /home/hadoop/index.md /wordcount
bin/hadoop fs -copyFromLocal /home/hadoop/index.md  /wordcount
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /wordcount /output2
bin/hadoop fs -cat /output2/*

如果系统正常,可以看见词语频率分析

6 Spark配置

编辑slaves设置worker结点域名,如果是yarn-client模式,不需要启动worker或者slaves文件为空即可。
修改spark-env.sh如下

export SPARK_WORKER_CORES=1
export JAVA_HOME=/usr/java/jdk1.8.0_111
export CLASS_PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export SPARK_HOME=/usr/local/spark
export HADOOP_HOME=/usr/local/hadoop
export HADOOP_PID_DIR=/home/hadoop/pids
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="$HADOOP_OPTS -Djava.library.path=$HADOOP_HOME/lib/native"
export HADOOP_PREFIX=$HADOOP_HOME
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export HDFS_CONF_DIR=$HADOOP_HOME/etc/hadoop
export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop
export JAVA_LIBRARY_PATH=$HADOOP_HOME/lib/native
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export _JAVA_OPTIONS="-Djava.net.preferIPv4Stack=true"
SPARK_MASTER_IP=he01
SPARK_LOCAL_DIRS=$SPARK_HOME/local
SPARK_DRIVER_MEMORY=1G

疑难

. is running beyond physical memory limits. Current usage: 336 MB of 1 GB physical memory used; 2.3 GB of 2.1 GB virtual memory used. Killing container.
yarn.nodemanager.vmem-pmem-ratio 虚拟内存率,默认2.1,当Container要求的内存大于最大内存率内存时会kill container。
解决办法之一是在yarn.xml文件中设置yarn.nodemanager.vmem-check-enabled为false,这会让hadoop丧失针对内存泄露对系统的保护功能,不建议。
之二是修改内存参数,yarn.nodemanager.vmem-pmem-ratio从默认值2.1调大可以解决上面的问题。
以下是内存参数介绍

RM的内存资源配置, 配置的是资源调度相关

RM1:yarn.scheduler.minimum-allocation-mb 分配给AM单个容器可申请的最小内存
RM2:yarn.scheduler.maximum-allocation-mb 分配给AM单个容器可申请的最大内存
注:最小值可以计算一个节点最大Container数量,一旦设置,不可动态改变

NM的内存资源配置,配置的是硬件资源相关

NM1:yarn.nodemanager.resource.memory-mb 节点最大可用内存
NM2:yarn.nodemanager.vmem-pmem-ratio 虚拟内存率,默认2.1
注:RM1、RM2的值均不能大于NM1的值,NM1可以计算节点最大最大Container数量,max(Container)=NM1/RM2,一旦设置,不可动态改变

AM内存配置相关参数,配置的是任务相关

AM1:mapreduce.map.memory.mb 分配给map Container的内存大小
AM2:mapreduce.reduce.memory.mb 分配给reduce Container的内存大小
这两个值应该在RM1和RM2这两个值之间,AM2的值最好为AM1的两倍,这两个值可以在启动时改变
AM3:mapreduce.map.Java.opts 运行map任务的jvm参数,如-Xmx,-Xms等选项
AM4:mapreduce.reduce.java.opts 运行reduce任务的jvm参数,如-Xmx,-Xms等选项
注:这两个值应该在AM1和AM2之间

7 zeppelin配置

首先,如果自己构建Zeppelin会产生构建的困难问题,不自己构建会有hadoop/spark环境不匹配的问题
构建zeppelin-apache-getting-started 注意scala版本问题./dev/change_scala_version.sh 2.11
笔者直接下载的apache-zeppelin-0.6.2版本,hadoop2.7.2,spark2.0.2-scala2.11.7,解压之后需要替换lib目录下的hadoop-core/common/anoatations、jackson-core/annotations/dababind库,否则可能产生java.lang.NoSuchMethodError: org.apache.hadoop.tracing.SpanReceiverHost.get(Lorg/apache/hadoop/conf/Configuration;Ljava/lang/String;)Lorg/apache/hadoop/tracing/SpanReceiverHost
以下为zeppelin-env.sh增加的内容

export JAVA_HOME=/usr/java/default
#此处可以使用yarn-client即由yarn进行资源与任务分配,spark只担任客户端的角色像yarn提交任务
# Spark master url. eg. spark://master_addr:7077. Leave empty if you want to use local mode.
export MASTER=yarn-client
export SPARK_HOME=/usr/local/spark
export HBASE_HOME=/usr/local/hbase
export HADOOP_HOME=/usr/local/hadoop
export HADOOP_CONF_DIR=${HADOOP_HOME}/etc/hadoop
export PYSPARK_PYTHON=/usr/bin/python
export PYTHONPATH=${SPARK_HOME}/python:${SPARK_HOME}/python/build:$PYTHONPATH
Contents
  1. 1. 1. 环境及版本介绍
    1. 1.1. 1.1 机器Centos6.8
    2. 1.2. 1.2 yarn 2.7.2
    3. 1.3. 1.3 jdk1.8/1.7
  2. 2. 2. 目标机器
  3. 3. 3. 配置文件介绍
    1. 3.1. 3.1 core-site.xml
    2. 3.2. 3.2 hdfs-site.xml
    3. 3.3. 3.3 mapred-site.xml
    4. 3.4. 3.4 yarn-site.xml
    5. 3.5. 3.5 环境变量设置
  4. 4. 4. 配置工作
    1. 4.1. 4.1 创建单独用户
    2. 4.2. 4.2 将配置文件复制到slave1中
    3. 4.3. 4.3 ssh登录配置
    4. 4.4. 4.4 master下执行文件夹初始化
  5. 5. 5. 测试
    1. 5.1. 5.1 运行状况测试
    2. 5.2. 5.2 作业运行测试
  6. 6. 6 Spark配置
    1. 6.1. 疑难
    2. 6.2. RM的内存资源配置, 配置的是资源调度相关
    3. 6.3. NM的内存资源配置,配置的是硬件资源相关
    4. 6.4. AM内存配置相关参数,配置的是任务相关
  7. 7. 7 zeppelin配置