• 布式实时日志系统(三) 环境搭建之centos 6.4下hadoop 2.5.2完全分布式集群搭建最全资料


    最近公司业务数据量越来越大,以前的基于消息队列的日志系统越来越难以满足目前的业务量,表现为消息积压,日志延迟,日志存储日期过短,所以,我们开始着手要重新设计这块,业界已经有了比较成熟的流程,即基于流式处理,采用 flume 收集日志,发送到 kafka 队列做缓冲,storm 分布式实时框架进行消费处理,短期数据落地到 hbase、mongo中,长期数据进入 hadoop 中存储。 接下来打算将这其间所遇到的问题、学习到的知识记录整理下,作为备忘,作为分享,带给需要的人。

    hadoop 简介,也可以去官网看介绍 :(slideshare PPT 分享服务在大陆是被墙的,不能科学上网?查看使用shadowsocks服务享受自由网络学习方法)

    在搭建 hadoop 集群的过程中还是遇到很多问题的,我尽量的以初学者的口吻来写这篇文章,尽量做到详尽,当然不明白、不清楚的地方可以随时留言或找到我的联系方式与我沟通。

    一、总体环境说明

    操作系统: cenos 6.4 ,三台192.168.9.92、192.168.9.93、192.168.9.94
    jdk版本: 1.7.0_75
    hadoop版本: 2.5.2 (目的与hbase兼容)

    hadoop集群3个节点,一主两从,如下:

    角色ip用户运行进程
    master 192.168.9.92 hadoop JobHistoryServer,ResourceManager,NameNode,NodeManager,DataNode,Main
    slave1 192.168.9.93 hadoop NodeManager,DataNode
    slave2 192.168.9.94 hadoop NodeManager,DataNode

    二、设置环境变量

    安装 hadoop 前需要提前配置好三台机器的 hostname,之间ssh无密码可登陆,Java环境的搭建,bashrc 的一些变量设置等,详细如下

    2.1 设置机器hostname别名

    设置别名的目的是机器间相互识别可以不用ip,配置文件中也可以不用ip,通用性上更强一些。

    在 master 机器上面执行下面的命令:

    1
    2
    3
    4
    5
    # 当前ssh窗口即可生效
    hostname master
    # 每次重启以后均生效
    vi /etc/sysconfig/network
    HOSTNAME=master

    同样,在 slave1 、slave2 机器上面执行相同的命令,只需要更改最后一句为相应的角色名称

    1
    HOSTNAME=slave1
    1
    HOSTNAME=slave2

    添加Hosts映射关系,三台机器上面分别都执行操作 vi /etc/hosts 添加如下内容 ,之后在每台机器上面ping一下,确保能够连接彼此。

    1
    2
    3
    192.168.9.92 master
    192.168.9.93 slave1
    192.168.9.94 slave2

    2.2 配置 JDK 环境

    下载 Java 对应的版本,地址如下jdk-7u75-linux-i586.tar_0.gz,配置环境变量即可完成java环境的配置,详情看脚本 :

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # 解压到 /opt/下面
    tar -zxf jdk-7u75-linux-i586.tar_0.gz -C /opt/

    # 配置java环境,最好在全局 /etc/profile 配置中修改,这样所有用户均可以使用
    vi /etc/profile

    JAVA_HOME=/opt/jdk1.7.0_75
    export PATH=$JAVA_HOME/bin:$PATH
    export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    export JAVA_HOME

    使修改的配置立即生效,终端中执行source /etc/profile
    测试是否ok,执行命令which java,若出现/opt/jdk1.7.0_75/bin/java 表示已经ok 或者java -version ,出现java version "1.7.0_75" 也表明ok。

    2.3 配置集群之间SSH无密码登陆

    1、为了hadoop集群的安全与方便管理,我们要另外新建用户,并设置密码,命令如下:

    1
    2
    # 创建账号hadoop并赋予密码nopass.2
    sudo adduser hadoop && sudo passwd hadoop

    2、给hadoop账户赋予root权限 vi /etc/sudoers 添加如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    hadoop  ALL=(ALL)       ALL
    ```
    3、配置集群各个节点之间的ssh无密码互信,也就是从master开始,ssh到master(localhost)、slave1和slave2上都不需要密码,反向ssh到master同样,互信设置需要在`hadoop`用户下执行命令如下:

    ``` bash
    ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
    cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys

    # 这步很重要,必须要授予读写的权限 r=4,w=2,x=1
    chmod 600 ~/.ssh/authorized_keys

    # 拷贝授权认证公钥
    scp ~/.ssh/authorized_keys hadoop@master:/home/hadoop/.ssh/
    scp ~/.ssh/authorized_keys hadoop@slave1:/home/hadoop/.ssh/
    scp ~/.ssh/authorized_keys hadoop@slave2:/home/hadoop/.ssh/

    这样就将生成的授权秘钥拷贝到了slave1和slave2的/home/hadoop/.ssh目录下,从 master 机器 ssh到 slave1 、slave2 都不再需要密码了,同理,在slave1、slave2机器上执行上面的命令即可完成slave 到master之间的无密码登录。(其实,操作完后,slave之间也是可以无密码登录的,只是不需要而已)

    测试下 ,不使用密码登录即ok

    1
    2
    3
    ssh hadoop@master 
    ssh hadoop@slave1
    ssh hadoop@slave2

    三、Hadoop 集群的安装

    hadoop 下载地址 :https://hadoop.apache.org/releases.html
    hadoop 的安装其实很简单,解压完毕后,修改配置文件、环境变量就完成了安装,需要在每个节点都安装,为了写了一键安装部署脚本,执行hadoop_install.sh后即可用启动命令进行测试,尽量做到简单方便的运维,提供的脚本如往常一样再本文最后给出,下面就一步步解释下:

    1、 解压 hadoop-2.5.2.tar.gz 文件

    1
    tar -zxvf hadoop-2.5.2.tar.gz -C /home/hadoop/

    2、修改环境变量vi /home/hadoop/.bashrc ,添加如下代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    export HADOOP_HOME=$HOME/hadoop-2.5.2
    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 HADOOP_LOG_DIR=${HADOOP_HOME}/logs
    export HADOOP_PID_DIR=/var/hadoop/pids

    # 解决启动时候的错误
    export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
    export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib"

    3、 修改 hadoop 文件目录中的各项配置文件 ,配置文件详细说明见
    3.1、修改core-site.xml 配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    <configuration>
    <property>
    <name>fs.defaultFS</name>
    <value>hdfs://master:9000</value>
    </property>

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

    <property>
    <name>hadoop.tmp.dir</name>
    <!--hadoop运行时的临时文件的目录-->
    <value>/home/hadoop/tmp</value>
    <description>Abase for other temporary directories.</description>
    </property>

    </configuration>

    3.2 、修改hdfs-site.xml ,代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    <configuration>
    <property>
    <name>dfs.namenode.secondary.http-address</name>
    <value>master:9001</value>
    </property>

    <property>
    <name>dfs.namenode.name.dir</name>
    <value>/home/hadoop/dfs/name</value>
    </property>

    <property>
    <name>dfs.datanode.data.dir</name>
    <value>/home/hadoop/dfs/data</value>
    </property>

    <property>
    <!-- 值不应大于datanode数量 -->
    <name>dfs.replication</name>
    <value>2</value>
    </property>

    <property>
    <name>dfs.webhdfs.enabled</name>
    <value>true</value>
    </property>

    </configuration>

    备注:访问namenode的hdfs使用50070端口,访问datanode的webhdfs使用50075端口。要想不区分端口,直接使用namenode的IP和端口进行所有的webhdfs操作,就需要在所有的datanode上都设置hdfs-site.xml中的dfs.webhdfs.enabled为true。

    3.3 、修改mapred-site.xml,代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    <configuration>
    <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
    </property>

    <property>
    <name>mapreduce.jobhistory.address</name>
    <value>master:10020</value>
    </property>

    <property>
    <name>mapreduce.jobhistory.webapp.address</name>
    <value>master:19888</value>
    </property>

    </configuration>

    备注:jobhistory是Hadoop自带了一个历史服务器,记录Mapreduce历史作业。默认情况下,jobhistory没有启动,可用以下命令启动:$HADOOP_HOME/sbin/mr-jobhistory-daemon.sh start historyserver

    3.4、 修改yarn-site.xml,代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    <configuration>
    <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>

    <property>
    <name>yarn.resourcemanager.address</name>
    <value>master:8032</value>
    </property>

    <property>
    <name>yarn.resourcemanager.scheduler.address</name>
    <value>master:8030</value>
    </property>

    <property>
    <name>yarn.resourcemanager.resource-tracker.address</name>
    <value>master:8031</value>
    </property>

    <property>

    <name>yarn.resourcemanager.admin.address</name>
    <value>master:8033</value>
    </property>

    <property>
    <name>yarn.resourcemanager.webapp.address</name>
    <value>master:8088</value>
    </property>
    </configuration>

    3.5、 修改两个启动命令文件 hadoop-env.sh 和 yarn-env.sh ,添加 JAVA_HOME 变量 :

    1
    export JAVA_HOME=/opt/jdk1.7.0_75

    3.6 、 修改 slaves配置,代码如下,添加两台slaves机器:

    1
    2
    slave1
    slave2

    以上就是整个安装过程,下面测试下是否安装ok

    四、Hadoop 集群的测试

    4.1 启动 hadoop,验证页面是否ok

    1 、格式化磁盘,格式化hadoop使用的文件磁盘,并不是物理上的磁盘,需要在每个节点上都执行下面的命令

    1
    source $HADOOP_HOME/bin/hdfs namenode –format

    2、 启动hadoop ,注意:只需要在 master 节点上启动即可,会自动启动slave各个节点

    1
    2
    3
    4
    5
    6
    7
    8
    # start-dfs.sh 此命令启动了namenode、secondaryNamenode以及datanode
    # start-yarn.sh 此命令启动了ResourceManager和NodeManager,相当于hadoop1中的jobtracker和TaskTracker

    $HADOOP_HOME/sbin/start-dfs.sh
    $HADOOP_HOME/sbin/start-yarn.sh

    # 或者使用这一个命令代替
    # $HADOOP_HOME/sbin/start-all.sh

    3、 停止 hadoop , 注意:只需要在 master 节点上执行即可

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $HADOOP_HOME/sbin/stop-all.sh
    ```
    4、测试是否启动ok,使用java进程查看命令`jps`,终端中输入即可,看到如下内容即表示ok

    ``` bash
    7692 ResourceManager
    8428 JobHistoryServer
    7348 NameNode
    14874 Jps
    7539 SecondaryNameNode

    5、 HTTP效果,通过浏览器查看集群运行状态,访问 http://192.168.9.92:50070/、http://192.168.9.92:8088/、http://192.168.9.92:19888/ 即可看到下图的效果

    hadoop-overview

    hadoop-cluster

    hadoop-jobhistory

    6、单独重启丢失的DataNode节点
    如果某个DataNode节点Dead(由于死机或人为原因等),可以在不重启整个Hadoop服务的情况下进行单独重启。
    方法如下:
    在NameNode的hadoop-2.5.2/sbin目录下,执行命令启动HDFS DataNode

    ./hadoop-daemons.sh start datanode
    ./yarn-daemons.sh start nodemanager  
    

    或者单独启动NameNode节点,命令如下:

    1
    2
    ./hadoop-daemon.sh start namenode  
    ./yarn-daemon.sh start resourcemanager

    上述四个命令都可以指定—config参数,后面跟hadoop的集群配置文件所在目录(即$HADOOP_HOME/etc/hadoop),大家可通过参数-h查看命令帮助信息
    注意:上面命令不会影响已经启动的hdfs或yarn服务,只会把丢失节点的服务启动起来。

    4.2 运行Hadoop自带的wordcount示例

    1、 创建input文件

    1
    2
    3
    cd /home/hadoop/
    echo "My first hadoop example. Hello Hadoop in input. " > input
    ls

    2、创建用户目录,必须是 /user/用户名

    1
    $HADOOP_HOME/bin/hadoop fs -mkdir -p /user/hadoop

    3、上传文件

    1
    $HADOOP_HOME/bin/hadoop fs -put input /user/hadoop

    4、 执行 wordcount 程序

    1
    $HADOOP_HOME/bin/hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.2.jar wordcount /user/hadoop/input /user/hadoop/output

    5、验证结果

    1
    $HADOOP_HOME/bin/hadoop fs -cat /user/hadoop/output/part-r-00000
    1
    2
    3
    4
    5
    6
    7
    Hadoop  1  
    My 1
    example.Hello 1
    first 1
    hadoop 1
    in 1
    input. 1

    五、参考资料

    http://blog.csdn.net/hwwn2009/article/details/39889465
    http://www.cnblogs.com/bxljoy/p/3880250.html
    http://ju.outofmemory.cn/entry/29825
    http://blog.csdn.net/tang9140/article/details/42869531

  • 相关阅读:
    C#ModBus Tcp 报文解析
    C#ModBus Tcp的学习及Master的实现
    C#原生Socket服务器与客户端的实现
    转载:C# 创建、部署和调用WebService的简单示例
    记kepServer读写西门子PLC
    C#实现某一属性值变化时触发事件
    C#倒计时关闭提示框
    C#SuperSocket的搭建--通过配置启动
    C#串口扫描枪的简单实现
    C#SuperSocket服务器的简易实现
  • 原文地址:https://www.cnblogs.com/yudar/p/4883216.html
Copyright © 2020-2023  润新知