暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Hadoop集群配置细节说明

Coding On Road 2018-06-04
470


以下是一些注意的细节:


1. 想要执行一些有价值的工作,必须要在多个节点上运行。

2. 集群的规模的大小并没有一个确定的答案。10个节点的集群算是一个小的集群。以后可以随存储与计算需求进行扩充。

3. namenode在内存中保存整个命名空间中所有文件的元信息信息,所以需要内存很大。secondaryNameNode在大多数时间里面空闲,但是它在创建检查点时间的内存与namenode差不多。所以,应该将namenodesecondaryNameNodenamenode部署在不同的节点上。

4. 一般来说,各机架装配30~40台服务器,共享一个10G的交换机。

5. JavaHadoop版本的支持见:https://wiki.apache.org/hadoop/HadoopJavaVersions

Version 2.7 and later of Apache Hadoop requires Java 7. It is built and tested on both OpenJDK and Oracle (HotSpot)'s JDK/JREEarlier versions (2.6 and earlier) support Java 6.

6. hadoop安装的标准目录为:/usr/local或是/opt。鉴于hadoop用户的home目录,可能挂载在NFS上,hadoop系统最好不要安装到用户目录下,即不要安装到/home/$user.name目录下。

7. mapred不使用ssh,如同hadoop2和以后版本中的一样,唯一的mapreduce守护进程就是作业历史服务器,即historyserver。使用mr-jobhistory-daemon.sh start histroyserver来启动这个服务。

8. 尽管期望无密码登录,但无口令的密钥不是一个好的选择(运行在本地伪分布式时,不防使用一个空的口令)。因此当使用ssh-keygen生成密钥对时,不防设置一个口令。然后使用ssh-agent以免每个连接逐一输入密码。关于ssh-agent的使用,见后面的附录。

9. 文件slaves列举了可以运行的datanode和节点管理器(nodemanager)的机器。

10. 配置文件目录默认在HADOOP_HOME/etc/hadoop目录下。配置目录,可以被重新安置到其他地方,只要启动守护进行时使用--config选项即可,或是使用HADOOP_CONF_DIR环境变量指定配置文件的目录。

11. hadoop的配置文件:hadoop-env.sh,mapred-env.sh,yarn-site.sh,core-site.xml,hdfs-site.xml,

mapred-site.xml,yarn-site.xml,slaves,hadoop-metrics2.properties,log4j.properties,hadoop-policy.xml

12. 内存堆大小:在默认情况下,hadoop为各个守护进程分配1000MB内存。该内存值由hadoop-env.sh文件的HADOOP_HEAPSIZE参数控制。也可以在单个守护进程的配置文件为每一个守护进程修改堆大小。例如,在yarn-env.sh中设置YARN_RESOURCEMANAGER_HEAPSIZE即可覆盖资源管理器的堆大小。

13. 由于namenode会在内存中维护所有文件的每个数据块的引用,因此namenode很可能会“吃光”分配给它的所有内存。一个含有200节点,每个节点24T磁盘空间为例,假设数据块大小为128M,复本数量为3,则约有200百万个数据块。200*24000000MB/(128M*3)。这样的话,将namenode设置成12000MB内存比较合适,即12G。同时,由于辅助namenodenamenode的内在需求相当,所以,一旦修改了namenode的内存,应该同时修改辅助namenode的内存。可以通过HADOO_NAMENODE_OPTSHADOOP_SECONDARYNAMENODE_OPTS直接向JVM传递选项。

14. 属性fs.defaultFS描述HDFS文件系统的URI,其主机是namenode的主机名或ip地址,端口号为namenode监听RPC的端口号,如果没有指定,那么默认端口为8020。与此相关的其他属性如:

dfs.namenode.name.dirdfs.datanode.data.dirdfs.namenode.checkpoint.dir。这些属性都可以配置两个目录,以支持冗余备份。

15. 为了运行yarn,需要指定一台机器做为资源管理器。即yarn.resourcemanager.hostname。如果没有指定,则默认为start-yarn.sh启动脚本时的本机。

