Hadoop配置

予早 2026-04-30 23:53:27
Categories: Tags:

Hadoop官方参数表

core-default.xml

https://link.zhihu.com/?target=http%3A//hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-common/core-default.xml

hdfs-default.xml

https://link.zhihu.com/?target=http%3A//hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml

mapred-default.xml

https://link.zhihu.com/?target=http%3A//hadoop.apache.org/docs/current/hadoop-mapreduce-client/hadoop-mapreduce-client-core/mapred-default.xml

yarn-default.xml

https://link.zhihu.com/?target=http%3A//hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-common/yarn-default.xml

配置文件名 配置对象 主要内容
core-site.xml 集群全局参数 用于定义系统级别的参数,如HDFS URL、Hadoop的临时目录等
hdfs-site.xml HDFS参数 如名称节点和数据节点的存放位置、文件副本的个数、文件读取权限等
mapred-site.xml Mapreduce参数 包括JobHistory Server和应用程序参数两部分,如reduce任务的默认个数、任务所能够使用内存的黑认上下限等
yarn-site.xml 集群资源管理系统参数 配置ResourceManager,NodeManager的通信端口,web监控端口等

core-site.xml

hdfs-site.xml

mapred-site.xml

yarn-site.xml

Hadoop三机集群部署

image-20210218114022134

usr/hadoop-2.4.1/etc/hadoop/hadoop-env.sh

usr/hadoop-2.4.1/etc/hadoop/yarn-env.sh

/usr/hadoop-2.4.1/etc/hadoop/mapred-env.sh

usr/hadoop-2.4.1/etc/hadoop/slaves

usr/hadoop-2.4.1/etc/hadoop/core-site.xml

usr/hadoop-2.4.1/etc/hadoop/hdfs-site.xml

usr/hadoop-2.4.1/etc/hadoop/mapred-site.xml

usr/hadoop-2.4.1/etc/hadoop/yarn-site.xml

hadoop-env.sh,yarn-env.sh,mapred-env.sh配置Java环境

works配置数据结点:注意啊:前提是你已经为每个节点进行了hostname的命名。而且每个节点的hosts文件你修改了本地dns的指向,让这些主机指向约定好的IP。然后每个节点的hosts文件保持同步。

core-site.xml

<configuration>
    <!-- 指定hdfs的namenode主机的hostname,这个属性的作用就是定义hdfs文件系统的主机和端口号的。不管在是伪分布式下,还是在完全分布式下,我们都会在etc/hadoop/core-site.xml配置文件里重新定义它的值。主机名可以使用ip,也可以使用主机名称。端口号我们可以自定义,不过在hadoop1.x版本默认使用的是9000,而在hadoop2.x中默认使用的是8020。-->
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://yutong:9000</value>
    </property>
    <!--io操作流的配置,这个属性设置的是集群在进行读写操作时,缓冲区的大小。默认是,4096,即4K-->
    <property>
        <name>io.file.buffer.size</name>
        <value>131072</value>
    </property>
    <!--hadoop临时数据存储目录-->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/root/hadoop/temp</value>
    </property>
    <!--zookeeper-->
    <property>
        <name>ha.zookeeper.quorum</name>
        <value>Cluster-01:2181,Cluster-02:2181,Cluster-03:2181,Cluster-04:2181,Cluster-05:2181</value>
    </property>
</configuration>

hdfs-site.xml

<configuration>
    <property>

        <name>dfs.namenode.secondary.http-address</name>

        <value>cloud01:9001</value>

    </property>
    <!--namenode元数据存储目录-->
    <!--我们可以借助有道翻译,将每个属性的描述翻译一下,而这个属性,有道是这样翻译的:确定DFS名称节点应该在本地文件系统的何处存储名称表(fsimage)。如果这是一个以逗号分隔的目录列表,那么name表将复制到所有目录中,以实现冗余。这样的解释应该很清楚了吧,而且用到了core-default.xml/core-site.xml里的属性hadoop.tmp.dir。当然我们可以在etc/hadoop/hdfs-site.xml进行指定设置。-->
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>file://${hadoop.tmp.dir}/dfs/name</value>
    </property>
    <!--工作节点的数据块存储目录 -->
    <!--用于定义DFS数据节点应将其块存储在本地文件系统的何处。如果这是一个以逗号分隔的目录列表,那么数据将存储在所有命名的目录中,通常存储在不同的设备上。对于HDFS存储策略,应该用相应的存储类型([SSD]/[DISK]/[ARCHIVE]/[RAM_DISK])标记目录。如果目录没有显式标记存储类型,则默认存储类型为磁盘。如果本地文件系统权限允许,将创建不存在的目录。
可以在etc/hadoop/hdfs-site.xml进行指定设置。-->
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file://${hadoop.tmp.dir}/dfs/data</value>
    </property>
    <!--block的副本数-->
    <!--DFS上的数据库的副本数,缺省值是3。可以在创建文件时进行指定,如果没有指定,就使用缺省值。-->
    <property>
        <name>dfs.replication</name>
        <value>3</value>
    </property>
    <!--指定block块的的大小-->
    <!--文件系统中的块大小,以字节为单位,如134217728表示128 MB。你也可以使用以下后缀(不区分大小写):k,m,g,t,p,e以指定大小(例如128k, 512m, 1g等)。-->
    <property>
        <name>dfs.blocksize</name>
        <value>134217728</value>
    </property>
    <!--dfs namenode web ui使用的监听地址和基本端口。可以在etc/hadoop/hdfs-site.xml进行指定设置。-->
    <property>
        <name>dfs.namenode.http-address</name>
        <value>0.0.0.0:50070</value>
    </property>
    <!--在namenode和datanode中启用WebHDFS (REST API)。false表示不启用。-->
    <property>
        <name>dfs.webhdfs.enabled</name>
        <value>true</value>
    </property>
