精华内容
下载资源
问答
  • 2.安装hdfs yarn

    2017-08-30 21:45:00
    下载hadoop压缩包设置hadoop环境变量设置hdfs环境变量设置yarn环境变量设置mapreduce环境变量修改hadoop配置设置core-site.xml设置hdfs-site.xml设置yarn-site.xml设置mapred-site.xml设置slave文件分发配置启动hdfs...

    下载hadoop压缩包

    去hadoop官网下载hadoop-2.8.0压缩包到hadoop1.然后放到/opt下并解压.

    $ gunzip hadoop-2.8.0.tar.gz
    $ tar -xvf hadoop-2.8.0.tar

    然后修改hadoop-2.8.0的目录权限,使hdfs和yarn均有权限读写该目录:

    # chown -R hdfs:hadoop /opt/hadoop-2.8.0

    设置hadoop环境变量

    编辑/etc/profile:

    export HADOOP_HOME=/opt/hadoop-2.8.0
    export HADOOP_PREFIX=/opt/hadoop-2.8.0
    export HADOOP_YARN_HOME=$HADOOP_HOME
    export HADOOP_CONF_DIR=${HADOOP_HOME}/etc/hadoop
    export LD_LIBRARY_PATH=$JAVA_HOME/jre/lib/amd64/server
    export PATH=${HADOOP_HOME}/bin:$PATH

    设置hdfs环境变量

    编辑/opt/hadoop-2.8.0/ect/hadoop/hadoop-env.sh

    #export JAVA_HOME=/usr/local/java/jdk1.8.0_121
    #export HADOOP_HOME=/opt/hadoop/hadoop-2.7.3
    #hadoop进程的最大heapsize包括namenode/datanode/ secondarynamenode等,默认1000M
    #export HADOOP_HEAPSIZE=    
    #namenode的初始heapsize,默认取上面的值,按需要分配
    #export HADOOP_NAMENODE_INIT_HEAPSIZE=""  
    #JVM启动参数,默认为空
    #export HADOOP_OPTS="$HADOOP_OPTS -Djava.net.preferIPv4Stack=true" 
    #还可以单独配置各个组件的内存:
    #export HADOOP_NAMENODE_OPTS=
    #export HADOOP_DATANODE_OPTS
    #export HADOOP_SECONDARYNAMENODE_OPTS
    #设置hadoop日志,默认是$HADOOP_HOME/log
    #export HADOOP_LOG_DIR=${HADOOP_LOG_DIR}/$USER 
    export HADOOP_LOG_DIR=/var/log/hadoop/

    根据自己系统的规划来设置各个参数.要注意namenode所用的blockmap和namespace空间都在heapsize中,所以生产环境要设较大的heapsize.
    注意所有组件使用的内存和,生产给linux系统留5-15%的内存(一般留10G).根据自己系统的规划来设置各个参数.要注意namenode所用的blockmap和namespace空间都在heapsize中,所以生产环境要设较大的heapsize.

    注意所有组件使用的内存和,生产给linux系统留5-15%的内存(一般留10G).

    设置yarn环境变量

    编辑/opt/hadoop-2.8.0/ect/hadoop/yarn-env.sh

    #export JAVA_HOME=/usr/local/java/jdk1.8.0_121
    #JAVA_HEAP_MAX=-Xmx1000m 
    #YARN_HEAPSIZE=1000   #yarn 守护进程heapsize
    #export YARN_RESOURCEMANAGER_HEAPSIZE=1000 #单独设置RESOURCEMANAGER的HEAPSIZE
    #export YARN_TIMELINESERVER_HEAPSIZE=1000  #单独设置TIMELINESERVER(jobhistoryServer)的HEAPSIZE
    #export YARN_RESOURCEMANAGER_OPTS=     #单独设置RESOURCEMANAGER的JVM选项
    #export YARN_NODEMANAGER_HEAPSIZE=1000 #单独设置NODEMANAGER的HEAPSIZE
    #export YARN_NODEMANAGER_OPTS=         #单独设置NODEMANAGER的JVM选项
    export YARN_LOG_DIR=/var/log/yarn #设置yarn的日志目录

    根据环境配置,这里不设置,生产环境注意JVM参数及日志文件位置

    设置mapreduce环境变量

    # export JAVA_HOME=/home/y/libexec/jdk1.6.0/
    #export HADOOP_JOB_HISTORYSERVER_HEAPSIZE=1000
    #export HADOOP_MAPRED_ROOT_LOGGER=INFO,RFA
    #export HADOOP_JOB_HISTORYSERVER_OPTS=
    #export HADOOP_MAPRED_LOG_DIR="" # Where log files are stored.  $HADOOP_MAPRED_HOME/logs by default.
    #export HADOOP_JHS_LOGGER=INFO,RFA # Hadoop JobSummary logger.
    #export HADOOP_MAPRED_PID_DIR= # The pid files are stored. /tmp by default.
    #export HADOOP_MAPRED_IDENT_STRING= #A string representing this instance of hadoop. $USER by default
    #export HADOOP_MAPRED_NICENESS= #The scheduling priority for daemons. Defaults to 0.
    export export HADOOP_MAPRED_LOG_DIR=/var/log/yarn

    根据环境配置,这里不设置,生产环境注意JVM参数及日志文件位置

    修改hadoop配置

    参下的设置在官网http://hadoop.apache.org/docs/r2.8.0/hadoop-project-dist/hadoop-common/ClusterSetup.html 都可以找到

    设置core-site.xml

    <configuration>
            <property>
                    <name>fs.defaultFS</name>
                    <value>hdfs://hadoop1:9000</value>
                    <description>HDFS 端口</description>
            </property>
            <property>
                    <name>io.file.buffer.size</name>
                    <value>131072</value>
            </property>
            <property>
                    <name>fs.trash.interval</name>
                    <value>1440</value>
                    <description>启动hdfs回收站,回收站保留时间1440分钟</description>
            </property>
            <property>
                    <name>hadoop.tmp.dir</name>
                    <value>/opt/hadoop-2.8.0/tmp</value>
                    <description>默认值/tmp/hadoop-${user.name},修改成持久化的目录</description>
            </property>
    </configuration>

    core-site.xml里有众多的参数,但只修改这两个就能启动,其它参数请参考官方文档.

    设置hdfs-site.xml

    这里只设置以下只个参数:

    <configuration>
            <property>
                    <name>dfs.replication</name>
                    <value>1</value>
                    <description>数据块的备份数量,生产建议为3</description>
            </property>
            <property>
                    <name>dfs.namenode.name.dir</name>
                    <value>/opt/hadoop-2.8.0/namenodedir</value>
                    <description>保存namenode元数据的目录,生产上放在raid中</description>
            </property>
            <property>
                    <name>dfs.blocksize</name>
                    <value>134217728</value> 
            <description>数据块大小,128M,根据业务场景设置,大文件多就设更大值.</description>
            </property>
            <property>
                    <name>dfs.namenode.handler.count</name>
                    <value>100</value>
            <description>namenode处理的rpc请求数,大集群设置更大的值</description>
            </property>
            <property>
                    <name>dfs.datanode.data.dir</name>
                    <value>/opt/hadoop-2.8.0/datadir</value>
                    <description>datanode保存数据目录,生产上设置成每个磁盘的路径,不建议用raid</description>
            </property>
    </configuration>

    设置yarn-site.xml

    这里只设置以下只个参数,其它参数请参考官网.

    <configuration>
            <property>
                    <name>yarn.resourcemanager.hostname</name>
                    <value>hadoop1</value>
                    <description>设置resourcemanager节点</description>
            </property>
            <property>
                    <name>yarn.nodemanager.aux-services</name>
                    <value>mapreduce_shuffle</value>
                    <description>设置nodemanager的aux服务</description>
            </property>
            <property>
                    <name>yarn.scheduler.minimum-allocation-mb</name>
                    <value>32</value>
                    <description>每个container的最小大小MB</description>
            </property>
            <property>
                    <name>yarn.scheduler.maximum-allocation-mb</name>
                    <value>128</value>
                    <description>每个container的最大大小MB</description>
            </property>
            <property>
                    <name>yarn.nodemanager.resource.memory-mb</name>
                    <value>1024</value>
                    <description>为nodemanager分配的最大内存MB</description>
            </property>
            <property>
                    <name>yarn.nodemanager.local-dirs</name>
                    <value>/home/yarn/nm-local-dir</value>
                    <description>nodemanager本地目录</description>
            </property>
            <property>
                    <name>yarn.nodemanager.resource.cpu-vcores</name>
                    <value>1</value>
                    <description>每个nodemanger机器上可用的CPU,默认为-1,即让yarn自动检测CPU个数,但是当前yarn无法检测,实际上该值是8</description>
            </property>
    </configuration>

    生产上请设置:
    ResourceManager的参数:

    ParameterValueNotes
    yarn.resourcemanager.addressResourceManager host:port for clients to submit jobs.host:port If set, overrides the hostname set in yarn.resourcemanager.hostname. resourcemanager的地址,格式 主机:端口
    yarn.resourcemanager.scheduler.addressResourceManager host:port for ApplicationMasters to talk to Scheduler to obtain resources.host:port If set, overrides the hostname set in yarn.resourcemanager.hostname. 调度器地址 ,覆盖yarn.resourcemanager.hostname
    yarn.resourcemanager.resource-tracker.addressResourceManager host:port for NodeManagers.host:port If set, overrides the hostname set in yarn.resourcemanager.hostname. datanode像rm报告的端口, 覆盖 yarn.resourcemanager.hostname
    yarn.resourcemanager.admin.address ResourceManager host:port for administrative commands.host:port If set, overrides the hostname set in yarn.resourcemanager.hostname. RM管理地址,覆盖 yarn.resourcemanager.hostname
    yarn.resourcemanager.webapp.addressResourceManager web-ui host:port.host:port If set, overrides the hostname set in yarn.resourcemanager.hostname. RM web地址,有默认值
    yarn.resourcemanager.hostnameResourceManager host.host Single hostname that can be set in place of setting allyarn.resourcemanager*address resources. Results in default ports for ResourceManager components. RM的主机,使用默认端口
    yarn.resourcemanager.scheduler.classResourceManager Scheduler class.CapacityScheduler (recommended), FairScheduler (also recommended), or FifoScheduler
    yarn.scheduler.minimum-allocation-mbMinimum limit of memory to allocate to each container request at the Resource Manager.In MBs 最小容器内存(每个container最小内存)
    yarn.scheduler.maximum-allocation-mbMaximum limit of memory to allocate to each container request at the Resource Manager.In MBs 最大容器内存(每个container最大内存)
    yarn.resourcemanager.nodes.include-path /yarn.resourcemanager.nodes.exclude-pathList of permitted/excluded NodeManagers.If necessary, use these files to control the list of allowable NodeManagers. 哪些datanode可以被RM管理

    NodeManager的参数:

    ParameterValueNotes
    yarn.nodemanager.resource.memory-mbResource i.e. available physical memory, in MB, for given NodeManagerDefines total available resources on the NodeManager to be made available to running containers Yarn在NodeManager最大内存
    yarn.nodemanager.vmem-pmem-ratioMaximum ratio by which virtual memory usage of tasks may exceed physical memoryThe virtual memory usage of each task may exceed its physical memory limit by this ratio. The total amount of virtual memory used by tasks on the NodeManager may exceed its physical memory usage by this ratio. 任务使用的虚拟内存超过被允许的推理内存的比率,超过则kill掉
    yarn.nodemanager.local-dirsComma-separated list of paths on the local filesystem where intermediate data is written.Multiple paths help spread disk i/o. mr运行时中间数据的存放目录,建议用多个磁盘分摊I/O,,默认是默认是HADOOPYARNHOME/log,默认是HADOOP_YARN_HOME/log
    yarn.nodemanager.log-dirsComma-separated list of paths on the local filesystem where logs are written.Multiple paths help spread disk i/o. mr任务日志的目录,建议用多个磁盘分摊I/O,,默认是默认是HADOOPYARNHOME/log,默认是HADOOP_YARN_HOME/log/userlog
    yarn.nodemanager.log.retain-seconds10800Default time (in seconds) to retain log files on the NodeManager Only applicable if log-aggregation is disabled.
    yarn.nodemanager.remote-app-log-dir/logsHDFS directory where the application logs are moved on application completion. Need to set appropriate permissions. Only applicable if log-aggregation is enabled.
    yarn.nodemanager.aux-servicesmapreduce_shuffleShuffle service that needs to be set for Map Reduce applications. shuffle服务类型

    设置mapred-site.xml

    <configuration>
            <property>
                    <name>mapreduce.framework.name</name>
                    <value>yarn</value>
                    <description>使用yarn来管理mr</description>
            </property>
            <property>
                    <name>mapreduce.jobhistory.address</name>
                    <value>hadoop2:10020</value>
                    <description>jobhistory主机的地址</description>
            </property>
            <property>
                    <name>mapreduce.jobhistory.webapp.address</name>
                    <value>hadoop2:19888</value>
                    <description>jobhistory web的主机地址</description>
            </property>
            <property>
                    <name>mapreduce.jobhistory.intermediate-done-dir</name>
                    <value>/opt/hadoop/hadoop-2.8.0/mrHtmp</value>
                    <description>正在的mr任务监控内容的存放目录</description>
            </property>
            <property>
                    <name>mapreduce.jobhistory.done-dir</name>
                    <value>/opt/hadoop/hadoop-2.8.0/mrhHdone</value>
                    <description>执行完毕的mr任务监控内容的存放目录</description>
            </property>
    </configuration>

    设置slave文件

    在/opt/hadoop-2.8.0/ect/hadoop/slave中写上从节点
    hadoop3
    hadoop4
    hadoop5

    分发配置

    将 /etc/profile /opt/* 复制到其它节点上

    $ scp hdfs@hadoop1:/etc/profile /etc
    $ scp -r hdfs@hadoop1:/opt/* /opt/

    建议先压缩再传….

    启动hdfs

    格式化namenode

    $HADOOP_HOME/bin/hdfs namenode -format

    启动hdfs

    以hdfs使用 $HADOOP_HOME/sbin/start-dfs.sh启动整个hdfs集群或者,使用

    $HADOOP_HOME/sbin/hadoop-daemon.sh --config $HADOOP_CONF_DIR --script hdfs start namenode #启动单个namenode 
    $HADOOP_HOME/sbin/hadoop-daemon.sh --config $HADOOP_CONF_DIR --script hdfs start datanode #启动单个datanode

    启动日志会写在$HADOOP_HOME/log下,可以在hadoop-env.sh里设置日志路径

    检查hdfs启动情况

    http://hadoop1:50070 或者执行 hdfs dfs -mkdir /test测试

    启动yarn

    在hadoop1上启resourcemanager:

    yarn $ $HADOOP_YARN_HOME/sbin/yarn-daemon.sh --config $HADOOP_CONF_DIR start resourcemanager

    在hadoop3 hadoop4 hadoop5上启动nodemanager:

    yarn $ $HADOOP_YARN_HOME/sbin/yarn-daemon.sh --config $HADOOP_CONF_DIR start nodemanager

    如果设置了slave文件并且以yarn配置了ssh互信,那可以在任意一个节点执行:start-yarn.sh即可启动整个集群
    然后打开RM页面:

    如果启动有问题,查看在yarn-evn.sh设置的YARN_LOG_DIR下的日志查找原因.注意yarn启动时用的目录的权限.

    测试mr任务

    [hdfs@hadoop1 hadoop-2.8.0]$ hdfs dfs -mkdir -p /user/hdfs/input
    [hdfs@hadoop1 hadoop-2.8.0]$ hdfs dfs -put etc/hadoop/ /user/hdfs/input
    [hdfs@hadoop1 hadoop-2.8.0]$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.8.0.jar grep input output 'dfs[a-z.]+'
    17/06/27 04:16:45 INFO mapreduce.JobSubmitter: Cleaning up the staging area /tmp/hadoop-yarn/staging/hdfs/.staging/job_1498507021248_0003
    java.io.IOException: org.apache.hadoop.yarn.exceptions.InvalidResourceRequestException: Invalid resource request, requested memory < 0, or requested memory > max configured, requestedMemory=1536, maxMemory=128
        at org.apache.hadoop.yarn.server.resourcemanager.scheduler.SchedulerUtils.validateResourceRequest(SchedulerUtils.java:279)

    然后就报错了.请求的最大内存是1536MB,最大内存是128M.1536是MR任务默认请求的最小资源.最大资源是128M?我的集群明明有3G的资源.这里信息应该是错误的,当一个container的最在内存不能满足单个个map任务用的最小内存时会报错,报的是container的内存大小而不是集群的总内存.当前的集群配置是,每个container最小使用32MB内存,最大使用128MB内存,而一个map默认最小使用1024MB的内存.
    现在,修改下每个map和reduce任务用的最小资源:
    修改mapred-site.xml,添加:

            <property>
                    <name>mapreduce.map.memory.mb</name>
                    <value>128</value>
                    <description>map任务最小使用的内存</description>
            </property>        
            <property>
                    <name>mapreduce.reduce.memory.mb</name>
                    <value>128</value>
                    <description>reduce任务最小使用的内存</description>
            </property>            
            <property>
                    <name>yarn.app.mapreduce.am.resource.mb</name>
                    <value>128</value>
                    <description>mapreduce任务默认使用的内存</description>
            </property>    

    再次执行:

    [hdfs@hadoop1 hadoop-2.8.0]$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.8.0.jar grep input output 'dfs[a-z.]+'
    17/06/27 05:04:26 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable
    ……..
    17/06/27 05:04:36 INFO mapreduce.JobSubmitter: Cleaning up the staging area /tmp/hadoop-yarn/staging/hdfs/.staging/job_1498510574463_0006
    org.apache.hadoop.mapreduce.lib.input.InvalidInputException: Input path does not exist: hdfs://hadoop1:9000/user/hdfs/grep-temp-2069706136
    ……..

    资源的问题解决了,也验证了我的想法.但是这次又报了一个错误,缺少目录.在2.6.3以及2.7.3中,我都测试过,没发现这个问题,暂且不管个.至于MR的可用性,以后会再用其它方式验证.怀疑jar包有问题.

    hadoop本地库

    不知道大家注意到没有,每次执行hdfs命令时,都会报:

    WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable

    这是由于不能使用本地库的原因.hadoop依赖于linux上一次本地库,比如zlib等来提高效率.
    关于本地库,请看我的另一篇文章:

    hdfs yarn和mapreduce参数

    关于参数,我会另起一篇介绍比较重要的参数

    下一篇,设置HDFS的HA





    转载于:https://www.cnblogs.com/skyrim/p/7455448.html

    展开全文
  • hdfsyarn(mapreduce)问题汇总

    千次阅读 2018-11-21 17:26:59
    hdfsyarn(mapreduce)问题汇总 搭建集群准备? 1.配置静态ip 2.配置hostname 3.配置主机名IP和映射关系 4.用root操作Hadoop 5.关闭防火墙 6.安装jdk 7.配置ssh免密 8.设置服务器时间同步 Hadoop是什么? Hadoop...

    hdfs与yarn(mapreduce)问题汇总

    搭建集群准备?

    1.配置静态ip 2.配置hostname 3.配置主机名IP和映射关系 4.用root操作Hadoop
    5.关闭防火墙 6.安装jdk 7.配置ssh免密 8.设置服务器时间同步

    Hadoop是什么?

    Hadoop利用服务器集群,根据用户的自定义服务逻辑,对海量数据进行分布式处理

    Hadoop四大模块三大核心三个服务

    模块:Common(Hadoop模块的通用工具类) HDFS(分布式文件系统) yarn(运算资源调度系统) MapReduce(分布式运算编程框架)
    三大核心:HDFS,yarn,MapReduce
    HDFS三个服务
    1.namenode metadata 元数据
    2.secondary namenode
    3.datanode

    什么是HDFS?

    HDFS设计目标
    1.自动快速检测应对硬件错误
    2.流式访问数据
    3.移动计算比移动数据本身更划算
    4.简单一致性模型
    5.异构平台可移植
    特点:
    1.高可靠性
    2.高扩展性
    3.高效性
    4.高容错性
    特性:
    1.HDFS中的文件在物理上是分块储存 128M
    2.HDFS文件系统会给客户端提供统一的抽样目录数,客户端通过路径来访问文件
    3.目录结构及文件分块信息(元数据)的管理由NameNode节点承担
    4.文件的各个block的储存管理由NameNode承担
    5.HDFS 一次写入,多次读出,不支持文件的修改
    为什么不适合做网盘应用:不便修改,延迟大,网络开销大,成本高

    HDFS的设计思想

    1)大文件拆成块,分在多台机器上存储(解决处理数据时的IO瓶颈)
    2)块均匀分布(解决负载均衡问题)

    HDFS的工作机制?

    1.HDFS集群分为两大角色:NameNode,DataNode
    2.NameNode负责管理整个文件系统的元数据
    3.DataNode负责管理用户的文件的数据块
    4.文件分块后分布式储存在若干个DataNode上
    5.每个文件可以有多个副本,并存放在不同的DataNode上
    6.DataNode会定期向NameNode发送心跳,汇报自身保存的文件信息,NameNode会负责保持文件的副本数量
    7.HDFS的内部工作机制对客户端保持透明,客户端请求访问HDFS都是向NameNode申请进行

    HDFS的优缺点:

    优点:
    高容错性:数据自动保存多个副本,副本丢失后,会自动恢复。
    (2)适合批处理:移动计算而非数据、数据位置暴露给计算框架。
    (3)适合大数据处理:GB、TB、甚至PB级数据、百万规模以上的文件数量,1000以上节点规模。
    (4)流式文件访问:一次性写入,多次读取;保证数据一致性。
    (5)可构建在廉价机器上:通过多副本提高可靠性,提供了容错和恢复机制。
    缺点:
    (1)不适合低延迟数据访问:比如毫秒级、低延迟与高吞吐率。
    (2)小文件存取:占用NameNode大量内存,寻道时间超过读取时间。
    (3)并发写入、文件随机修改:一个文件只能有一个写者,仅支持append

    HDFS中的读写流程?

    写流程:
    1.向NameNode请求上传文件,NameNode检查父目录和文件是否存在
    2.NameNode返回是否可以上传
    3.client接收到NameNode的可以上传的响应,之后请求第一个block该传输到哪些DataNode服务器上
    4.NameNode返回 n 个DataNode服务器
    5.client请求 n 台dn中的一台A上传数据(本质上是一个RPC调用,建立pipeline),A收到请求会继续调用B,然后B调用C,将真整个pipeline建立完成,逐级返回客户端
    6.client开始向A上传第一个block(先从磁盘读取数据放到一个本地内存缓存),以packet为单位,A收到一个packet就会传给下一个,一个一个传下去,A每传一个packet(64kb)会放入一个应答队列等待datanode 确认无误
    7.当一个block传输完成之后,client在此block请求NameNode上传第二个
    读流程:
    1.向NameNode通信查询元数据,找到文件所在的DataNode服务器
    2.挑选一台DataNode(就近,然后随机)服务器,请求socket流
    3.DataNode开始发送数据(从磁盘里面读取数据放入流,以packet为单位来做校验)
    4.客户端以packet为单位接受,先在本地缓存,然后写入目标文件

    HDFS的命令?

    HDFS中NameNode的工作机制?NameNode职责?

    NameNode职责:
    1.负责客户端请求响应
    2.元数据的管理,查询,修改
    3.管理DataNode的状态
    工作机制:

    1. namenode节点每隔一定时间请求secondaryNamenode合并操作
    2. secondaryNamenode请求namenode进行edits.log的滚动,这样新的编辑操作就能够进入新的文件中
    3. secondaryNamenode从namenode中下载fsImage和edits.log
    4. secondaryNamenode进行fsImage和edits.log的合并,成为fsImage.checkpoint文件
    5. namenode下载合并后的fsImage.checkpoin文件
    6. 将fsImage.checkpoint和edits.new命名为原来的文件名(这样之后fsImage和内存中的元数据只差edits.new)

    元数据的管理和储存机制?

    管理:采用三种储存形式:
    内存元数据
    磁盘元数据镜像文件
    数据操作日志文件(可通过日志运算出元数据)
    储存机制:
    A:内存中有一份完整的元数据(内存meta data)
    B:磁盘中有一个准完整的元数据镜像(fsimage)
    C:用于衔接内存metadata 和持久化元数据镜像fsimage之间的操作日志edits文件

    secondary NameNode的工作机制?职责

    职责:合并NameNode的edit logs到fsimage文件
    工作机制:
    1.当达到checkPoint条件的时候,NameNode请求checkpoint
    2.secondary NameNode响应请求
    3.namenode进行回滚日志文件
    4.secondary NameNode通过HTTP下载NameNode中的edits和fsimage到secondary NameNode
    5.将fsimage和edits读取到内存中进行合并为fsimage.checkpoint
    6.将数据dump到磁盘
    7.HTTP上传文件到NameNode
    8.NameNode对fsimage.checkpoint进行校验,成功之后进行改名

    DataNode运行机制,职责

    一个数据块在DataNode以文件存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳
    DataNode启动后向NameNode注册,通过后,周期性(1小时)的向NameNode上报所有的块信息。
    心跳是每3秒一次,心跳返回结果带有NameNode给该DataNode的命令如复制块数据到另一台机器,或删除某个数据块。如果超过10分钟没有收到某个DataNode 的心跳,则认为该节点不可用。
    集群运行中可以安全加入和退出一些机器

    1. 管理附加到他们运行节点的储存,并允许用户数据储存在文件中
    2. 在内部,文件 被分割成一个或多个Block,并且这些块被存储在一组DataNode中
    3. 负责提供来自文件系统客户端的读取和写入请求
    4. 执行块创建,删除
    5. 启动DN进程的时候回向NN汇报Block信息
    6. 通过向NameNode发送心跳保持与之联系(5秒一次),如果NameNode没有收到DataNode的心跳,则认为DataNode已经丢失,并复制其上的Block到其他其他DataNode上

    三大服务启动过程?

    NameNode 启动过程

    (1)加载镜像文件,还原了checkpoint时间节点前的元数据(包含目录结构,文件大小,块的大小,块的id等等信息),不包含块的存储位置
    (2)加载edits文件,还原了checkpoint时间节点到集群停止的元数据,不包含块的存储位置。(至此namenode还原的元数据唯一缺失的就是块的存储位置)
    (3)blockreport阶段,datanode启动,向namendoe汇报自己所管理的块及块的id,namenode根据块的ID还原块的存储位置
    (4)在blockreport结束后,集群会判断,datanode的启动数量(可设置,默认为0),丢失的块的占比(可设置,默认0.999f)
    是否满足退出安装模式的条件,如果满足,30秒后退出安全模式。在安全模式下namenode会删除多余的块
    (副本数为3,结果实际存储4个。ps:这种情况发生在datanode宕机,集群把宕机的datanode管理的块进行了复制,而宕机的datanode又重新启动了)
    还会复制低于副本数的块。
    DataNode 启动过程
    向NameNode注册、发送Block Report

    HDFS副本复制策略?

    副本1:同client节点 副本2:不同机架的节点 副本3:同第二个副本的机架中的不同节点

    secondary NameNode解决了什么问题?

    将SecondaryNameNode的fsimage和edits文件拷贝到NameNode中去可以解决NameNode的宕机

    元数据的checkpoint的流程?

    每隔一段时间,会由secondary namenode将namenode上积累的所有edits和一个最新的fsimage下载到本地,并加载到内存进行merge(这个过程称为checkpoint)
    触发时机:默认一小时进行checkpoint或者edits中的事务条数达到100万就会触发一次合并
    1.从SecondaryNameNode节点通知NameNode将要进行CheckPoint
    2.NameNode切换生成的日志文件edits,以后的日志都写到新的日志文件中。
    3.从SecondaryNameNode节点从节点下载fsimage文件及旧的日志文件,fsimage文件只有第一次下载,以后只需要传输edits日志文件
    4.SecondaryNameNode节点将fsimage文件加载到内存中,并将日志文件与fsimage的合并,然后生成新的fsimage.ckpt文件。
    5.从SecondaryNameNode节点将新的fsimage文件http传给NameNode节点
    6.NameNode节点可以将旧的fsimage文件及旧的日志文件切换为新的fsimage和edit日志文件并更新fstime文件,写入此次checkpoint的时间。

    什么情况下会进入安全模式,安全模式的解决办法

    块的数量低于阀值,datanode启动数量不够都会进入安全模式
    (1)调低阀值
    hdfs-site.xml中
    dfs.namenode.safemode.threshold-pct
    0.999f
    (2)强制离开
    hdfs dfsadmin -safemode leave
    (3)重新格式化集群
    (4)修复损坏的块文件

    HDFS的可靠性策略

    1)文件完整性
    在文件建立时,每个数据块都产生校验和,校验和会保存在.meta文件内;
    客户端获取数据时可以检查校验和是否相同,从而发现数据块是否损坏;
    如果正在读取的数据块损坏,则可以继续读取其它副本。NameNode标记该块已经损坏,然后复制block达到预期设置的文件备份数;
    DataNode 在其文件创建后三周验证其checksum。
    2)网络或者机器失效
    (1)副本冗余
    (2)机架感知策略(副本放置策略)
    (3)心跳机制策略
    3)namenode挂掉
    (1)主备切换(高可用)
    (2)镜像文件和操作日志磁盘存储
    (3)镜像文件和操作日志可以存储多份,多磁盘存储
    4)其他机制
    (1)快照(和虚拟机快照意义相同,保存了系统某一时刻的影像,可以还原到该时刻)
    (2)回收站机制
    (3)安全模式

    yarn?工作流程?

    组件:Client
    ResourceManager、Application Master
    NodeManager、Container
    1.启动ApplicationMaster 2.由ApplicationMaster创建一个应用程序,为他申请资源,并监控整个运行过程
    3.在整个工作流程当中,ResourceManager和NodeManager都是通过心跳保持联系的,NodeManager会通过心跳信息向ResourceManager汇报自己所在节点的资源使用情况。

    rm?appMaster?nodemaneger?

    1.ResourceManager(RM):主要接收客户端任务请求,接收和监控NodeManager(NM)的资源情况汇报,负责资源的分配与调度,启动和监控ApplicationMaster(AM)。
    2.NodeManager:主要是节点上的资源管理,启动Container运行task计算,上报资源、container情况给RM和任务处理情况给AM。
    单节点上的资源管理和任务管理,处理来自rm的命令,处理来自appMaster的命令
    3.ApplicationMaster:主要是单个Application(Job)的task管理和调度,向RM进行资源的申请,向NM发出launch Container指令,接收NM的task处理状态信息
    数据切分,为应用程序申请资源,并进一步分配给内部任务,任务监控与容错
    resourceManager的工作职责
    资源调度
    资源监视
    application提交

    ApplicationMaster与ResourceManager的交互

    1.用户向YARN ResourceManager提交应用程序,RM收到提交申请后,先向资源调度器申请用以启动AM 的资源,待申请到资源后,再由ApplicationMasterLauncher与对应的NodeManager通信,从而启动应用程序的ApplicationMaster。
    2.ApplicationMaster启动完成后,ApplicationMasterLaucher会通过事件的形式,将刚刚启动的Application Master注册到AMLiveMonitor,以启动心跳监控。
    3.ApplicationMaster启动后,先向ApplicatinMaterService注册,并将自己所在host、端口号等信息汇报给它。
    4.AM运行过程中,周期性地向ApplicationMaserService回报心跳信息(信息中包含想要申请的资源描述)。
    5.ApplicationMasterService每次收到ApplicationMaster心跳信息好后,将通知AMLivelinessMonitor更新应用程序的最新回报心跳的时间。
    6.应用程序运行完成后,AM向AMService发送请求,注销自己。
    7.AMService收到注销请求后,标注应用程序运行状态完成,同时通知AMLivelinessMonitor移除对它的心跳监控。

    Hadoop high available概念?

    Hadoop HA机制?

    通过双NameNode消除单点故障
    双NameNode协调工作的要点:
    1.元数据管理方式的改变:
    内存中各自保存一份元数据
    Edits日志只能有一份,只有active状态的NameNode节点可以做写操作
    两个NameNode都可以读取edits
    共享的edits放在一个共享储存中管理(qjournal和NFS两个主流实现)
    2.需要一个状态管理模块:
    实现了一个zkfc,常驻在每个NameNode所在的节点
    每个zkfc负责监控自己所在节点,利用zk进行状态标识,当需要状态切换时,由zkfc来负责切换
    切换时需要防止brain split现象的发生

    Hadoop HA的NameNode之间是如何分工合作的?

    Hadoop HA中的NameNode如何处理元数据?如何切换状态active,standby?

    hadoop HA 的启动顺序?

    1、启动zookeeper集群(自己实现一个批量启动zk的脚本)
    2、启动qjounalnode(在3台机器上都要启动)
    /usr/local/hadoop-2.7.1/sbin/hadoop-daemon.sh start journalnode
    3、格式化hdfs hdfs namenode -format
    4、单机启动namenode hadoop-daemon.sh start namenode
    5、数据同步
    1、scp -r /usr/local/hadoopdata/dfs /
    2、hdfs namenode -bootstrapStandby hadoop01
    6、格式化zkfc hdfs zkfc -formatZK
    7、启动hdfs集群 start-dfs.sh
    8、启动yarn集群 start-yarn.sh

    Hadoop HA 的命令和状态切换?

    Uber?

    动态增删节点,时间同步?

    安全模式与数据恢复

    hdfs dfsadmin -safemode enter/leave
    hdfs fsck -

    Zookeeper ?

    一个分布式协调服务,就是用户的分布式应用程序提供协调服务,为其他的分布式程序提供服务,本身就会分布式程序(半数存活就能提供服务)
    主要提供了两个功能:
    1.管理,储存,读取用户程序提交的数据
    2.为用户提供数据节点监听服务

    特性

    1. 一个leader,多个follower
    2. 全局数据一致性,每个server都保存一份相同的数据,client不论连接哪一台服务器,都可以得到相同的数据
    3. 分布式读写,更新请求转发,由leader实时数据更新的写操作
    4. 更新请求按顺序执行,来自同一个client的更新请求会按照其发送的顺序来执行
    5. 数据更新的原子性:一次数据要么成功,要么失败
    6. 实时性:在一定时间范围内,client能读到最新的数据

    zookeeper的节点类型

    PRESISTENT PRESISTENT_SEQUENTIAL 永久/永久且序列化
    EPHEMARAL EPHEMERAL_SEQUENTIAL 临时/临时且序列化
    监听器的是时间就是一次数据改变的时间,一个监听器只能监听一次数据的改变
    zkServer.sh start
    zkCli.sh -ls /
    zkCli.sh -get / 获取znode的数据
    zkCli.sh -ls / watch对一个节点的子节点变化时间注册了监听
    zkCli.sh -get / watch 对一个节点的数据内容变化时间注册了监听

    Zookeeper 初始化,选举

    初始化:
    选举机制:
    逻辑时钟,ID大小,数据版本

    zookeeper的应用场景

    统一的命名空间
    共享配置
    分布式锁
    解决单点故障

    zookeeper分布式锁的实现原理

    在zk上创建永久节点server,所有要访问资源的客户端在永久节点server下注册临时有序节点,并且监听自己前一个节点。
    序列号最小的获得锁可以访问资源,访问结束,断开连接,注册的临时节点被删除,他的下一个节点通过监听能够知道,
    此时节点序列号变为最小,获取到了锁,可以访问资源。

    MapReduce提交job的流程

    1.client提交任务到rm
    2.rm将job放入等待队列,响应client,返回jobid,path
    3.client将待处理的资源上传到HDFS上,并进行分片
    4.rm给nodemanager分配内存等资源,之后nodemanager去HDFS将jar包取出
    5.客户端发送命令让nodemanager启动AppMaster,想rm发送申请maptask,和启动几台nodemanager,需要的内存的请求
    6.在rm的job中有描述文件记录了需要参与的节点信息,nodemanager向rm发送心跳,查询分配到的任务,拿出rm分配的任务列表
    7.分配到待处理列表的nodemanager去HDFS将jar包取出
    8.之后appTask向nodemanager发送指令,让其启动任务开始mapTask任务,APPMaster解析分片信息
    9.APPTask监控状态信息,处理完一个片就反馈信息给reduceMaster
    10.reduceMaster接受到appMaster发送的信息,收集信息后开始计算

    PPT上的讲解:

    下面简单介绍一下提交一个job的处理过程,
    1、client submit一个job到RM,进入RM中的Scheduler队列供调度
    2、RM根据NM汇报的资源情况(NM会定时汇报资源和container使用情况),请求一个合适的NM launch container,以启动运行AM
    3、AM启动后,注册到RM上,以使client可以查到AM的信息,便于client直接和AM通信
    4、AM启动后,根据Job 相关的split的task情况,会和RM协商申请container资源
    5、RM分配给AM container资源后,根据container的信息,向对应的NM 请求launch container
    6、NM启动container运行task,运行过程中向AM汇报进度状态信息,类似于MRv1中 task的汇报;同时NM也会定时的向RM汇报container的使用情况。
    7、在application(job)执行过程中,client可以和AM通信,获取application相关的进度和状态信息。
    8、在application(job)完成后,AM通知RM clear自己的相关信息,并关闭,释放自己占用的container。

    MR的shuffle流程

    1.maptask执行,收集maptask的输出数据,将数据写入环形缓冲区中,记录起始偏移量
    2.环形缓冲区默认大小为100M,当数据达到80M时,记录终止偏移量。
    3.将数据进行分区(默认分组根据key的hash值%reduce数量进行分区),分区内进行快速排序
    4.分区,排序结束后,将数据刷写到磁盘(这个过程中,maptask输出的数据写入剩余20%环形缓冲区,同样需要记录起始偏移量)
    5.maptask结束后将形成的多个小文件做归并排序合并成一个大文件
    6.当有一个maptask执行完成后,reducetask启动
    7.reducetask到运行完成maptask的机器上拉取属于自己分区的数据
    8.reducetask将拉取过来的数据“分组”,每组数据调用一次reduce()方法
    9.执行reduce逻辑,将结果输出到文件

    列举MR中可干预的组件(详细说明各组件的原理,ps:combine)

    combine:相当于在map端(每个maptask生成的文件)做了一次reduce
    partition:分区,默认根据key的hash值%reduce的数量,自定义分区是继承Partitioner类,重写getPartition()分区方法。自定义分区可以有效的解决数据倾斜的问题
    group:分组,继承WritableComparator类,重写compare()方法,自定义分组(就是定义reduce输入的数据分组规则)
    sort:排序,继承WritableComparator类,重写compare()方法,根据自定义的排序方法,将reduce的输出结果进行排序
    分片:可调整客户端的blocksize,minSize,maxSize

    分片与分块的区别?

    分片是逻辑概念,分片有冗余
    分块是物理概念,是将数据拆分,无冗余

    AppMaster是属于yarn的进程还是属于MR的进程,AppMaster的生命周期,AppMaster的工作内容

    AppMaster属于resourcemanager的进程,由resourcemanager分配container然后进行启动的。
    job提交完成,resourcemanager分配container然后进行启动AppMaster,reducetask执行完成AppMaster将状态报告给resourcemanager后退出
    AppMaster:计算任务所需资源,向resourcemanager申请资源,启动maptask,reducetask,监控maptask和reducetask的运行状态

    展开全文
  • HDFSYARN、Zookeeper安装 选择自定义安装 选择安装服务 分配节点 集群设置全部选默认即可 自动启动进程 修改HDFS的权限检查配置 关闭HDFS中的权限检查:dfs.permissions。 配置Hadoop支持LZO ...

    HDFS、YARN、Zookeeper安装

    选择自定义安装

    选择安装服务

    分配节点

    集群设置全部选默认即可

    自动启动进程

    修改HDFS的权限检查配置

    关闭HDFS中的权限检查:dfs.permissions。

    配置Hadoop支持LZO

    1)点击主机,在下拉菜单中点击Parcel

    2)点击配置

    3)找到远程Parcel存储库URL,点击最后一栏的加号,增加一栏,输入http://archive.cloudera.com/gplextras/parcels/latest/,之后点击保存更改

    4)返回Parcel列表,可以看到多出了LZO,选择下载,下载完成后选择分配,分配完成后选择激活

    5)安装完LZO后,打开HDFS配置,找到“压缩编码解码器”一栏,点击加号,添加com.hadoop.compression.lzo.LzopCodec后保存更改

    6)打开YARN配置,找到MR 应用程序 Classpath,添加/opt/cloudera/parcels/HADOOP_LZO/lib/hadoop/lib/hadoop-lzo-cdh4-0.4.15-gplextras.jar

    7)更新过期配置,重启进程

     

     

    展开全文
  • 也就是说,:如果想要在yarn端(yarn的节点)访问spark的runtime jars,需要指定spark.yarn.archive 或者 spark.yarn.jars。如果都这两个参数都没有指定,spark就会把$SPARK_HOME/jars/所有的jar上传到分布式缓存中...

    1.在使用Spark on YARN模式时,发现作业提交缓慢
    通过官网描述:

    也就是说,:如果想要在yarn端(yarn的节点)访问spark的runtime jars,需要指定spark.yarn.archive 或者 spark.yarn.jars。如果都这两个参数都没有指定,spark就会把$SPARK_HOME/jars/所有的jar上传到分布式缓存中。这也是之前任务提交特别慢的原因。

    ./spark-submit \
    --class org.apache.spark.examples.SparkPi \
    --master yarn \
     /home/hadoop/app/spark-2.4.4-bin-2.6.0-cdh5.15.1/examples/jars/spark-examples_2.11-2.3.1.jar \
    3

    查看日志发现:

    [hadoop@hadoop002 bin]$ hdfs dfs -ls hdfs://hadoop002:8020/user/hadoop/.sparkStaging/application_1571310619518_0005
    Found 3 items
    -rw-r--r--   1 hadoop supergroup     223291 2019-10-18 18:15 hdfs://hadoop002:8020/user/hadoop/.sparkStaging/application_1571310619518_0005/__spark_conf__.zip
    -rw-r--r--   1 hadoop supergroup  298711073 2019-10-18 18:15 hdfs://hadoop002:8020/user/hadoop/.sparkStaging/application_1571310619518_0005/__spark_libs__3781910865127001297.zip
    -rw-r--r--   1 hadoop supergroup     872303 2019-10-18 18:15 hdfs://hadoop002:8020/user/hadoop/.sparkStaging/application_1571310619518_0005/mysql-connector-java-5.1.27-bin.jar
    

    所以按照官网的描述,将相应的jar包放在HDFS上

    [hadoop@hadoop002 conf]$ hdfs dfs -mkdir -p /system/spark_lib
    [hadoop@hadoop002 conf]$ hdfs dfs -put /home/hadoop/app/spark-2.4.4-bin-2.6.0-cdh5.15.1/jars/* /system/spark_lib
    [hadoop@hadoop002 conf]$ ls
    docker.properties.template  hive-site.xml              metrics.properties.template  spark-defaults.conf.template
    fairscheduler.xml.template  log4j.properties.template  slaves.template              spark-env.sh.template
    [hadoop@hadoop002 conf]$ cp spark-defaults.conf.template spark-defaults.conf
    [hadoop@hadoop002 conf]$ vim spark-defaults.conf
    [hadoop@hadoop002 conf]$ vi /home/hadoop/app/spark-2.4.4-bin-2.6.0-cdh5.15.1/conf/spark-defaults.conf
    spark.yarn.jars    hdfs://hadoop002:8020/system/spark_lib/*
    PS:如果没有*会报错:Error: Could not find or load main class org.apache.spark.deploy.yarn.ExecutorLauncher

    再次运行,发现已经不存在"falling back to uploading libraries under SPARK_HOM"的提示



     

    展开全文
  • 1.配置JAVA_HOME,因为hadoop运行依赖java环境 2.下载hadoop包2.6.5版本,下载地址:http://archive.apache.org/dist/hadoop/core/hadoop-2.6.5/hadoop-2.6.5.tar.gz 3.解压安装包后,修改安装包路径/etc/hadoop...
  • hdfsyarn的ha和failover

    2020-06-10 23:32:23
    配置HDFS-HA集群 官方地址:http://hadoop.apache.org/ 在opt目录下创建一个ha文件夹 mkdir ha 将/opt/app/下的 hadoop-2.7.2拷贝到/opt/ha目录下 cp -r hadoop-2.7.2/ /opt/ha/ 配置hadoop-env.sh export JAVA_...
  • ZOOKEEPER、HDFSYARN、HBASE配置Kerberos认证

    千次阅读 热门讨论 2019-02-28 16:56:24
    这个配置在HDFSYARN及HBASE的xml配置文件中是可以自动解析成对应节点的主机名,而在jaas.conf这里无法解析对应节点的主机名,通过监控KDC的krb5kdc.log文件,发现这里将 _HOST  解析成了host,所以导致zookeeper...
  • 【快速入门大数据】hadoop和它的hdfsyarn、mapreduce

    千次阅读 多人点赞 2021-01-15 13:01:43
    文章目录导学大数据概述初识Hadoop概述核心组件HDFS分布式文件系统资源调度系统YARNMapReduce优势发展史生态系统发行版本选择企业应用案例 导学 开发环境 学做镜像 生态圈 目录 实战 分析客户端登录日志 与...
  • 导语HDFSYARN是大数据生态的基础组件,不过,因为其处于数据分析架构体系的底层,通常我们很少能感受到它们的存在。但是我们必须要了解它们,因为在某些场景下,我们依然会...
  • 一 非 HDFS HA 集群转换成 HA 集群二 HDFS 的 HA 自动切换命令1 获得当前 NameNode 的 active 和 standby 状态2 NameNode 的 active 和 standby 状态切换3 HDFS HA自动切换比手工切换多出来的步骤三 ...
  • Docker搭建Hadoop集群环境准备依赖安装Docker单例模式安装JDK安装Hadoop修改配置文件环境变量免密登录启动 环境准备 依赖 CentOS7.6 安装Docker 参照安装(点击) 单例模式 安装JDK 去官网上下载1.8版本的tar.gz ,...
  • 本次hadoop源码包版本信息:hadoop-2.8.1-src....Hadoop广义: 以Hadoop为主的生态圈狭义: Apache Hadoop2.X 3.X组件  HDFS  分布式存储 MapReduce 分布式计算 job1 Yarn  资源和作业调度和管理平台 Spark Ap...
  • 1、初始化HDFS :hadoop namenode -format  看到如下字样,说明初始化成功。  启动HDFS,start-dfs.sh  终于启动成功了,原来是core-site.xml 中配置fs.defaultFS值中所设置的hosts映射与IP对应不上,造成...
  • 一段指令后,会看到不停地上传本地jar到HDFS上,内容如下,这个过程会非常耗时。可以通过在spark-defaults.conf配置里添加spark.yarn.archive或spark.yarn.jars来缩小spark应用的启动时间。 Wi
  • HDFS2的架构:负责数据的分布式存储 主从结构  主节点,可以有2个: namenode  从节点,有很多个: datanode  namenode负责:  接收用户操作请求,是用户操作的入口  维护文件系统的目录结构,称作命名空间  ...
  • --指定hadoop临时目录, hadoop.tmp.dir 是hadoop文件系统依赖的基础配置,很多路径都依赖它。如果hdfs-site.xml中不配 置namenode和datanode的存放位置,默认就放在这>个路径中 --> <property> <name>hadoop.tmp....
  • hadoop2.6安装HUE,配置hdfs,yarn,hive

    千次阅读 2018-04-17 14:54:05
    简单来讲,就是用图形化的界面来操作HDFS上的数据,运行MapReduce Job,执行Hive的SQL语句,浏览Hbase数据库,oozie,flume等等。网络上单一的教程不足以帮助人安装成功,故写下此篇文章,记录下安装过程。本篇博客...
  • 启动Spark任务时,在没有配置spark.yarn.archive或者spark.yarn.jars时, 会看到不停地上传jar,非常耗时;使用spark.yarn.archive可以大大地减少任务的启动时间,整个处理过程如下。 二、spark.yarn.archive使用 ...
  • 一、基于maven构建大数据开发项目: 新建maven工程。 注意点:Java代码放在Java下,...2、添加Hadoop依赖。参照如下博客: https://blog.csdn.net/qq_31975963/article/details/83898346 3、开始解析日志: ...
  • 如果没有配置spark.yarn.archive或者spark.yarn.jars时, 输出的日志在输出Neither spark.yarn.jars nor spark.yarn.archive is set后,会将SPARK_HOME/jars下的所有jar打包并上传到HDFS上,内容如下,这个过程会...
  • 2,impala 需要安装额外的依赖包  安装本地yum源,删除其他源repo:  vi /etc/yum.repos.d/abc-impala.repo [abc-impala] name=abc-impala keepcache=1 baseurl=file:///var/cache/yum/impala/ enabled=1 ...
  • # HDFS+MapReduce+Yarn详解

    2020-05-14 21:06:10
    HDFS详解 1.HDFS 介绍 HDFS 是 Hadoop Distribute File System 的简称,意为:Hadoop 分布式文件系统。是 Hadoop 核心组件之一,作为最底层的分布式存储服务而存在。分布式文件系统解决的问题就是大数据存储,他们是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 20,336
精华内容 8,134
关键字:

hdfsyarn依赖