
以下是一些注意的细节:
1. 想要执行一些有价值的工作,必须要在多个节点上运行。
2. 集群的规模的大小并没有一个确定的答案。10个节点的集群算是一个小的集群。以后可以随存储与计算需求进行扩充。
3. namenode在内存中保存整个命名空间中所有文件的元信息信息,所以需要内存很大。secondaryNameNode在大多数时间里面空闲,但是它在创建检查点时间的内存与namenode差不多。所以,应该将namenode和secondaryNameNode与namenode部署在不同的节点上。
4. 一般来说,各机架装配30~40台服务器,共享一个10G的交换机。
5. Java和Hadoop版本的支持见: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/JRE。Earlier 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。同时,由于辅助namenode和namenode的内在需求相当,所以,一旦修改了namenode的内存,应该同时修改辅助namenode的内存。可以通过HADOO_NAMENODE_OPTS和HADOOP_SECONDARYNAMENODE_OPTS直接向JVM传递选项。
14. 属性fs.defaultFS描述HDFS文件系统的URI,其主机是namenode的主机名或ip地址,端口号为namenode监听RPC的端口号,如果没有指定,那么默认端口为8020。与此相关的其他属性如:
dfs.namenode.name.dir,dfs.datanode.data.dir,dfs.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得到返回值以确定是否继续运行。
2、start-yarn.sh脚本的工作如下
1、在默认的情况下,资源管理器ResourceManager总是和start-yarn.sh脚本运行在同一机器上。
2、在本机启动一个资源管理器即ResourceManager。
3、在slaves文件列举的每台机器上启动一个节点管理器,即NodeManager。
3、hadoop守进程的关键配置属性
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.xml中fs.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>
配置成功以后,启动hdfs和yarn。
使用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.interval在hdfs-site.xml文件可以开启hadoop的回收站。
欢迎加入,共同学习技术:





