1. 通常每个服务器的Map + Reduce总数跟cpu核数大致一致,经验表现为略大于 cpu核数的设置可以发挥最大性能,比如8核配5个map, 5个reduce
2. Map数跟Reduce配置个数通常配置相同
3. Hadoop允许集群里的不同节点配置Map跟Reduce数不同,避免服务器开销不均 匀
4. HDFS block大小默认64M推荐128M
5. HDFS在并发写同一文件情况执行状况未知,可能存在写冲突问题
6. HDFS文件不允许修改,文件一旦建立(写入流关闭)后不能修改
7. 移动计算的代价比移动数据的代价低,通常Map在数据存放的节点服务器上运 行,当在其他服务器上运行是上运行时,该节点数据会拷贝到执行服务器上再进行运算
8. 在job的运行时,每个参与任务的Map处理的datanode节点对象是固定不变 的,Map处理dataNode的粒度可以到文件的行级,比如一个Map可以处理某个dataNode的 前10000行
9. 每个Reduce接受所有Map的结果并且只执行跟自己相关的key的Reduce
10. HDFS上跑的应用,主要是以流式读为主的应用,进行批量处理,比如log分析、 索引构建、数据关联等
11. Hadoop支持根据应用分配额定最大map及reduce个数功能
12. HDFS采用master/slave架构(nameNode,dateNode), NameNode是个单点中心服务 器, 管理文件系统及客户端的访问
13. HDFS默认文件副本3个,不同应用可以通过客户端API决定每个文件的副本数为任 意值
一些配置属性:
<property>
<name>mapred.min.split.size</name>
<value>268435456</value>
<description>决定了每个 Input Split的最小值,也间接决定了一个Job的map 数目。
这里设置为256M,默认64M,有效减少了map的数量,因为在大数据量时,
map数量过大并不一定速度就快,而1个进程处理256M数据也是很快的</description>
</property>
<property>
<name>mapred.compress.map.output</name>
<value>true</value>
<description>打开map输出压缩以节省各节点传输的流量</description>
</property>
<property>
<name>io.sort.mb</name>
<value>250</value>
<description>map输出结果在内存占用buffer的大小,当buffer达到一定阈值,
会启动一个后台线程来对buffer的内容进行排序,然后写入本地磁盘(一个spill文件).默认100M,
有点小了,但并不是越大越好,尝试过调到400M,发现机器内存有点吃不消,又回调到250M</description>
</property>
<property>
<name>mapred.reduce.parallel.copies</name>
<value>10</value>
<description>Reduce copy数据的线程数量,默认值是5</description>
</property>
<property>
<name>mapred.job.shuffle.merge.percent</name>
<value>0.8</value>
<description>从Map节点取数据过来,放到内存,当达到这个阈值之后,
后台启动线程(通常是Linux native process)把内存中的数据merge sort,
写到reduce节点的本地磁盘;</description>
</property>
2. Map数跟Reduce配置个数通常配置相同
3. Hadoop允许集群里的不同节点配置Map跟Reduce数不同,避免服务器开销不均 匀
4. HDFS block大小默认64M推荐128M
5. HDFS在并发写同一文件情况执行状况未知,可能存在写冲突问题
6. HDFS文件不允许修改,文件一旦建立(写入流关闭)后不能修改
7. 移动计算的代价比移动数据的代价低,通常Map在数据存放的节点服务器上运 行,当在其他服务器上运行是上运行时,该节点数据会拷贝到执行服务器上再进行运算
8. 在job的运行时,每个参与任务的Map处理的datanode节点对象是固定不变 的,Map处理dataNode的粒度可以到文件的行级,比如一个Map可以处理某个dataNode的 前10000行
9. 每个Reduce接受所有Map的结果并且只执行跟自己相关的key的Reduce
10. HDFS上跑的应用,主要是以流式读为主的应用,进行批量处理,比如log分析、 索引构建、数据关联等
11. Hadoop支持根据应用分配额定最大map及reduce个数功能
12. HDFS采用master/slave架构(nameNode,dateNode), NameNode是个单点中心服务 器, 管理文件系统及客户端的访问
13. HDFS默认文件副本3个,不同应用可以通过客户端API决定每个文件的副本数为任 意值
一些配置属性:
<property>
<name>mapred.min.split.size</name>
<value>268435456</value>
<description>决定了每个 Input Split的最小值,也间接决定了一个Job的map 数目。
这里设置为256M,默认64M,有效减少了map的数量,因为在大数据量时,
map数量过大并不一定速度就快,而1个进程处理256M数据也是很快的</description>
</property>
<property>
<name>mapred.compress.map.output</name>
<value>true</value>
<description>打开map输出压缩以节省各节点传输的流量</description>
</property>
<property>
<name>io.sort.mb</name>
<value>250</value>
<description>map输出结果在内存占用buffer的大小,当buffer达到一定阈值,
会启动一个后台线程来对buffer的内容进行排序,然后写入本地磁盘(一个spill文件).默认100M,
有点小了,但并不是越大越好,尝试过调到400M,发现机器内存有点吃不消,又回调到250M</description>
</property>
<property>
<name>mapred.reduce.parallel.copies</name>
<value>10</value>
<description>Reduce copy数据的线程数量,默认值是5</description>
</property>
<property>
<name>mapred.job.shuffle.merge.percent</name>
<value>0.8</value>
<description>从Map节点取数据过来,放到内存,当达到这个阈值之后,
后台启动线程(通常是Linux native process)把内存中的数据merge sort,
写到reduce节点的本地磁盘;</description>
</property>