16. 在运行MapReduce作业过程中,所产生的中间数据和工作文件被写到临时本地文件目录。由于这些数据包含map任务输出的数据,所以数据量可能非常大。因此,必须保证yarn容器本地临时空间容量足够大。通过yarn.nodemanager.local-dir属性配置使用逗号分开的多个目录,以便于更好的将数据分散到不同的磁盘上去。但yarn.nodemanager.local-dir绝对不能与dfs.datanode.data.dir配置为同一个目录。

17. 缓冲区大小:hadoop使用4096 bytes做为读写文件的缓冲区。建议设置为更大,如128K是一个比较合理的设置。即131072字节。这个属性可以在core-site.xml文件中通过配置io.file.buffer.size修改。

18. Hdfs块大小:hdfs默认的块大小为128M,可以将这个修改成256M,以降低namenode的内存压力。可以通过hdfs-site.xml中修改dfs.blocksize实现。

19. 慢启动Reduce:默认情况下,调度器会一直等待,真到该作业的5%map任务已经结束才会调度recduce任务。对于大型作业来说,这可能会降低集群的利用率,因为在等待map任务执行的过程中,占用了reduce的容器。可以将mapreduce.job.reduce.slowstart.completedmaps的值设置的更大,如设置为0.8,能够提升吞率。在mapred-site.xml中配置:

mapreduce.job.reduce.slowstart.completedmaps=0.8

 

1、start-dfs.sh脚本的工作如下

1、在每台机器上启动一个NameNode,这些机器由执行hdfs getconf -namenodes得到返回值确定是否继续运行。

2、slaves文件列举的每台机器上启动一个datanode

3、在每台机器上启动一个辅助namenode(secondarynamenode),这些机器由执行hdfs getconf -secondarynamenodes得到返回值以确定是否继续运行。

 

2start-yarn.sh脚本的工作如下

1、在默认的情况下,资源管理器ResourceManager总是和start-yarn.sh脚本运行在同一机器上。

2、在本机启动一个资源管理器即ResourceManager

3、在slaves文件列举的每台机器上启动一个节点管理器,即NodeManager

 

3hadoop守进程的关键配置属性

core-site.xml

<configuration>

        <property>

                <name>fs.defaultFS</name>

                <value>hdfs://hadoop41:8020</value>

        </property>

</configuration>

 

hdfs-site.xml

注意以下都是配置了两个目录,如果在正式的集群下,请使用dfs.replication=3

<configuration>

        <property>

                <name>dfs.replication</name>

                <value>1</value>

        </property>

        <property>

                <name>dfs.namenode.name.dir</name>

                <value>/app/datas1/hdfs/name,/app/datas2/hdfs/name</value>

        </property>

        <property>

                <name>dfs.datanode.data.dir</name>

                <value>/app/datas1/hdfs/data,/app/datas2/hdfs/data</value>

        </property>

        <property>

                <name>dfs.namenode.checkpoint.dir</name>

                <value>/app/datas1/hdfs/namesecondary,/app/datas2/hdfs/namesecondary</value>

        </proerty>

</configuration>

 

yarn-site.xml

yarn.nodemanager.local-dirs用于指定保存本地化文件,如Mapper临时输出的文件。

<configuration>

        <property>

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

                <value>hadoop41</value>

        </property>

        <property>

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

                <value>mapreduce_shuffle</value>

        </property>

        <property>

                <name>yarn.nodemanager.local-dirs</name>

                <value>/app/datas1/nm-local-dir,/app/datas2/nm-local-dir</value>

        </property>

</configuration>

 

mapred-site.xml

<configuration>

        <property>

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

                <value>yarn</value>

        </property>

</configuration>

 

4、timelineserver

hadoop2.4以后,yarn添加了守护进程timelineserver。可以方便的获取MRApp的历史信息。但要查看counters等信息,还是需要开启mr historyserver

配置

可选的属性:yarn-site.xml中启用timelineserver

        <!--配置TimeLine Server-->

        <property>

                <name>yarn.timeline-service.enabled</name>

                <value>true</value>

        </property>

        <property>

                <name>yarn.resourcemanager.system-metrics-publisher.enabled</name>

                <value>true</value>

        </property>

        <property>

                <name>yarn.timeline-service.generic-application-history.enabled</name>

                <value>true</value>

        </property>

启动服务

启动:timelineserver的命令:

$ yarn-daemons.sh start timelineserver

启动以后的服务为:

ApplicationHistoryServer

查看web

启动以后,会使用8188端口,现在可以访问这个端口:

 


如果需要查看19888端口的JobHistoryServer服务,必须要再使用以下命令,启动:

$ mr-jobhistory-daemon.sh start historyserver


回收站

Hadoop系统也有回收站,被删除的文件,并没有真正的删除,仅是移到了回收站中。在core-site.xmlfs.trash.interval用于配置回收站中数保留多少分钟。默认情况下为0,即回收站无效。

使用shell hdfs命令行操作删除的文件,将会被移动到回收站中。但使用Java代码,删除的文件,不会被移动到回收站中。不过,在Java API中,可以使用Trash类的moveToTrash方法,将文件移动到回收站中。

被删除的文件,将保存到hdfs://ip:port/user/$USER/.Trash目录下。

 

配置启动回收站

以下配置启用回收站,设置回收站中的数据保留60分钟。Core-site.xml文件中添加以下配置:

<property>

<name>fs.trash.interval</name>

<value>60</value>

</property>

配置成功以后,启动hdfsyarn

使用shell删除一个文件或是目录

$ hdfs dfs -rm -r out001

18/06/04 09:54:44 INFO fs.TrashPolicyDefault: Namenode trash configuration: Deletion interval = 60 minutes, Emptier interval = 0 minutes.

18/06/04 09:54:44 INFO fs.TrashPolicyDefault: Moved: 'hdfs://hadoop41:8020/out001' to trash at: hdfs://hadoop41:8020/user/wangjian/.Trash/Current/out001

Moved: 'hdfs://hadoop41:8020/out001' to trash at: hdfs://hadoop41:8020/user/wangjian/.Trash/Current

通过上面的信息可以看出,删除的目录,被移动到了/user/$USER/.Trash目录下。

查看回收站中的数据

[wangjian@hadoop41 hadoop]$ hdfs dfs -ls -R user/wangjian

drwx------ wangjian supergroup0 2018-06-04 10:00 /user/wangjian/.Trash

drwx------- wangjian supergroup0 2018-06-04 09:54 /user/wangjian/.Trash/180604100000

drwxr-xr-x-wangjiansupergroup02018-06-03 22:41 /user/wangjian/.Trash/180604100000/out001

 

找回数据

从回收站中找回数据,就是将回收站中的数据移出回收站即可。

$ hdfs dfs -mv /user/wangjian/.Trash/180604100000/out001 /out001

 

删除已经超时的文件

使用hdfs dfs -expunge可以删除已经在回收站中超过最小时间限制的所有文件。注意,对于没有超过时间限制的文件,并不会被删除。

 

Java API客户端删除

使用Java客户端删除的文件,将不会被移动到回收站中。除非使用Trash类的moveToTrash方法。

package cn.wangjian.mapreduce;

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.conf.Configured;

import org.apache.hadoop.fs.FileSystem;

import org.apache.hadoop.fs.Path;

import org.apache.hadoop.fs.Trash;

import org.apache.hadoop.util.Tool;

import org.apache.hadoop.util.ToolRunner;

/**

 * 使用Java代码,将一个文件删除,默认不会去回收站的测试

 * @author wangjian

 */

public class Demo05_Trash extends Configured implements Tool {

@Override

public int run(String[] args) throws Exception {

Configuration config = getConf();

config.set("fs.defaultFS","hdfs://hadoop41:8020");

config.set("fs.trash.interval","60");

FileSystem fs = FileSystem.get(config);

Path path = new Path("/words.txt");

Trash trash = new Trash(fs, config);

boolean boo =trash.moveToTrash(path);

System.out.println("删除成功:"+boo);

return 0;

}

public static void main(String[] args) throws Exception {

int code = ToolRunner.run(new Demo05_Trash(), args);

System.exit(code);

}

}

 

 

小结:

1:通过配置fs.trash.intervalhdfs-site.xml文件可以开启hadoop的回收站。

 


欢迎加入,共同学习技术:


文章转载自Coding On Road,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论