</configuration>

yarn-site.xml

<configuration>


    <!--这个属性用于指定在进行mapreduce作业时,yarn使用mapreduce_shuffle混洗技术。这个混洗技术是hadoop的一个核心技术,非常重要。可以在yarn-site.xml里进行设置。-->
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>

    <!--用于指定混洗技术对应的字节码文件。-->
    <property>
        <name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name>
        <value>org.apache.hadoop.mapred.ShuffleHandler</value>
    </property>

    <!--用于指定resourcemanager的主机名-->
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>node1</value>
    </property>

    <!--用于指定在RM中的应用程序管理器接口的地址-->
    <property>
        <name>yarn.resourcemanager.address</name>
        <value>${yarn.resourcemanager.hostname}:8032</value>
    </property>

    <!--用于指定调度程序接口的地址。-->
    <property>
        <name>yarn.resourcemanager.scheduler.address</name>
        <value>${yarn.resourcemanager.hostname}:8030</value>
    </property>
    <!--用于指定rm下的resource-tracker的地址-->
    <property>
        <name>yarn.resourcemanager.resource-tracker.address</name>
        <value>${yarn.resourcemanager.hostname}:8031</value>
    </property>
    <!--用于指定RM管理界面的地址。-->
    <property>
        <name>yarn.resourcemanager.admin.address</name>
        <value>${yarn.resourcemanager.hostname}:8033</value>
        <!--用于指定RM的web访问的地址-->
        <property>
            <description>The http address of the RM web application.</description>
            <name>yarn.resourcemanager.webapp.address</name>
            <value>${yarn.resourcemanager.hostname}:8088</value>
        </property>
    </property>
</configuration>

mapred-site.xml

<configuration>
    <!--指定运行mapreduce的环境是yarn -->
    <!--这个属性用于指定执行MapReduce作业的运行时框架。属性值可以是local,classic或yarn。我们可以在etc/hadoop/mapred-site.xml里来重新指定值。不过呢,在etc/hadoop/目录下没有mapred-site.xml文件,倒是有一个mapred-site.xml.template样板。我们可以复制一份,将名称改为mapred-site.xml。-->

    <property>
        <!---- 指定mr框架为yarn方式,Hadoop二代MP也基于资源管理系统Yarn来运行 -->
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
    <!--指定了查看运行完mapreduce程序的服务器的IPC协议的主机名和端口号。可以通过mapred-site.xml进行设置-->
    <property>
        <name>mapreduce.jobhistory.address</name>
        <value>0.0.0.0:10020</value>
    </property>


    <!--指定了使用webui查看mapreduce程序的主机名和端口号。可以通过mapred-site.xml进行设置。-->
    <property>
        <name>mapreduce.jobhistory.webapp.address</name>
        <value>0.0.0.0:19888</value>
        <description>MapReduce JobHistory Server Web UI host:port</description>
    </property>






    <property>
        <name>yarn.app.mapreduce.am.env</name>
        <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
    </property>
    <property>
        <name>mapreduce.map.env</name>
        <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
    </property>
    <property>
        <name>mapreduce.reduce.env</name>
        <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
    </property>
    <property>
        <name>mapreduce.application.classpath</name>
        <value>$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/*, $HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib/*</value>
    </property>
</configuration>

works

<!--datanode机器群-->

如果集群是第一次启动,需要格式化namenode
hdfs namenode -format
注意:Namenode和ResourceManger如果不是同一台机器,不能在NameNode上启动 yarn,应该在ResouceManager所在的机器上启动yarn。

再次总结,我们配置文件中出现的端口:

主namenode有个hdfs协议的访问地址:singlehost:9000 (是一个IPC协议,可见是给本机hadoop进程用的)

secondNamenode有个http协议的访问地址:singlehsot:9001 (这是个secondnamenode的http地址)

hdfs开启了web监视后,主namenode有个默认的http访问地址:singlehost:50070 (通过他来查看hdfs状况)

MapReduce内部的一个通讯地址:singlehost:10020 (估计是TCP协议)

MapReduce外部web访问的地址:singlehost:19888 (肯定是http协议,不过暂时无法访问)

singlehost:8030 (Yarn的内部IPC通讯地址)

singlehost:8031 (Yarn的内部IPC通讯地址)

singlehost:8032 (Yarn的内部IPC通讯地址)

singlehost:8033 (Yarn的内部IPC通讯地址)

singlehost:8088 (Yarn的外部HTTP通讯地址)

IP动态问题

xcall脚本

#!/bin/bash
# 获取控制台指令
cmd=$*
# 判断指令是否为空
if [ ! -n "$cmd" ]
then
        echo "command can not be null !"
        exit
fi
# 获取当前登录用户
user=`whoami`
# 在从机执行指令,这里需要根据你具体的集群情况配置,host与具体主机名一致,同上
for (( host=1;host<=3;host++ ))
do
        echo "================current host is node0$host================="
        echo "--> excute command \"$cmd\""
        ssh $user@node0$host $cmd
done
echo "excute successfully !"
#!/bin/bash
# 获取控制台指令
cmd=$*
# 判断指令是否为空
if [ ! -n "$cmd" ]
then
        echo "command can not be null !"
        exit
fi
# 获取当前登录用户
user=`whoami`
# 执行指令
for host in yutong1 yutong2 yutong3
do
  echo "================ $host ================"
  ssh $user@$host $cmd
done
echo "All excute successfully!"
#修改脚本权限
chmod +x xcall.sh