• hadoop-HA集群搭建,启动DataNode,检测启动状态,执行HDFS命令,启动YARN,HD


    hadoop-HA集群搭建,启动DataNode,检测启动状态,执行HDFS命令,启动YARN,HD

    更新时间:2019-09-27 20:47:10  
     
     

    原创,专业,图文 hadoop-HA集群搭建,启动DataNode,检测启动状态,执行HDFS命令,启动YARN,HD - 集群,搭建,启动,DataNode,检测,状态,执行,HDFS,命令,YARN,权限,配置,客户端, 今日头条,最新,最好,最优秀,最靠谱,最有用,最好看,最有效,最热,排行榜,最牛,怎么办,怎么弄,解决方案,解决方法,怎么处理,如何处理,如何解决

    <?xml version="1.0"?>

    <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

     

    <configuration>

        <property>

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

            <value>yarn</value>

        </property>

    </configuration>

     

    详细配置可参考:

    http://hadoop.apache.org/docs/current/hadoop-mapreduce-client/hadoop-mapreduce-client-core/mapred-default.xml

    8.10. 修改yarn-site.xml

    对yarn-site.xml文件的修改,涉及下表中的属性:

    属性名

    属性值

    涉及范围

    yarn.resourcemanager.hostname

    0.0.0.0

    ResourceManager

    NodeManager

    HA模式可不配置,但由于其它配置项可能有引用它,建议保持值为0.0.0.0,如果没有被引用到,则可不配置。

    yarn.nodemanager.hostname

    0.0.0.0

     

    yarn.nodemanager.aux-services

    mapreduce_shuffle

     

    以下为HA相关的配置,包括自动切换(可仅可在ResourceManager节点上配置

    yarn.resourcemanager.ha.enabled

    true

    启用HA

    yarn.resourcemanager.cluster-id

    yarn-cluster

    可不同于HDFS

    yarn.resourcemanager.ha.rm-ids

    rm1,rm2

    注意NodeManager要和ResourceManager一样配置

    yarn.resourcemanager.hostname.rm1

    hadoop1

     

    yarn.resourcemanager.hostname.rm2

    hadoop2

     

    yarn.resourcemanager.webapp.address.rm1

    hadoop1:8088

    在浏览器上访问:http://hadoop1:8088,可以看到yarn的信息

    yarn.resourcemanager.webapp.address.rm2

    hadoop2:8088

    在浏览器上访问:http://hadoop2:8088,可以看到yarn的信息

    yarn.resourcemanager.zk-address

    hadoop11:2181,hadoop12:2182,hadoop13:2181

     

    yarn.resourcemanager.ha.automatic-failover.enable

    true

    可不配置,因为当yarn.resourcemanager.ha.enabled为true时,它的默认值即为true

    以下为NodeManager配置

    yarn.nodemanager.vmem-pmem-ratio

     

    每使用1MB物理内存,最多可用的虚拟内存数,默认值为2.1,在运行spark-sql时如果遇到“Yarn application has already exited with state FINISHED”,则应当检查NodeManager的日志,以查看是否该配置偏小原因

    yarn.nodemanager.resource.cpu-vcores

     

    NodeManager总的可用虚拟CPU个数,默认值为8

    yarn.nodemanager.resource.memory-mb

     

    该节点上YARN可使用的物理内存总量,默认是8192(MB)

    yarn.nodemanager.pmem-check-enabled

     

    是否启动一个线程检查每个任务正使用的物理内存量,如果任务超出分配值,则直接将其杀掉,默认是true

    yarn.nodemanager.vmem-check-enabled

     

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

    以下为ResourceManager配置

    yarn.scheduler.minimum-allocation-mb

     

    单个容器可申请的最小内存

    yarn.scheduler.maximum-allocation-mb

     

    单个容器可申请的最大内存

     

       实际部署的时候一个参考配置:

    <?xml version="1.0"?>

     

    <configuration>

        <!--启用HA-->

        <property>

            <name>yarn.resourcemanager.ha.enabled</name>

            <value>true</value>

        </property>

       

        <!--指定RM的cluster id-->

        <property>

            <name>yarn.resourcemanager.cluster-id</name>

            <value>yarn-cluster</value>

        </property>

       

        <!-- 指定RM的名字 -->   

        <property>

            <name>yarn.resourcemanager.ha.rm-ids</name>

            <value>rm1,rm2</value>

        </property>  

       

        <!--分别指定RM的地址-->

        <property>

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

            <value>hadoop1</value>

        </property>

        <property>

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

            <value>hadoop2</value>

        </property>

        <property>

            <name>yarn.resourcemanager.webapp.address.rm1</name>

            <value>hadoop1:8088</value>

        </property>

        <property>

            <name>yarn.resourcemanager.webapp.address.rm2</name>

            <value>hadoop2:8088</value>

        </property>

        <!--指定zk集群地址-->   

        <property>

            <name>yarn.resourcemanager.zk-address</name>

            <value>hadoop11:2181,hadoop12:2182,hadoop13:2181</value>

        </property>

       

        <!-- yarn中的nodemanager是否要提供一些辅助的服务 -->

        <property>

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

        <value>mapreduce_shuffle</value>

        </property>

     

    </configuration>

     

    yarn.nodemanager.hostname如果配置成具体的IP,则会导致每个NodeManager的配置不同。详细配置可参考:

    http://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-common/yarn-default.xml

    Yarn HA的配置可以参考:

    https://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-site/ResourceManagerHA.html

     

    在hadoop1上配置完成后执行:

     

    scp -r /home/toto/software/hadoop-2.8.0/etc/hadoop/* root@hadoop2:/home/tuzq/software/hadoop-2.8.0/etc/hadoop

    scp -r /home/toto/software/hadoop-2.8.0/etc/hadoop/* root@hadoop3:/home/tuzq/software/hadoop-2.8.0/etc/hadoop

    scp -r /home/toto/software/hadoop-2.8.0/etc/hadoop/* root@hadoop4:/home/tuzq/software/hadoop-2.8.0/etc/hadoop

    scp -r /home/toto/software/hadoop-2.8.0/etc/hadoop/* root@hadoop5:/home/tuzq/software/hadoop-2.8.0/etc/hadoop


     

    9. 启动顺序

    Zookeeper -> JournalNode -> 格式化NameNode -> 初始化JournalNode

    -> 创建命名空间(zkfc) -> NameNode -> DataNode -> ResourceManager -> NodeManager。

    但请注意首次启动NameNode之前,得先做format,也请注意备NameNode的启动方法。

    10. 启动HDFS

    在启动HDFS之前,需要先完成对NameNode的格式化。

    10.1. 创建好目录

    mkdir -p /home/tuzq/software/hadoop-2.8.0/tmp/dfs/name

    10.2. 启动好zookeeper

    ./zkServer.sh start

    注意在启动其它之前先启动zookeeper

    10.3. 创建命名空间

    在其中一个namenodehadoop1)上执行:

    cd $HADOOP_HOME

    bin/hdfs zkfc -formatZK    (第二次不用执行了)

     

    10.4. 启动所有JournalNode(hadoop1,hadoop2,hadoop3上执行)

    NameNode将元数据操作日志记录在JournalNode上,主备NameNode通过记录在JouralNode上的日志完成元数据同步。

     

    在所有JournalNode上执行:

    cd $HADOOP_HOME

    sbin/hadoop-daemon.sh start journalnode

     执行完成之后执行下面的命令进行查看:

    [root@hadoop2 hadoop-2.8.0]# jps
    3314 Jps
    3267 JournalNode
    [root@hadoop2 hadoop-2.8.0]#

     

    注意,在执行“hdfs namenode -format”之前,必须先启动好JournalNode,而format又必须在启动namenode之前。

     

    10.5初始化namenode

    进入hadoop1接着执行下面的命令(初始化namenode,如果之前已经初始化过了,此时不需要再次重新初始化namenode):

    hdfs namenode -format    (第二次不用执行了)

     

    10.6.初始化JournalNode

    如果是非HA转HA才需要这一步,在其中一个JournalNode(在hadoop1)上执行:

    bin/hdfs namenode -initializeSharedEdits   (第二次不用执行了):

    此命令默认是交互式的,加上参数-force转成非交互式。

     

    在所有JournalNode创建如下目录(第二次不用执行了):

    mkdir -p /home/tuzq/software/hadoop-2.8.0/journal/mycluster/current

    10.7. 启动主NameNode

    下面进入的是hadoop1这台机器。关于启动hadoop2上的namenode在下面的博文中有介绍

    1) 进入$HADOOP_HOME目录

    2) 启动主NameNode

    sbin/hadoop-daemon.sh start namenode

     

    启动时,遇到如下所示的错误,则表示NameNode不能免密码登录自己。如果之前使用IP可以免密码登录自己,则原因一般是因为没有使用主机名登录过自己,因此解决办法是使用主机名SSH一下

    10.8. 启动备NameNode

    进入hadoop2,执行以下命令

    bin/hdfs namenode -bootstrapStandby

    出现:Re-format的都选择N

    sbin/hadoop-daemon.sh start namenode

     

    如果没有执行第1步,直接启动会遇到如下错误:

    No valid image files found

    或者在该NameNode日志会发现如下错误:

    2016-04-08 14:08:39,745 WARN org.apache.hadoop.hdfs.server.namenode.FSNamesystem: Encountered exception loading fsimage

    java.io.IOException: NameNode is not formatted.

    10.9. 启动主备切换进程

    在所有NameNode(即hadoop1和hadoop2上都执行命令)上启动主备切换进程:

    sbin/hadoop-daemon.sh start zkfc

    只有启动了DFSZKFailoverController进程,HDFS才能自动切换主备。

     

    注:zkfc是zookeeper failover controller的缩写。

    10.10. 启动所有DataNode

    在各个DataNode上分别执行(即hadoop3,hadoop4,hadoop5上)

    sbin/hadoop-daemon.sh start datanode

     

    如果有发现DataNode进程并没有起来,可以试试删除logs目录下的DataNode日志,再得启看看。

    10.11. 检查启动是否成功

    1) 使用JDK提供的jps命令,查看相应的进程是否已启动

    2) 检查$HADOOP_HOME/logs目录下的log和out文件,看看是否有异常信息。

     

    启动后nn1和nn2都处于备机状态,将nn1切换为主机(下面的命令在hadoop1上执行):

    bin/hdfs haadmin -transitionToActive nn1

     

     

     

    10.11.1. DataNode

    执行jps命令(注:jps是jdk中的一个命令,不是jre中的命令),可看到DataNode进程:

    $ jps

    18669 DataNode

    24542 Jps

    10.11.2. NameNode

    执行jps命令,可看到NameNode进程:

    $ jps

    18669 NameNode

    24542 Jps

    10.12. 执行HDFS命令

    执行HDFS命令,以进一步检验是否已经安装成功和配置好。关于HDFS命令的用法,直接运行命令hdfs或hdfs dfs,即可看到相关的用法说明。

    10.12.1. 查看DataNode是否正常启动

    hdfs dfsadmin -report

     

    注意如果core-site.xml中的配置项fs.default.name的值为file:///,则会报:

    report: FileSystem file:/// is not an HDFS file system

    Usage: hdfs dfsadmin [-report] [-live] [-dead] [-decommissioning]

     

    解决这个问题,只需要将fs.default.name的值设置为和fs.defaultFS相同的值。

    10.12.2启动hdfs和yarn(在hadoop1,hadoop2上分别执行)

    进入hadoop1机器,执行命令:

    [root@hadoop1sbin]# sbin/start-dfs.sh

     cd $HADOOP_HOME

    # sbin/start-yarn.sh      (注意:hadoop1和hadoop2都启动)

       

    在浏览器上访问:http://hadoop1:50070/,界面如下:

       上面显示的是主的,是active状态。

      

        再在浏览器上访问:http://hadoop2:50070/


       通过上面,发现hadoop2是一种备用状态。

     

    访问yarn(访问地址可以在yarn-site.xml中查找到),访问之后的效果如下http://hadoop1:8088/cluster:

     

    10.12.2. 查看NameNode的主备状态

    如查看NameNode1和NameNode2分别是主还是备:

    $ hdfs haadmin -getServiceState nn1

    standby

    $ hdfs haadmin -getServiceState nn2

    active

     

    10.12.3. hdfs dfs ls

    注意:下面的命令只有在启动了yarn之后才会可用

     

    “hdfs dfs -ls”带一个参数,如果参数以“hdfs://URI”打头表示访问HDFS,否则相当于ls。其中URI为NameNode的IP或主机名,可以包含端口号,即hdfs-site.xml中“dfs.namenode.rpc-address”指定的值。

    “hdfs dfs -ls”要求默认端口为8020,如果配置成9000,则需要指定端口号,否则不用指定端口,这一点类似于浏览器访问一个URL。示例:

    > hdfs dfs -ls hdfs://hadoop1:8020/

     

     

     

    8020后面的斜杠/是和必须的,否则被当作文件。如果不指定端口号8020,则使用默认的8020,“hadoop1:8020”由hdfs-site.xml中“dfs.namenode.rpc-address”指定。

    不难看出“hdfs dfs -ls”可以操作不同的HDFS集群,只需要指定不同的URI。

     

    如果想通过hdfs协议查看文件列表或者文件,可以使用如下方式:

     

    文件上传后,被存储在DataNode的data目录下(由DataNode的hdfs-site.xml中的属性“dfs.datanode.data.dir”指定),

    如:$HADOOP_HOME/data/data/current/BP-472842913-192.168.106.91-1497065109036/current/finalized/subdir0/subdir0/blk_1073741825

    文件名中的“blk”是block,即块的意思,默认情况下blk_1073741825即为文件的一个完整块,Hadoop未对它进额外处理。

    10.12.4. hdfs dfs -put

    上传文件命令,示例:

    hdfs dfs -put /etc/SuSE-release hdfs://192.168.106.91/

    10.12.5. hdfs dfs -rm

    删除文件命令,示例:

    hdfs dfs -rm hdfs://192.168.106.91/SuSE-release

    Deleted hdfs://192.168.106.91/SuSE-release

    10.12.6. 新NameNode如何加入?

    当有NameNode机器损坏时,必然存在新NameNode来替代。把配置修改成指向新NameNode,然后以备机形式启动新NameNode,这样新的NameNode即加入到Cluster中:

    1) bin/hdfs namenode -bootstrapStandby

    2) sbin/hadoop-daemon.sh start namenode

     

    10.12.7. HDFS只允许有一主一备两个NameNode

    如果试图配置三个NameNode,如:

      dfs.ha.namenodes.test

      nm1,nm2,nm3

      

        The prefix for a given nameservice, contains a comma-separated

        list of namenodes for a given nameservice (eg EXAMPLENAMESERVICE).

      

     

    则运行“hdfs namenode -bootstrapStandby”时会报如下错误,表示在同一NameSpace内不能超过2个NameNode:

    16/04/11 09:51:57 ERROR namenode.NameNode: Failed to start namenode.

    java.io.IOException: java.lang.IllegalArgumentException: Expected exactly 2 NameNodes in namespace 'test'. Instead, got only 3 (NN ids were 'nm1','nm2','nm3'

            at org.apache.hadoop.hdfs.server.namenode.ha.BootstrapStandby.run(BootstrapStandby.java:425)

            at org.apache.hadoop.hdfs.server.namenode.NameNode.createNameNode(NameNode.java:1454)

            at org.apache.hadoop.hdfs.server.namenode.NameNode.main(NameNode.java:1554)

    Caused by: java.lang.IllegalArgumentException: Expected exactly 2 NameNodes in namespace 'test'. Instead, got only 3 (NN ids were 'nm1','nm2','nm3'

            at com.google.common.base.Preconditions.checkArgument(Preconditions.java:115)

    10.12.8. 存储均衡start-balancer.sh

    示例:start-balancer.sh –t 10%

    10%表示机器与机器之间磁盘使用率偏差小于10%时认为均衡,否则做均衡搬动。“start-balancer.sh”调用“hdfs start balancer”来做均衡,可以调用stop-balancer.sh停止均衡。

     

    均衡过程非常慢,但是均衡过程中,仍能够正常访问HDFS,包括往HDFS上传文件。

    [VM2016@hadoop-030 /data4/hadoop/sbin]$ hdfs balancer # 可以改为调用start-balancer.sh

    16/04/08 14:26:55 INFO balancer.Balancer: namenodes  = [hdfs://test] // test为HDFS的cluster名

    16/04/08 14:26:55 INFO balancer.Balancer: parameters = Balancer.Parameters[BalancingPolicy.Node, threshold=10.0, max idle iteration = 5, number of nodes to be excluded = 0, number of nodes to be included = 0]

    Time Stamp               Iteration#  Bytes Already Moved  Bytes Left To Move  Bytes Being Moved

    16/04/08 14:26:56 INFO net.NetworkTopology: Adding a new node: /default-rack/192.168.1.231:50010

    16/04/08 14:26:56 INFO net.NetworkTopology: Adding a new node: /default-rack/192.168.1.229:50010

    16/04/08 14:26:56 INFO net.NetworkTopology: Adding a new node: /default-rack/192.168.1.213:50010

    16/04/08 14:26:56 INFO net.NetworkTopology: Adding a new node: /default-rack/192.168.1.208:50010

    16/04/08 14:26:56 INFO net.NetworkTopology: Adding a new node: /default-rack/192.168.1.232:50010

    16/04/08 14:26:56 INFO net.NetworkTopology: Adding a new node: /default-rack/192.168.1.207:50010

    16/04/08 14:26:56 INFO balancer.Balancer: 5 over-utilized: [192.168.1.231:50010:DISK, 192.168.1.229:50010:DISK, 192.168.1.213:50010:DISK, 192.168.1.208:50010:DISK, 192.168.1.232:50010:DISK]

    16/04/08 14:26:56 INFO balancer.Balancer: 1 underutilized未充分利用的): [192.168.1.207:50010:DISK] 数据将移向该节点

    16/04/08 14:26:56 INFO balancer.Balancer: Need to move 816.01 GB to make the cluster balanced. 需要移动816.01G数据达到平衡

    16/04/08 14:26:56 INFO balancer.Balancer: Decided to move 10 GB bytes from 192.168.1.231:50010:DISK to 192.168.1.207:50010:DISK # 192.168.1.231移动10G数据到192.168.1.207

    16/04/08 14:26:56 INFO balancer.Balancer: Will move 10 GB in this iteration

     

    16/04/08 14:32:58 INFO balancer.Dispatcher: Successfully moved blk_1073749366_8542 with size=77829046 from 192.168.1.231:50010:DISK to 192.168.1.207:50010:DISK through 192.168.1.213:50010

    16/04/08 14:32:59 INFO balancer.Dispatcher: Successfully moved blk_1073749386_8562 with size=77829046 from 192.168.1.231:50010:DISK to 192.168.1.207:50010:DISK through 192.168.1.231:50010

    16/04/08 14:33:34 INFO balancer.Dispatcher: Successfully moved blk_1073749378_8554 with size=77829046 from 192.168.1.231:50010:DISK to 192.168.1.207:50010:DISK through 192.168.1.231:50010

    16/04/08 14:34:38 INFO balancer.Dispatcher: Successfully moved blk_1073749371_8547 with size=134217728 from 192.168.1.231:50010:DISK to 192.168.1.207:50010:DISK through 192.168.1.213:50010

    16/04/08 14:34:54 INFO balancer.Dispatcher: Successfully moved blk_1073749395_8571 with size=134217728 from 192.168.1.231:50010:DISK to 192.168.1.207:50010:DISK through 192.168.1.231:50010

    Apr 8, 2016 2:35:01 PM            0            478.67 MB           816.01 GB              10 GB

    16/04/08 14:35:10 INFO net.NetworkTopology: Adding a new node: /default-rack/192.168.1.213:50010

    16/04/08 14:35:10 INFO net.NetworkTopology: Adding a new node: /default-rack/192.168.1.229:50010

    16/04/08 14:35:10 INFO net.NetworkTopology: Adding a new node: /default-rack/192.168.1.232:50010

    16/04/08 14:35:10 INFO net.NetworkTopology: Adding a new node: /default-rack/192.168.1.231:50010

    16/04/08 14:35:10 INFO net.NetworkTopology: Adding a new node: /default-rack/192.168.1.208:50010

    16/04/08 14:35:10 INFO net.NetworkTopology: Adding a new node: /default-rack/192.168.1.207:50010

    16/04/08 14:35:10 INFO balancer.Balancer: 5 over-utilized: [192.168.1.213:50010:DISK, 192.168.1.229:50010:DISK, 192.168.1.232:50010:DISK, 192.168.1.231:50010:DISK, 192.168.1.208:50010:DISK]

    16/04/08 14:35:10 INFO balancer.Balancer: 1 underutilized未充分利用的): [192.168.1.207:50010:DISK]

    16/04/08 14:35:10 INFO balancer.Balancer: Need to move 815.45 GB to make the cluster balanced.

    16/04/08 14:35:10 INFO balancer.Balancer: Decided to move 10 GB bytes from 192.168.1.213:50010:DISK to 192.168.1.207:50010:DISK

    16/04/08 14:35:10 INFO balancer.Balancer: Will move 10 GB in this iteration

     

    16/04/08 14:41:18 INFO balancer.Dispatcher: Successfully moved blk_1073760371_19547 with size=77829046 from 192.168.1.213:50010:DISK to 192.168.1.207:50010:DISK through 192.168.1.213:50010

    16/04/08 14:41:19 INFO balancer.Dispatcher: Successfully moved blk_1073760385_19561 with size=77829046 from 192.168.1.213:50010:DISK to 192.168.1.207:50010:DISK through 192.168.1.213:50010

    16/04/08 14:41:22 INFO balancer.Dispatcher: Successfully moved blk_1073760393_19569 with size=77829046 from 192.168.1.213:50010:DISK to 192.168.1.207:50010:DISK through 192.168.1.213:50010

    16/04/08 14:41:23 INFO balancer.Dispatcher: Successfully moved blk_1073760363_19539 with size=77829046 from 192.168.1.213:50010:DISK to 192.168.1.207:50010:DISK through 192.168.1.213:50010

    10.12.9. 新增JournalNode

    找一台已有JournalNode节点,修改它的hdfs-site.xml,将新增的Journal包含进来,如在

    qjournal://hadoop1:8485;hadoop2:8485;hadoop3:8485/mycluster

     

    的基础上新增hadoop6和hadoop7两个JournalNode:

    qjournal://hadoop1:8485;hadoop2:8485;hadoop3:8485;hadoop6:8485;hadoop7:8485/mycluster

     

    然后将安装目录和数据目录(hdfs-site.xml中的dfs.journalnode.edits.dir指定的目录)都复制到新的节点。

    如果不复制JournalNode的数据目录,则新节点上的JournalNode会报错“Journal Storage Directory /data/journal/test not formatted”,将来的版本可能会实现自动同步。

    接下来,就可以在新节点上启动好JournalNode(不需要做什么初始化),并重启下NameNode。注意观察JournalNode日志,查看是否启动成功,当日志显示为以下这样的INFO级别日志则表示启动成功:

    2016-04-26 10:31:11,160 INFO org.apache.hadoop.hdfs.server.namenode.FileJournalManager: Finalizing edits file /data/journal/test/current/edits_inprogress_0000000000000194269 -> /data/journal/test/current/edits_0000000000000194269-0000000000000194270

    11. 启动YARN

    11.1. 启动YARN

    1) 进入$HADOOP_HOME/sbin目录

    2) 在主备两台都执行:start-yarn.sh,即开始启动YARN

     

    若启动成功,则在Master节点执行jps,可以看到ResourceManager:

    > jps

    24689 NameNode

    30156 Jps

    28861 ResourceManager

     

    在Slaves节点执行jps,可以看到NodeManager:

    $ jps

    14019 NodeManager

    23257 DataNode

    15115 Jps

     

    如果只需要单独启动指定节点上的ResourceManager,这样:

    sbin/yarn-daemon.sh start resourcemanager

     

    对于NodeManager,则是这样:

    sbin/yarn-daemon.sh start nodemanager

    11.2. 执行YARN命令

    11.2.1. yarn node -list

    列举YARN集群中的所有NodeManager,如(注意参数间的空格,直接执行yarn可以看到使用帮助):

    [root@hadoop1sbin]# yarn node –list

     

    11.2.2. yarn node -status

    查看指定NodeManager的状态(通过上面查出来的结果进行查询),如:

    [root@hadoop1 hadoop]# yarn node -status hadoop5:59894

    Node Report :

         Node-Id : hadoop5:59894

         Rack : /default-rack

         Node-State : RUNNING

         Node-Http-Address : hadoop5:8042

         Last-Health-Update : 星期六 10/六月/17 12:30:38:20CST

         Health-Report :

         Containers : 0

         Memory-Used : 0MB

         Memory-Capacity : 8192MB

         CPU-Used : 0 vcores

         CPU-Capacity : 8 vcores

         Node-Labels :

         Resource Utilization by Node : PMem:733 MB, VMem:733 MB, VCores:0.0

         Resource Utilization by Containers : PMem:0 MB, VMem:0 MB, VCores:0.0

     

    [root@hadoop1 hadoop]# 

    11.2.3. yarn rmadmin -getServiceState rm1

    查看rm1的主备状态,即查看它是主(active)还是备(standby)。

     

    11.2.4. yarn rmadmin -transitionToStandby rm1

    将rm1从主切为备。

    更多的yarn命令可以参考:

    https://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-site/YarnCommands.html

    12. 运行MapReduce程序

    在安装目录的share/hadoop/mapreduce子目录下,有现存的示例程序:

    hadoop@VM-40-171-sles10-64:~/hadoop> ls share/hadoop/mapreduce

    hadoop-mapreduce-client-app-2.7.2.jar         hadoop-mapreduce-client-jobclient-2.7.2-tests.jar

    hadoop-mapreduce-client-common-2.7.2.jar      hadoop-mapreduce-client-shuffle-2.7.2.jar

    hadoop-mapreduce-client-core-2.7.2.jar        hadoop-mapreduce-examples-2.7.2.jar

    hadoop-mapreduce-client-hs-2.7.2.jar          lib

    hadoop-mapreduce-client-hs-plugins-2.7.2.jar  lib-examples

    hadoop-mapreduce-client-jobclient-2.7.2.jar   sources

     

    跑一个示例程序试试:

    hdfs dfs -put /etc/hosts  hdfs://test/in/

    hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount hdfs://test/in/ hdfs://test/out/

     

    运行过程中,使用java的jps命令,可以看到yarn启动了名为YarnChild的进程。

    wordcount运行完成后,结果会保存在out目录下,保存结果的文件名类似于“part-r-00000”。另外,跑这个示例程序有两个需求注意的点:

    1) in目录下要有文本文件,或in即为被统计的文本文件,可以为HDFS上的文件或目录,也可以为本地文件或目录

    2) out目录不能存在,程序会自动去创建它,如果已经存在则会报错。

     

    包hadoop-mapreduce-examples-2.7.2.jar中含有多个示例程序,不带参数运行,即可看到用法:

    hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount

    Usage: wordcount  

     

    hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar

    An example program must be given as the first argument.

    Valid program names are:

      aggregatewordcount: An Aggregate based map/reduce program that counts the words in the input files.

      aggregatewordhist: An Aggregate based map/reduce program that computes the histogram of the words in the input files.

      bbp: A map/reduce program that uses Bailey-Borwein-Plouffe to compute exact digits of Pi.

      dbcount: An example job that count the pageview counts from a database.

      distbbp: A map/reduce program that uses a BBP-type formula to compute exact bits of Pi.

      grep: A map/reduce program that counts the matches of a regex in the input.

      join: A job that effects a join over sorted, equally partitioned datasets

      multifilewc: A job that counts words from several files.

      pentomino: A map/reduce tile laying program to find solutions to pentomino problems.

      pi: A map/reduce program that estimates Pi using a quasi-Monte Carlo method.

      randomtextwriter: A map/reduce program that writes 10GB of random textual data per node.

      randomwriter: A map/reduce program that writes 10GB of random data per node.

      secondarysort: An example defining a secondary sort to the reduce.

      sort: A map/reduce program that sorts the data written by the random writer.

      sudoku: A sudoku solver.

      teragen: Generate data for the terasort

      terasort: Run the terasort

      teravalidate: Checking results of terasort

      wordcount: A map/reduce program that counts the words in the input files.

      wordmean: A map/reduce program that counts the average length of the words in the input files.

      wordmedian: A map/reduce program that counts the median length of the words in the input files.

      wordstandarddeviation: A map/reduce program that counts the standard deviation of the length of the words in the input files.

     

    修改日志级别为DEBBUG,并打屏:

    export HADOOP_ROOT_LOGGER=DEBUG,console 

    13. HDFS权限配置

    13.1. hdfs-site.xml

    dfs.permissions.enabled = true

    dfs.permissions.superusergroup = supergroup

    dfs.cluster.administrators = ACL-for-admins

    dfs.namenode.acls.enabled = true

    dfs.web.ugi = webuser,webgroup

    13.2. core-site.xml

    fs.permissions.umask-mode = 022

    hadoop.security.authentication = simple 安全验证规则,可为simple或kerberos

    14. C++客户端编程

    14.1. 示例代码

    // g++ -g -o x x.cpp -L$JAVA_HOME/lib/amd64/jli -ljli -L$JAVA_HOME/jre/lib/amd64/server -ljvm -I$HADOOP_HOME/include $HADOOP_HOME/lib/native/libhdfs.a -lpthread -ldl

    #include "hdfs.h"

    #include 

    #include 

    #include 

     

    int main(int argc, char **argv)

    {

    #if 0

        hdfsFS fs = hdfsConnect("default", 0); // HA方式

        const char* writePath = "hdfs://mycluster/tmp/testfile.txt";

        hdfsFile writeFile = hdfsOpenFile(fs, writePath, O_WRONLY |O_CREAT, 0, 0, 0);

        if(!writeFile)

        {

              fprintf(stderr, "Failed to open %s for writing! ", writePath);

              exit(-1);

        }

        const char* buffer = "Hello, World! ";

        tSize num_written_bytes = hdfsWrite(fs, writeFile, (void*)buffer, strlen(buffer)+1);

        if (hdfsFlush(fs, writeFile))

        {

               fprintf(stderr, "Failed to 'flush' %s ", writePath);

              exit(-1);

        }

        hdfsCloseFile(fs, writeFile);

    #else

        struct hdfsBuilder* bld = hdfsNewBuilder();

        hdfsBuilderSetNameNode(bld, "default"); // HA方式

        hdfsFS fs = hdfsBuilderConnect(bld);

        if (NULL == fs)

        {

              fprintf(stderr, "Failed to connect hdfs ");

              exit(-1);

        }

        int num_entries = 0;

        hdfsFileInfo* entries;

        if (argc < 2)

            entries = hdfsListDirectory(fs, "/", &num_entries);

        else

            entries = hdfsListDirectory(fs, argv[1], &num_entries);

        fprintf(stdout, "num_entries: %d ", num_entries);

        for (int i=0; i<num_entries; ++i) </num_entries; ++i)<>

        {

            fprintf(stdout, "%s ", entries[i].mName);

        } 

        hdfsFreeFileInfo(entries, num_entries);

        hdfsDisconnect(fs);

        //hdfsFreeBuilder(bld); 

    #endif

        return 0;

    }

    14.2. 运行示例

    运行之前需要设置好CLASSPATH,如果设置不当,可能会遇到不少困难,比如期望操作HDFS上的文件和目录,却变成了本地的文件和目录,如者诸于“java.net.UnknownHostException”类的错误等。

    为避免出现错误,强烈建议使用命令“hadoop classpath --glob”取得正确的CLASSPATH值。

    另外还需要设置好libjli.so和libjvm.so两个库的LD_LIBRARY_PATH,如:

    export LD_LIBRARY_PATH=$JAVA_HOME/lib/amd64/jli:$JAVA_HOME/jre/lib/amd64/server:$LD_LIBRARY_PATH

    15. 常见错误

    15.1. 执行“hdfs dfs -ls”时报ConnectException

    原因可能是指定的端口号9000不对,该端口号由hdfs-site.xml中的属性“dfs.namenode.rpc-address”指定,即为NameNode的RPC服务端口号。

     

    文件上传后,被存储在DataNode的data(由DataNode的hdfs-site.xml中的属性“dfs.datanode.data.dir”指定)目录下,如:

    $HADOOP_HOME/data/current/BP-139798373-192.168.106.91-1397735615751/current/finalized/blk_1073741825

    文件名中的“blk”是block,即块的意思,默认情况下blk_1073741825即为文件的一个完整块,Hadoop未对它进额外处理。

    hdfs dfs -ls hdfs://192.168.106.91:9000

    14/04/17 12:04:02 WARN conf.Configuration: mapred-site.xml:an attempt to override final parameter: mapreduce.job.end-notification.max.attempts;  Ignoring.

    14/04/17 12:04:02 WARN conf.Configuration: mapred-site.xml:an attempt to override final parameter: mapreduce.job.end-notification.max.retry.interval;  Ignoring.

    14/04/17 12:04:02 WARN conf.Configuration: mapred-site.xml:an attempt to override final parameter: mapreduce.job.end-notification.max.attempts;  Ignoring.

    14/04/17 12:04:02 WARN conf.Configuration: mapred-site.xml:an attempt to override final parameter: mapreduce.job.end-notification.max.retry.interval;  Ignoring.

    14/04/17 12:04:02 WARN conf.Configuration: mapred-site.xml:an attempt to override final parameter: mapreduce.job.end-notification.max.attempts;  Ignoring.

    14/04/17 12:04:02 WARN conf.Configuration: mapred-site.xml:an attempt to override final parameter: mapreduce.job.end-notification.max.retry.interval;  Ignoring.

    Java HotSpot(TM) 64-Bit Server VM warning: You have loaded library /home/tuzq/software/hadoop-2.8.0/lib/native/libhadoop.so.1.0.0 which might have disabled stack guard. The VM will try to fix the stack guard now.

    It's highly recommended that you fix the library with 'execstack -c ', or link it with '-z noexecstack'.

    14/04/17 12:04:02 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

    14/04/17 12:04:03 WARN conf.Configuration: mapred-site.xml:an attempt to override final parameter: mapreduce.job.end-notification.max.attempts;  Ignoring.

    14/04/17 12:04:03 WARN conf.Configuration: mapred-site.xml:an attempt to override final parameter: mapreduce.job.end-notification.max.retry.interval;  Ignoring.

    ls: Call From VM-40-171-sles10-64/192.168.106.91 to VM-40-171-sles10-64:9000 failed on connection exception: java.net.ConnectException拒绝连接; For more details see:  http://wiki.apache.org/hadoop/ConnectionRefused

    15.2. Initialization failed for Block pool

    可能是因为对NameNode做format之前,没有清空DataNode的data目录。

    15.3. Incompatible clusterIDs

     

    “Incompatible clusterIDs”的错误原因是在执行“hdfs namenode -format”之前,没有清空DataNode节点的data目录。

     

    网上一些文章和帖子说是tmp目录,它本身也是没问题的,但Hadoop 2.7.2是data目录,实际上这个信息已经由日志的“/home/tuzq/software/hadoop-2.8.0/data”指出,所以不能死死的参照网上的解决办法,遇到问题时多仔细观察。

     

    从上述描述不难看出,解决办法就是清空所有DataNode的data目录,但注意不要将data目录本身给删除了。

    data目录由core-site.xml文件中的属性“dfs.datanode.data.dir”指定。

     

    2014-04-17 19:30:33,075 INFO org.apache.hadoop.hdfs.server.common.Storage: Lock on /home/tuzq/software/hadoop-2.8.0/data/in_use.lock acquired by nodename 28326@localhost

    2014-04-17 19:30:33,078 FATAL org.apache.hadoop.hdfs.server.datanode.DataNode: Initialization failed for block pool Block pool  (Datanode Uuid unassigned) service to /192.168.106.91:9001

    java.io.IOException: Incompatible clusterIDs in /home/tuzq/software/hadoop-2.8.0/data: namenode clusterID = CID-50401d89-a33e-47bf-9d14-914d8f1c4862; datanode clusterID = CID-153d6fcb-d037-4156-b63a-10d6be224091

            at org.apache.hadoop.hdfs.server.datanode.DataStorage.doTransition(DataStorage.java:472)

            at org.apache.hadoop.hdfs.server.datanode.DataStorage.recoverTransitionRead(DataStorage.java:225)

            at org.apache.hadoop.hdfs.server.datanode.DataStorage.recoverTransitionRead(DataStorage.java:249)

            at org.apache.hadoop.hdfs.server.datanode.DataNode.initStorage(DataNode.java:929)

            at org.apache.hadoop.hdfs.server.datanode.DataNode.initBlockPool(DataNode.java:900)

            at org.apache.hadoop.hdfs.server.datanode.BPOfferService.verifyAndSetNamespaceInfo(BPOfferService.java:274)

            at org.apache.hadoop.hdfs.server.datanode.BPServiceActor.connectToNNAndHandshake(BPServiceActor.java:220)

            at org.apache.hadoop.hdfs.server.datanode.BPServiceActor.run(BPServiceActor.java:815)

            at java.lang.Thread.run(Thread.java:744)

    2014-04-17 19:30:33,081 WARN org.apache.hadoop.hdfs.server.datanode.DataNode: Ending block pool service for: Block pool  (Datanode Uuid unassigned) service to /192.168.106.91:9001

    2014-04-17 19:30:33,184 WARN org.apache.hadoop.hdfs.server.datanode.DataNode: Block pool ID needed, but service not yet registered with NN

    java.lang.Exception: trace

            at org.apache.hadoop.hdfs.server.datanode.BPOfferService.getBlockPoolId(BPOfferService.java:143)

            at org.apache.hadoop.hdfs.server.datanode.BlockPoolManager.remove(BlockPoolManager.java:91)

            at org.apache.hadoop.hdfs.server.datanode.DataNode.shutdownBlockPool(DataNode.java:859)

            at org.apache.hadoop.hdfs.server.datanode.BPOfferService.shutdownActor(BPOfferService.java:350)

            at org.apache.hadoop.hdfs.server.datanode.BPServiceActor.cleanUp(BPServiceActor.java:619)

            at org.apache.hadoop.hdfs.server.datanode.BPServiceActor.run(BPServiceActor.java:837)

            at java.lang.Thread.run(Thread.java:744)

    2014-04-17 19:30:33,184 INFO org.apache.hadoop.hdfs.server.datanode.DataNode: Removed Block pool  (Datanode Uuid unassigned)

    2014-04-17 19:30:33,184 WARN org.apache.hadoop.hdfs.server.datanode.DataNode: Block pool ID needed, but service not yet registered with NN

    java.lang.Exception: trace

            at org.apache.hadoop.hdfs.server.datanode.BPOfferService.getBlockPoolId(BPOfferService.java:143)

            at org.apache.hadoop.hdfs.server.datanode.DataNode.shutdownBlockPool(DataNode.java:861)

            at org.apache.hadoop.hdfs.server.datanode.BPOfferService.shutdownActor(BPOfferService.java:350)

            at org.apache.hadoop.hdfs.server.datanode.BPServiceActor.cleanUp(BPServiceActor.java:619)

            at org.apache.hadoop.hdfs.server.datanode.BPServiceActor.run(BPServiceActor.java:837)

            at java.lang.Thread.run(Thread.java:744)

    2014-04-17 19:30:35,185 WARN org.apache.hadoop.hdfs.server.datanode.DataNode: Exiting Datanode

    2014-04-17 19:30:35,187 INFO org.apache.hadoop.util.ExitUtil: Exiting with status 0

    2014-04-17 19:30:35,189 INFO org.apache.hadoop.hdfs.server.datanode.DataNode: SHUTDOWN_MSG:

    /************************************************************

    SHUTDOWN_MSG: Shutting down DataNode at localhost/127.0.0.1

    ************************************************************/

    15.4. Inconsistent checkpoint fields

    SecondaryNameNode中的“Inconsistent checkpoint fields”错误原因,可能是因为没有设置好SecondaryNameNode上core-site.xml文件中的“hadoop.tmp.dir”。

     

    2014-04-17 11:42:18,189 INFO org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode: Log Size Trigger    :1000000 txns

    2014-04-17 11:43:18,365 ERROR org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode: Exception in doCheckpoint

    java.io.IOException: Inconsistent checkpoint fields.

    LV = -56 namespaceID = 1384221685 cTime = 0 ; clusterId = CID-319b9698-c88d-4fe2-8cb2-c4f440f690d4 ; blockpoolId = BP-1627258458-192.168.106.91-1397735061985.

    Expecting respectively: -56; 476845826; 0; CID-50401d89-a33e-47bf-9d14-914d8f1c4862; BP-2131387753-192.168.106.91-1397730036484.

            at org.apache.hadoop.hdfs.server.namenode.CheckpointSignature.validateStorageInfo(CheckpointSignature.java:135)

            at org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode.doCheckpoint(SecondaryNameNode.java:518)

            at org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode.doWork(SecondaryNameNode.java:383)

            at org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode$1.run(SecondaryNameNode.java:349)

            at org.apache.hadoop.security.SecurityUtil.doAsLoginUserOrFatal(SecurityUtil.java:415)

            at org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode.run(SecondaryNameNode.java:345)

            at java.lang.Thread.run(Thread.java:744)

     

    另外,也请配置好SecondaryNameNodehdfs-site.xml中的“dfs.datanode.data.dir”为合适的值:

      hadoop.tmp.dir

      /home/tuzq/software/current/tmp

      A base for other temporary directories.

    15.5. fs.defaultFS is file:///

    在core-site.xml中,当只填写了fs.defaultFS,而fs.default.name为默认的file:///时,会报此错误。解决方法是设置成相同的值。

    15.6. a shared edits dir must not be specified if HA is not enabled

    该错误可能是因为hdfs-site.xml中没有配置dfs.nameservices或dfs.ha.namenodes.mycluster。

    15.7. /tmp/dfs/name is in an inconsistent state: storage directory does not exist or is not accessible.

    只需按日志中提示的,创建好相应的目录。

    15.8. The auxService:mapreduce_shuffle does not exist

    问题原因是没有配置yarn-site.xml中的“yarn.nodemanager.aux-services”,将它的值配置为mapreduce_shuffle,然后重启yarn问题即解决。记住所有yarn节点都需要修改,包括ResourceManager和NodeManager,如果NodeManager上的没有修改,仍然会报这个错误。

    15.9. org.apache.hadoop.ipc.Client: Retrying connect to server

    该问题,有可能是因为NodeManager中的yarn-site.xml和ResourceManager上的不一致,比如NodeManager没有配置yarn.resourcemanager.ha.rm-ids。

    15.10. mapreduce.Job: Running job: job_1445931397013_0001

    Hadoop提交mapreduce任务时,卡在mapreduce.Job: Running job: job_1445931397013_0001处。

    问题原因可能是因为yarn的NodeManager没起来,可以用jdk的jps确认下。

     

    该问题也有可能是因为NodeManager中的yarn-site.xml和ResourceManager上的不一致,比如NodeManager没有配置yarn.resourcemanager.ha.rm-ids。

    15.11. Could not format one or more JournalNodes

    执行“./hdfs namenode -format”时报“Could not format one or more JournalNodes”。

    可能是hdfs-site.xml中的dfs.namenode.shared.edits.dir配置错误,比如重复了,如:

     qjournal://hadoop-168-254:8485;hadoop-168-254:8485;hadoop-168-253:8485;hadoop-168-252:8485;hadoop-168-251:8485/mycluster

     

    修复后,重启JournalNode,问题可能就解决了。

    15.12. org.apache.hadoop.yarn.server.resourcemanager.ResourceManager: Already in standby state

    遇到这个错误,可能是yarn-site.xml中的yarn.resourcemanager.webapp.address配置错误,比如配置成了两个yarn.resourcemanager.webapp.address.rm1,实际应当是yarn.resourcemanager.webapp.address.rm1和yarn.resourcemanager.webapp.address.rm2。

    15.13. No valid image files found

    如果是备NameNode,执行下“hdfs namenode -bootstrapStandby”再启动。

    2015-12-01 15:24:39,535 ERROR org.apache.hadoop.hdfs.server.namenode.NameNode: Failed to start namenode.

    java.io.FileNotFoundException: No valid image files found

            at org.apache.hadoop.hdfs.server.namenode.FSImageTransactionalStorageInspector.getLatestImages(FSImageTransactionalStorageInspector.java:165)

            at org.apache.hadoop.hdfs.server.namenode.FSImage.loadFSImage(FSImage.java:623)

            at org.apache.hadoop.hdfs.server.namenode.FSImage.recoverTransitionRead(FSImage.java:294)

            at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.loadFSImage(FSNamesystem.java:975)

            at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.loadFromDisk(FSNamesystem.java:681)

            at org.apache.hadoop.hdfs.server.namenode.NameNode.loadNamesystem(NameNode.java:584)

            at org.apache.hadoop.hdfs.server.namenode.NameNode.initialize(NameNode.java:644)

            at org.apache.hadoop.hdfs.server.namenode.NameNode.(NameNode.java:811)

            at org.apache.hadoop.hdfs.server.namenode.NameNode.(NameNode.java:795)

            at org.apache.hadoop.hdfs.server.namenode.NameNode.createNameNode(NameNode.java:1488)

            at org.apache.hadoop.hdfs.server.namenode.NameNode.main(NameNode.java:1554)

    2015-12-01 15:24:39,536 INFO org.apache.hadoop.util.ExitUtil: Exiting with status 1

    2015-12-01 15:24:39,539 INFO org.apache.hadoop.hdfs.server.namenode.NameNode: SHUTDOWN_MSG:

    15.14. xceivercount 4097 exceeds the limit of concurrent xcievers 4096

    此错误的原因是hdfs-site.xml中的配置项“dfs.datanode.max.xcievers”值4096过小,需要改大一点。该错误会导致hbase报“notservingregionexception”。

    16/04/06 14:30:34 ERROR namenode.NameNode: Failed to start namenode.

    15.15. java.lang.IllegalArgumentException: Unable to construct journal, qjournal://hadoop-030:8485;hadoop-031:8454;hadoop-032

    执行“hdfs namenode -format”遇到上述错误时,是因为hdfs-site.xml中的配置dfs.namenode.shared.edits.dir配置错误,其中的hadoop-032省了“:8454”部分。

    15.16. Bad URI 'qjournal://hadoop-030:8485;hadoop-031:8454;hadoop-032:8454': must identify journal in path component

    是因为配置hdfs-site.xml中的“dfs.namenode.shared.edits.dir”时,路径少带了cluster名。

    15.17. 16/04/06 14:48:19 INFO ipc.Client: Retrying connect to server: hadoop-032/10.143.136.211:8454. Already tried 0 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1000 MILLISECONDS)

    检查hdfs-site.xml中的“dfs.namenode.shared.edits.dir”值,JournalNode默认端口是8485,不是8454,确认是否有写错。JournalNode端口由hdfs-site.xml中的配置项dfs.journalnode.rpc-address决定。

    15.18. Exception in thread "main" org.apache.hadoop.HadoopIllegalArgumentException: Could not get the namenode ID of this node. You may run zkfc on the node other than namenode.

    执行“hdfs zkfc -formatZK”遇到上面这个错误,是因为还没有执行“hdfs namenode -format”。NameNode ID是在“hdfs namenode -format”时生成的。

    15.19. 2016-04-06 17:08:07,690 INFO org.apache.hadoop.hdfs.server.common.Storage: Storage directory [DISK]file:/data3/datanode/data/ has already been used.

    以非root用户启动DataNode,但启动不了,在它的日志文件中发现如下错误信息:

    2016-04-06 17:08:07,707 INFO org.apache.hadoop.hdfs.server.common.Storage: Analyzing storage directories for bpid BP-418073539-10.143.136.207-1459927327462

    2016-04-06 17:08:07,707 WARN org.apache.hadoop.hdfs.server.common.Storage: Failed to analyze storage directories for block pool BP-418073539-10.143.136.207-1459927327462

    java.io.IOException: BlockPoolSliceStorage.recoverTransitionRead: attempt to load an used block storage: /data3/datanode/data/current/BP-418073539-10.143.136.207-1459927327462

    继续寻找,会发现还存在如何错误提示:

    Invalid dfs.datanode.data.dir /data3/datanode/data:

    EPERM: Operation not permitted

    使用命令“ls -l”检查目录/data3/datanode/data的权限设置,发现owner为root,原因是因为之前使用root启动过DataNode,将owner改过来即可解决此问题。

    15.20. 2016-04-06 18:00:26,939 WARN org.apache.hadoop.hdfs.server.datanode.DataNode: Problem connecting to server: hadoop-031/10.143.136.208:8020

    DataNode的日志文件不停地记录如下日志,是因为DataNode将作为主NameNode,但实际上10.143.136.208并没有启动,主NameNode不是它。这个并不表示DataNode没有起来,而是因为DataNode会同时和主NameNode和备NameNode建立心跳,当备NameNode没有起来时,有这些日志是正常现象。

    2016-04-06 18:00:32,940 INFO org.apache.hadoop.ipc.Client: Retrying connect to server: hadoop-031/10.143.136.208:8020. Already tried 0 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1000 MILLISECONDS)

    2016-04-06 17:55:44,555 INFO org.apache.hadoop.hdfs.server.datanode.DataNode: Namenode Block pool BP-418073539-10.143.136.207-1459927327462 (Datanode Uuid 2d115d45-fd48-4e86-97b1-e74a1f87e1ca) service to hadoop-030/10.143.136.207:8020 trying to claim ACTIVE state with txid=1

    “trying to claim ACTIVE state”出自于hadoop/hdfs/server/datanode/BPOfferService.java中的updateActorStatesFromHeartbeat()。

     

    2016-04-06 17:55:49,893 INFO org.apache.hadoop.ipc.Client: Retrying connect to server: hadoop-031/10.143.136.208:8020. Already tried 5 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1000 MILLISECONDS)

    “Retrying connect to server”出自于hadoop/ipc/Client.java中的handleConnectionTimeout()和handleConnectionFailure()。

    15.21. ERROR cluster.YarnClientSchedulerBackend: Yarn application has already exited with state FINISHED!

    如果遇到这个错误,请检查NodeManager日志,如果发现有如下所示信息:

    WARN org.apache.hadoop.yarn.server.nodemanager.containermanager.monitor.ContainersMonitorImpl: Container [pid=26665,containerID=container_1461657380500_0020_02_000001] is running beyond virtual memory limits. Current usage: 345.0 MB of 1 GB physical memory used; 2.2 GB of 2.1 GB virtual memory used. Killing container.

     

    则表示需要增大yarn-site.xmk的配置项yarn.nodemanager.vmem-pmem-ratio的值,该配置项默认值为2.1。

    16/10/13 10:23:19 ERROR client.TransportClient: Failed to send RPC 7614640087981520382 to /10.143.136.231:34800: java.nio.channels.ClosedChannelException

    java.nio.channels.ClosedChannelException

    16/10/13 10:23:19 ERROR cluster.YarnSchedulerBackend$YarnSchedulerEndpoint: Sending RequestExecutors(0,0,Map()) to AM was unsuccessful

    java.io.IOException: Failed to send RPC 7614640087981520382 to /10.143.136.231:34800: java.nio.channels.ClosedChannelException

            at org.apache.spark.network.client.TransportClient$3.operationComplete(TransportClient.java:249)

            at org.apache.spark.network.client.TransportClient$3.operationComplete(TransportClient.java:233)

            at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:680)

            at io.netty.util.concurrent.DefaultPromise$LateListeners.run(DefaultPromise.java:845)

            at io.netty.util.concurrent.DefaultPromise$LateListenerNotifier.run(DefaultPromise.java:873)

            at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:357)

            at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:357)

            at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:111)

            at java.lang.Thread.run(Thread.java:745)

    .hadoop是什么

    Hadoop被公认是一套行业大数据标准开源软件,在分布式环境下提供了海量数据的处理能力。几乎所有主流厂商都围绕Hadoop开发工具、开源软件、商业化工具和技术服务。今年大型IT公司,如EMC、Microsoft、Intel、Teradata、Cisco都明显增加了Hadoop方面的投入。

     

    二 .hadoop能干什么

    hadoop擅长日志分析,facebook就用Hive来进行日志分析,2009年时facebook就有非编程人员的30%的人使用HiveQL进行数据分析;淘宝搜索中的自定义筛选也使用的Hive;利用Pig还可以做高级的数据处理,包括Twitter、LinkedIn 上用于发现您可能认识的人,可以实现类似Amazon.com的协同过滤的推荐效果。淘宝的商品推荐也是!在Yahoo!的40%的Hadoop作业是用pig运行的,包括垃圾邮件的识别和过滤,还有用户特征建模。(2012年8月25新更新,天猫的推荐系统是hive,少量尝试mahout!)

     

    三.hadoop的核心

    1.HDFS: Hadoop Distributed File System  分布式文件系统

    2.YARN: Yet Another Resource Negotiator   资源管理调度系统

    3.Mapreduce:分布式运算框架

     

    四.HDFS的架构

    主从结构

           •主节点, namenode

            •从节点,有很多个: datanode

    namenode负责:

             •接收用户操作请求

             •维护文件系统的目录结构

             •管理文件与block之间关系,block与datanode之间关系

    datanode负责:

             •存储文件

             •文件被分成block存储在磁盘上

             •为保证数据安全,文件会有多个副本

     

    Secondary NameNode负责:

               合并fsimage和edits文件来更新NameNode的metedata

     

    五.Hadoop的特点

    扩容能力(Scalable):能可靠地(reliably)存储和处理千兆字节(PB)数据。

    成本低(Economical):可以通过普通机器组成的服务器群来分发以及处理数据。这些服务器群总计可达数千个节点。

    高效率(Efficient):通过分发数据,hadoop可以在数据所在的节点上并行地(parallel)处理它们,这使得处理非常的快速。

    可靠性(Reliable):hadoop能自动地维护数据的多份副本,并且在任务失败后能自动地重新部署(redeploy)计算任务。

     

    六.NameNode

    1.简介

    namenode是整个文件系统的管理节点。他维护着整个文件系统的文件目录树,文件/目录的元信息和每个文件对应的数据块列表。接收用户的操作请求。

    文件包括:

    fsimage:元数据镜像文件。存储某一时段NameNode内存元数据信息。

    edits:操作日志文件。

    fstime:保存最近一次checkpoint的时间。

     

    2.NameNode的工作特点

    NameNode始终在内存中保存metedata,用于处理“读请求”,到有“写请求”到来时,NameNode首先会写editlog到磁盘,即向edits文件中写日志,成功返回后,才会修改内存,并且向客户端返回。

    Hadoop会维护一个人fsimage文件,也就是NameNode中metedata的镜像,但是fsimage不会随时与NameNode内存中的metedata保持一致,而是每隔一段时间通过合并edits文件来更新内容。Secondary NameNode就是用来合并fsimage和edits文件来更新NameNode的metedata的。

     

    3.什么时候checkpoint

    fs.checkpoint.period 指定两次checkpoint的最大时间间隔,默认3600秒。 
    fs.checkpoint.size    规定edits文件的最大值,一旦超过这个值则强制checkpoint,不管是否到达最大时间间隔。默认大小是64M。

     

     

    七.SecondaryNameNode

    1.简介

    HA的一个解决方案。但不支持热备。配置即可。
    执行过程:从NameNode上下载元数据信息(fsimage,edits),然后把二者合并,生成新的fsimage,在本地保存,并将其推送到NameNode,替换旧的fsimage.
    默认在安装在NameNode节点上,但这样...不安全!

    2.工作流程

    (1)secondary通知namenode切换edits文件;
    (2)secondary从namenode获得fsimage和edits(通过http);
    (3)secondary将fsimage载入内存,然后开始合并edits;
    (4)secondary将新的fsimage发回给namenode;
    (5)namenode用新的fsimage替换旧的fsimage;

     

    八.DataNode

    提供真实文件数据的存储服务。
    文件块(block):最基本的存储单位。对于文件内容而言,一个文件的长度大小是size,那么从文件的0偏移开始,按照固定的大小,顺序对文件进行划分并编号,划分好的每一个块称一个Block。HDFS默认Block大小是128MB,以一个256MB文件,共有256/128=2个Block.
    dfs.block.size
    不同于普通文件系统的是,HDFS中,如果一个文件小于一个数据块的大小,并不占用整个数据块存储空间;
    Replication:多复本。默认是三个。

     

    九.HDFS

    (1)读过程

    1.初始化FileSystem,然后客户端(client)用FileSystem的open()函数打开文件

    2.FileSystem用RPC调用元数据节点,得到文件的数据块信息,对于每一个数据块,元数据节点返回保存数据块的数据节点的地址。

    3.FileSystem返回FSDataInputStream给客户端,用来读取数据,客户端调用stream的read()函数开始读取数据。

    4.DFSInputStream连接保存此文件第一个数据块的最近的数据节点,data从数据节点读到客户端(client)

    5.当此数据块读取完毕时,DFSInputStream关闭和此数据节点的连接,然后连接此文件下一个数据块的最近的数据节点。

    6.当客户端读取完毕数据的时候,调用FSDataInputStream的close函数。

    7.在读取数据的过程中,如果客户端在与数据节点通信出现错误,则尝试连接包含此数据块的下一个数据节点。

    8.失败的数据节点将被记录,以后不再连接。

     

    (2)写过程

    1.初始化FileSystem,客户端调用create()来创建文件

    2.FileSystem用RPC调用元数据节点,在文件系统的命名空间中创建一个新的文件,元数据节点首先确定文件原来不存在,并且客户端有创建文件的权限,然后创建新文件。

    3.FileSystem返回DFSOutputStream,客户端用于写数据,客户端开始写入数据。

    4.DFSOutputStream将数据分成块,写入data queue。data queue由Data Streamer读取,并通知元数据节点分配数据节点,用来存储数据块(每块默认复制3块)。分配的数据节点放在一个pipeline里。Data Streamer将数据块写入pipeline中的第一个数据节点。第一个数据节点将数据块发送给第二个数据节点。第二个数据节点将数据发送给第三个数据节点。

    5.DFSOutputStream为发出去的数据块保存了ack queue,等待pipeline中的数据节点告知数据已经写入成功。

    6.当客户端结束写入数据,则调用stream的close函数。此操作将所有的数据块写入pipeline中的数据节点,并等待ack queue返回成功。最后通知元数据节点写入完毕。

    7.如果数据节点在写入的过程中失败,关闭pipeline,将ack queue中的数据块放入data queue的开始,当前的数据块在已经写入的数据节点中被元数据节点赋予新的标示,则错误节点重启后能够察觉其数据块是过时的,会被删除。失败的数据节点从pipeline中移除,另外的数据块则写入pipeline中的另外两个数据节点。元数据节点则被通知此数据块是复制块数不足,将来会再创建第三份备份。

     

     

    2018-09-04 18:20:00 qq_29721419 阅读数 2638

    Hadoop的架构

    在其核心,Hadoop主要有两个层次,即:

    • 加工/计算层(MapReduce)
    • 存储层(Hadoop分布式文件系统)

    除了上面提到的两个核心组件,Hadoop的框架还包括以下两个模块:

    • Hadoop通用:这是Java库和其他Hadoop组件所需的实用工具
    • Hadoop YARN :这是作业调度和集群资源管理的框架

    Hadoop Streaming 是一个实用程序,它允许用户使用任何可执行文件(例如shell实用程序)作为映射器和/或reducer创建和运行作业。

    HDFS:

    HDFS遵循主从架构,它具有以下元素。

    1、名称节点 -Namenode

    名称节点是包含GNU/Linux操作系统和软件名称节点的普通硬件。它是一个可以在商品硬件上运行的软件。具有名称节点系统作为主服务器,它执行以下任务: 
    - 管理文件系统命名空间。 
    - 规范客户端对文件的访问。 
    - 它也执行文件系统操作,如重命名,关闭和打开的文件和目录。

    2、数据节点 - Datanode

    Datanode具有GNU/Linux操作系统和软件Datanode的普通硬件。对于集群中的每个节点(普通硬件/系统),有一个数据节点。这些节点管理数据存储在它们的系统。 
    - 数据节点上的文件系统执行的读写操作,根据客户的请求。 
    - 还根据名称节点的指令执行操作,如块的创建,删除和复制。

    3、块 -block

    一般用户数据存储在HDFS文件。在一个文件系统中的文件将被划分为一个或多个段和/或存储在个人数据的节点。这些文件段被称为块。换句话说,数据的HDFS可以读取或写入的最小量被称为一个块。缺省的块大小为64MB,但它可以增加按需要在HDFS配置来改变

    HDFS常用命令

    • 运行jar包:hadoop jar /Users/kexin/work/projects/Hadoop/target/hadoop-0.0.1-SNAPSHOT.jar com.kexin.hadoop.units.WordCount /test/test.txt /project/wordcount/output
    • 文件系统操作:hadoop fs -cat|ls|mkdir
    • 上传文件:hadoop dfs -put ./testdata.txt /testdata
    • 递归删除目录及文件:hadoop fs -rmr /testdata
    • 删除文件:hadoop fs -rm /testdata.txt

    MapReduce

    教程: 
    https://www.cnblogs.com/huxinga/p/6939896.html 
    http://hadoop.apache.org/docs/current/hadoop-mapreduce-client/hadoop-mapreduce-client-core/MapReduceTutorial.html#Example:_WordCount_v2.0

    MapReduce计划分三个阶段执行,即映射阶段,shuffle阶段,并减少阶段。

    涉及到的角色:

    1、客户端(client):编写mapreduce程序,配置作业,提交作业,这就是程序员完成的工作;

    2、JobTracker:初始化作业,分配作业,与TaskTracker通信,协调整个作业的执行;

    3、TaskTracker:保持与JobTracker的通信,在分配的数据片段上执行Map或Reduce任务,TaskTracker和JobTracker的不同有个很重要的方面,就是在执行任务时候TaskTracker可以有n多个,JobTracker则只会有一个(JobTracker只能有一个就和hdfs里namenode一样存在单点故障,我会在后面的mapreduce的相关问题里讲到这个问题的)

    4、Hdfs:保存作业的数据、配置信息等等,最后的结果也是保存在hdfs上面

    • map阶段:映射或映射器的工作是处理输入数据。一般输入数据以存储在HDFS的文件或目录的形式,输入文件被传递到映射器功能线路,映射器处理该数据,并创建数据的若干小块。

    • reduce阶段:这个阶段是Shuffle阶段和Reduce阶段的组合。减速器的工作是处理该来自映射器中的数据。处理之后,它产生一组新的输出,这将被存储在HDFS。

    image

    在一个MapReduce工作过程中:

    1、由Hadoop发送Map和Reduce任务到集群的相应服务器

    2、框架管理数据传递,例如发出任务的所有节点之间的集群周围的详细信息,验证任务完成,和复制数据

    3、大部分的计算发生在与在本地磁盘上,可以减少网络通信量数据的节点

    4、给定的任务完成后,将收集并减少了数据,以一个合适的结果发送回Hadoop服务器

    应用程序通常实现Mapper和Reducer接口以提供map和reduce方法:

    public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable> {
    
            private final static IntWritable one = new IntWritable(1);
            private Text word = new Text();
    
            public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
                StringTokenizer itr = new StringTokenizer(value.toString());
                while (itr.hasMoreTokens()) {
                    word.set(itr.nextToken());
                    context.write(word, one);
                }
            }
        }
    
        public static class IntSumReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
            private IntWritable result = new IntWritable();
    
            public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
                int sum = 0;
                for (IntWritable val : values) {
                    sum += val.get();
                }
                result.set(sum);
                context.write(key, result);
            }
        }
    
        public static void main(String[] args) throws Exception {
            Configuration conf = new Configuration();
            Job job = Job.getInstance(conf, "word count");
            job.setJarByClass(WordCount.class);
            job.setMapperClass(TokenizerMapper.class);
            job.setCombinerClass(IntSumReducer.class);
            job.setReducerClass(IntSumReducer.class);
            job.setOutputKeyClass(Text.class);
            job.setOutputValueClass(IntWritable.class);
            FileInputFormat.addInputPath(job, new Path(args[0]));
            FileOutputFormat.setOutputPath(job, new Path(args[1]));
            System.exit(job.waitForCompletion(true) ? 0 : 1);
        }

    在idea中远程调试程序

      System.setProperty("hadoop.home.dir", "/Users/kexin/work/app/hadoop/hadoop-2.6.5");
    
        Configuration conf = new Configuration();
        String uri = "hdfs://localhost:9000";
        Job job = null;
        try {
            job = Job.getInstance(conf);
        } catch (IOException e) {
            e.printStackTrace();
        }
        job.setJarByClass(WordCount.class);
        job.setMapperClass(TokenizerMapper.class);
        job.setReducerClass(IntSumReducer.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);
    
        FileSystem fs = FileSystem.get(URI.create(uri), conf);
    
        try {
            FileInputFormat.addInputPath(job, new Path("hdfs://localhost:9000/test/test.txt"));
            Path outpath = new Path("hdfs://localhost:9000/project/wordcount/output");
            if (fs.exists(outpath)) {
                fs.delete(outpath, true);
            }
            FileOutputFormat.setOutputPath(job, outpath);
        } catch (IllegalArgumentException | IOException e) {
            e.printStackTrace();
        }
    
        try {
            job.submit();
        } catch (ClassNotFoundException | IOException | InterruptedException e) {
            e.printStackTrace();
        }

    在idea中本地调试程序

    System.setProperty("hadoop.home.dir", "/Users/kexin/work/app/hadoop/hadoop-2.6.5");
    
        Configuration config = new Configuration();
    
        try {
            FileSystem fs = FileSystem.get(config);
    
            Job job = Job.getInstance(config);
            job.setJarByClass(WordCount.class);
    
            job.setJobName("word count");
    
            job.setMapperClass(TokenizerMapper.class);
            job.setReducerClass(IntSumReducer.class);
    
            job.setMapOutputKeyClass(Text.class);
            job.setMapOutputValueClass(IntWritable.class);
    
            FileInputFormat.addInputPath(job, new Path("/Users/kexin/work/projects/Hadoop/src/main/resources/input"));
            Path outpath = new Path("/Users/kexin/work/projects/Hadoop/src/main/resources/output");
            if (fs.exists(outpath)) {
                fs.delete(outpath, true);
            }
            FileOutputFormat.setOutputPath(job, outpath);
    
            boolean f = job.waitForCompletion(true);
            if (f) {
                System.out.println("job任务执行成功");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    1、映射器

    映射器将输入k/v对映射到一组中间k/v对。转换后的中间记录不需要与输入记录的类型相同。给定的输入对可以映射到零个或多个输出对。通过调用context.write(WritableComparable,Writable)来收集输出对。

    Hadoop MapReduce框架为作业的InputFormat生成的每个InputSplit生成一个map任务。

    总的来说,映射器实现通过Job.setMapperClass(Class)方法传递给作业。然后,框架为InputSplit中的每个k/v对调用该任务的map。

    映射的数量通常由输入的总大小驱动,即输入文件的块总数。也可以使用Configuration.set(MRJobConfig.NUM_MAPS,int)来设置映射数量。

    随后将与给定输出键关联的所有中间值按框架分组,并传递给Reducer以确定最终输出。用户可以通过Job.setGroupingComparatorClass(Class)指定Comparator来控制分组。

    对Mapper输出进行排序,然后根据Reducer进行分区。分区总数与作业的reduce任务数相同。用户可以通过实现自定义分区程序来控制哪些键(以及记录)转到哪个Reducer。

    用户可以选择通过Job.setCombinerClass(Class)指定组合器来执行中间输出的本地聚合,比如合并重复的key,这有助于减少从Mapper传输到Reducer的数据量。

    2、Reducer

    Reducer有3个主要阶段:shuffle,sort和reduce

    1、shuffle

    Reducer的输入是映射器的排序输出。在此阶段,框架通过HTTP获取所有映射器的输出的相关分区

    2、sort

    框架在此阶段按键(因为不同的映射器可能输出相同的键)对Reducer输入进行分组。在获取map输出结果时,shuffle和sort阶段同时进行。

    如果要求对中间密钥进行分组的等价规则与在减少之前对密钥进行分组的等价规则不同,则可以通过Job.setSortComparatorClass(Class)指定比较器。由于Job.setGroupingComparatorClass(Class)可用于控制中间键的分组方式,因此可以结合使用这些键来模拟值的二级排序。

    3、reduce

    在此阶段,为分组输入中的每个

    2017-08-07 18:04:02 wenwenxiong 阅读数 1226

    下载或构建hadoop docker镜像

    下载hadoop docker镜像

    $ docker pull krejcmat/hadoop-master:latest
    $ docker pull krejcmat/hadoop-slave:latest

    构建hadoop docker镜像

    $ git clone https://github.com/krejcmat/hadoop-docker.git
    $ cd hadoop-docker
    $ ./build-image.sh hadoop-dnsmasq
    $ docker images
    
    REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
    krejcmat/hadoop-slave     latest              81cddf669d42        42 minutes ago      670.9 MB
    krejcmat/hadoop-master    latest              ed91c813b86f        42 minutes ago      670.9 MB
    krejcmat/hadoop-base      latest              cae006d1c427        50 minutes ago      670.9 MB
    krejcmat/hadoop-dnsmasq   latest              89f0052d964c        53 minutes ago      156.9 MB
    philcryer/min-wheezy      latest              214c501b67fa        14 months ago       50.74 MB

    其中,philcryer/min-wheezy, krejcmat/hadoop-dnsmasq, krejcmat/hadoop-base是临时产生的中间docker镜像,可以删除掉

    $ docker rmi c4c4000322cf e148f587cc4f d196b785d987

    运行hadoop容器集群

    在git项目的目录下

    $ ./start-container.sh latest 2
    
    start master container...
    start slave1 container...

    检查集群成员

    $ serf members
    
    master.krejcmat.com  172.17.0.2:7946  alive
    slave1.krejcmat.com  172.17.0.3:7946  alive
    $ cd ~
    $ ./configure-members.sh
    
    Warning: Permanently added 'slave1.krejcmat.com,172.17.0.3' (ECDSA) to the list of known hosts.slaves
    ..........
    $ ./start-hadoop.sh 
     #For stop Hadoop ./stop-hadoop.sh
    
    Starting namenodes on [master.krejcmat.com]
    ..........
    $ jps
    
    342 NameNode
    460 DataNode
    1156 Jps
    615 SecondaryNameNode
    769 ResourceManager
    862 NodeManager
    $ hdfs dfsadmin -report
    
    Name: 172.17.0.2:50010 (master.krejcmat.com)
    Hostname: master.krejcmat.com
    ..........

    通过web浏览器访问http://IP:8088 hadoop集群页面

    2017-09-03 13:52:25 u013595419 阅读数 2466

    什么是Hadoop?

    Hadoop是Apache的一款开源框架,使用java语言编写,可以通过编写简单的程序来实现大规模数据集合的分布式计算。工作在Hadoop框架上的应用可以工作在分布式存储和计算机集群计算的环境上面。Hadoop具有高扩展性,其集群能够从单台机器扩展到数千台机器。 
    Hadoop 采用的是Apache v2协议,Hadoop基于Google发布的MapReduce论文实现,并且应用了函数式编程的思想。

    Hadoop 架构

    Hadoop框架包括下述三个个模块

    HDFSMapReduceYARN

    HDFS

    Hadoop Distributed File System (HDFS) 是Hadoop集群中最根本的文件系统,它提供了高扩展,高容错,机架感知数据存储等特性,可以非常方便的部署在机器上面。HDFS除过分布式文件系统所通有的特点之外,还有些仅属自己的特点:

    • 对硬件故障的考虑设计
    • 更大的数据单元,默认的块大小为128M
    • 对序列操作的优化
    • 机架感知
    • 支持异构集群和跨平台

    Hadoop集群中的数据被划分成更小的单元(通常被称为),并且将其分布式存储在集群中,每个块有两个副本,这个两个副本被存储在集群的的一个机架上。这样数据包含自身便有三个副本,具有极高的可用性和容错性,如果一个副本丢失,HDFS将会自动的重新复制一份,以确保集群中一共包含三个数据副本(包含自身)。

    HDFS也可以有多种形式,这个取决于Hadoop版本及所需功能。

    HDFS是Leader/Follower架构实现的,每个集群都必须包含一个NameNode节点,和一个可选的SecondaryName节点,以及任意数量的DataNodes。

    除了管理文件系统命名空间和管理元数据之外,NameNode对clients而言,还扮演着master和brokers的角色(虽然clients是直接与DataNode进行通信的)。NameNode完全存在于内存中,但它仍然会将自身状态写入磁盘。

    HDFS 的替代文件系统

    HDFS是Hadoop中经典的文件系统,但是Hadoop并不仅仅支持HDFS,它还支持其他的文件系统,比如Local file system, FTP, AWS S3, Azure’s file system, 和OpenStack’s Swift,这些文件系统可以在使用时根据不同URI进行区分。比如:

    file: for the local file system 
    s3: for data stored on Amazon S3

    MapReduce

    MapReduce是为能够在集群上分布式处理海量数据而量身订做的框架,MapReduce job可以分为三次连续过程。

    • Map 将输入数据划分为key-value集合
    • Shuffle 将Map产生的结果传输给Reduce
    • Reduce 则对接收到的key-value进一步处理

    MapReduce的最大工作单元便是job,每个job又会被分割成map task或reduce task。最经典的MapReduce job便是统计文档中单词出现的频率,这个过程可以使用下图来描述

    mapreduce

    YARN

    YARN (Yet Another Resource Negotiator) 是为应用执行分配计算资源的一个框架。YARN主要包含下面三个核心组件

    • ResourceManager(一个集群只有一个)
    • ApplicationMaster(每个应用都有一个)
    • NodeManagers (每个节点都有一个)

    yarn

    Note:

    YARN 使用了一些容易让人误解的名词作为术语,因此应该特别注意。比如在Hadoop ecosystem中,Container这个概念,平常我们听到Container时,我们都认为是与Docker相关。但是这里却是指Resource Container (RC),即表示物理资源的集合。通常被抽象的表示,将资源分配给到目标和可分配单元。 
    Application也是一个熟词僻义的用法,在YARN中,一个Application指的是被一并执行的task的集合,YARN中的Application的概念大概类似于MapReduce中的job这个概念。

    ResourceManager

    ResourceManager在YARN中是一个rack-aware master节点,它主要负责管理所有可用资源的集合和运行一些至关重要的服务,其中最重要的便是Scheduler

    Scheduler组件是YARN Resourcemanager中向运行时应用分配资源的一个重要组件,它仅仅完成资源调度的功能,并不完成监控应用状态和进度的功能,因此即使应用执行失败,它也不会去重启失败的应用。

    但是在Hadoop 2.7.2开始,YARN开始支持少数调度策略CapacitySchedulerFairScheduler,FIFO Scheduler。默认情况下由Hadoop来负责决定使用哪种调度策略,无论使用那种调度策略,Scheduler都会通过Continer来向请求的ApplicationMaster分配资源。

    ApplicationMaster

    每个运行在Hadoop上面的应用都会有自己专用的ApplicationMaster实例。每个实例进会存在于集群中每个节点仅属于自己的单独Container。每个Application的ApplicationMaster都会周期性的向ResourceManager发送心跳消息,如果有需要的话,还会去向ResourceManger请求额外的资源,ResourceManager便会为额外的资源划分租期(表明该资源已被某NodeManager所持有)

    ApplicationMaster会监控每个application的整个生命周期,从向ResourceManager请求额外的资源到向NodeManager提交请求。

    NodeManagers

    NodeManager可以认为是监控每个节点的Container的代理,会监控每个Container的整个生命周期,包括Continer的资源使用情况,与ResourceManager的周期性通信。

    从概念上来说,NodeManager更像是Hadoop早期版本的TaskTrackers,当时Taskrackers主要被用来解决调度map和reduce slots问题,NodeManager有一个动态创建的,任意大小的Resouce Containers(RCs),并不像MR1中的那种slots,RCs可以被用在map tasks中,reduce tasks中,或者是其他框架的tasks

    为了更好的描述YARN,这里给出一个YARN application的执行过程。如下图所示:

    yarn

    1. client向ResourceManager提交一个MapReduce应用,和启动指定应用的ApplicationMaster所需要的信息。
    2. ResourceManager 会为ApplicationMaster分派一个Container,并且启动Application
    3. ApplicationMaster启动,接着向ResourceManager注册自己,允许调用client直接与ApplicationMaster交互
    4. ApplicatoinMaster为客户端应用分配资源
    5. ApplicationMaster为application启动Container
    6. 在执行期间,clients向Applicationaster提交application状态和进度
    7. apllication执行完成,ApplicationMaster向ResouceManager撤销掉自己的注册信息,然后关机,将自己所持有的Container归还给资源池。

    Reference

    Hadoop architectural overview

    2018-06-09 17:57:00 weixin_36250487 阅读数 3732

    格式:hadoop fs -命令

    主要有如下的命令:

     

     

     

    命令说明
    hadoop fs -mkdir 创建HDFS目录
    hadoop fs -ls 列出HDFS目录
    hadoop fs -copyFromLocal

    使用-copyFromLocal复制本地文件(local)到HDFS

    hadoop fs -put 使用-put复制本地(local)文件到HDFS
    hadoop fs -copyToLocal 将HDFS上的文件复制到本地(local)
    hadoop fs -get 将HDFS上的文件复制到本地(local)
    hadoop fs -cp 复制HDFS文件
    hadoop fs -rm 删除HDFS文件
    hadoop fs -cat 列出HDFS目录下的文件的内容
    【一、创建与查看HDFS目录】
    1、创建HDFS目录:

    2、查看之前创建的HDFS目录

    注意:因为登录的用户为hduser,所以会显示/user/hduser下的目录。

    3、查看HDFS完整目录

    因为hadoop fs -ls只能查看一级目录,所以必须逐级查看:

    4、查看所有的HDFS子目录

    HDFS提供了一个方便的选项 -R 可以递归查看目录

    5、一次性创建所有HDFS子目录

    逐级创建很麻烦,但是可以添加参数-p,来一次性创建多级目录:

     

    【二、从本地计算机复制文件到HDFS】

    1、复制本地文件到HDFS:

    2、列出文件内容:

    可以使用:hadoop fs -cat /user/hduser/test/test1.txt | more   进行分页显示

    3、如果复制到HDFS的文件已经存在,会报错,此时可以使用-f 参数,强制复制重复文件到HDFS目录:

    4、从本地复制多个文件到HDFS,中间用空格分割即可。

    5、从本地复制整个目录到HDFS:

    6、列出HDFS目录下的所有文件(包括这个目录下子目录的文件)

    7、使用put复制文件到HDFS,这个参数与copyFromLocal的不同之处在于:

     

    -put更宽松,可以把本地或者HDFS上的文件拷贝到HDFS中;而-copyFromLocal则更严格限制只能拷贝本地文件到HDFS中。如果本地和HDFS上都存在相同路径,则-put跟趋于优先取HDFS的源。(不用太深究两者区别,更多用-put)

     

     

    【三、从HDFS上复制文件到本地】

    1、参数 -copyToLocal

    2、同样的也可以用参数-get完成上述操作:

     

    【四、复制与删除HDFS文件】

    1、使用-cp参数,在HDFS上进行复制文件

    2、使用-rm参数,删除HDFS上的文件;添加-R参数,删除目录:

     

    在http://master:50070上可以浏览和操作HDFS的目录和文件
  • 相关阅读:
    redis的安装使用
    重大需求分析开发第一天
    学习进度条-第六周
    学习进度条-第五周
    软件工程个人课程总结
    学习进度条-第十六周
    团队冲刺第二阶段第十天
    团队冲刺第二阶段第十一天
    响当当队-Beta版总结会议
    学习进度条-第十五周
  • 原文地址:https://www.cnblogs.com/ninglinglong/p/11600352.html
Copyright © 2020-2023  润新知