HBase 管理,性能调优
标签(空格分隔): HBase 性能优化 PERFORMANCE TUNING Hadoop
设置 Hadoop 来扩展磁盘 I/O
现代服务器通常有多个磁盘硬件来提供大存储能力。这些磁盘通常配置成 RAID 阵列,作为它们的出厂设置。这在很多情况下是有益的,但对 Hadoop 却不是。
Hadoop 的 slave 节点存储了 HDFS 数据块和 MapReduce 临时文件在它的本地磁盘。这些本地磁盘操作受益于使用多个独立的磁盘来扩展磁盘 I/O。
在这方面,我们将描述怎样通过使用多个磁盘设置 Hadoop 来扩展磁盘 I/O。
准备工作
我们假设你的每个 DataNode 节点都有多个磁盘。这些磁盘是 JBOD (简单磁盘捆绑)或 RAID0 配置。假设这些磁盘挂载在 /mnt/d0, /mnt/d1, …, /mnt/dn。并且用户在每个挂载点授予了 HDFS 写权限。
怎样做
为了设置 Hadoop 来扩展磁盘 I/O,遵照这些指示:
在每个 DataNode 节点,在每块磁盘上为 HDFS 创建目录来存储它的数据块:
hadoop$ mkdir -p /mnt/d0/dfs/data
hadoop$ mkdir -p /mnt/d1/dfs/data
…
hadoop$ mkdir -p /mnt/dn/dfs/data
加入以下代码到 HDFS 配置文件中(hdfs-site.xml):
dfs.data.dir
/mnt/d0/dfs/data,/mnt/d1/dfs/data,...,/mnt/dn/dfs/data
同步修改过的 hdfs-site.xml 到集群:
hadoop@master1$ for slave in `cat $HADOOP_HOME/conf/slaves`
do
rsync -avz $HADOOP_HOME/conf/ $slave:$HADOOP_HOME/conf/
done
重起 HDFS:
hadoop@master1$ $HADOOP_HOME/bin/stop-dfs.sh
hadoop@master1$ $HADOOP_HOME/bin/start-dfs.sh
它怎样工作
我建议 DataNode 节点为 JBOD 或是 RAID0,因为你不需要 RAID 冗余,因为 HDFS 通过使用节点间的副本确保了它的数据冗余。因此,当单个磁盘失败了,不会造成数据丢失。
选择哪一个,JBOD 或 RAID0?从理论上来说,使用 JBOD 配置会比 RAID 配置的性能更好。这是因为,在 RAID 配置中,在整个写操作完成之前,你不得不等待阵列中最慢的磁盘完成,这使得平均 I/O 时间等于最慢的磁盘 I/O 时间。JBOD 配置中,最快的磁盘中的操作独立于最慢的磁盘,这使得平均的 I/O 时间比最慢的快。尽管如此,企业级的 RAID 卡或许有很大的影响。在决定选择哪个之前,你或许想对你的 JBOD 和 RAID0 做下基准测试。
对于这两个 JBOD 和 RAID0 配置,你将把磁盘挂载在不同的路径。这里的关键点是设置 dfs.data.dirproperty 在每个磁盘上的所有目录的创建。dfs.data.dirproperty 指定了DataNode 应该存储它本地块在哪里。通过设置它来逗号分隔多个目录,DataNode 以 round robin 方法在所有磁盘上存储它的块。这会使得 Hadoop 高效的扩展磁盘 I/O 操作所有磁盘。
警告:不要在 dfs.data.dir property 值的目录路径之间留下空白,不然它或许不会按照期望那样工作。
你将需要同步这些改变到所有的集群中,并且重起 HDFS 以使它们生效。
不止这些
如果你运行了 MapReduce,MapReduce 存储它的临时文件在 TaskTracker 的本地文件系统,你或许也想设置 MapReduce 来扩展它的磁盘 I/O:
在每个 TaskTracker 节点,为 MapReduce 在每个磁盘上创建目录来存储它的中间数据文件:
hadoop$ mkdir -p /mnt/d0/mapred/local
hadoop$ mkdir -p /mnt/d1/mapred/local
…
hadoop$ mkdir -p /mnt/dn/mapred/local
把以下代码加入 MapReduce 的配置文件中(mapred-site.xml):
hadoop@master1$ vi $HADOOP_HOME/conf/mapred-site.xml
mapred.local.dir
/mnt/d0/mapred/local,/mnt/d1/mapred/local,...,/mnt/dn/mapred/local
同步变更的 mapred-site.xml 文件到集群中,并重起 MapReduce
MapReduce 在执行期间在 TaskTracker 的本地磁盘生成很多临时文件。像 HDFS,在不同的磁盘上设置多个目录有助于大大扩展 MapReduce 的磁盘 I/O。
使用网络拓扑脚本来使得 Hadoop 能机架感知
Hadoop 有“机架感知”的概念,管理者可以定义在集群中每个 DataNode 的机架位置。使得 Hadoop 能机架感知及其重要的,因为:
机架感知预防数据丢失
机架感知提升网络性能
在这方面,我们将描述怎样使得 Hadoop 可以机架感知以及为什么它那么重要。
准备工作
你需要知道你的每一个 slave 节点属于哪个机架。以启动 Hadoop 的用户登陆进 master 节点。
怎样做
以下步骤描述了怎样使得 Hadoop 能机架感知:
创建一个 topology.sh 脚本并把它存储在 Hadoop 的配置目录下。改变 topology.data 的路径,在第 3 行,加入你的环境变量:
hadoop@master1$ vi $HADOOP_HOME/conf/topology.sh
while [ $# -gt 0 ] ; do
nodeArg=$1
exec< /usr/local/hadoop/current/conf/topology.data
result=""
while read line ; do
ar=( $line )
if [ "${ar[0]}" = "$nodeArg" ] ; then
result="${ar[1]}"
fi
done
shift
if [ -z "$result" ] ; then
echo -n "/default/rack "
else
echo -n "$result "
fi
done
不要忘记设置这个脚本的可执行权限
hadoop@master1$ chmod +x $HADOOP_HOME/conf/topology.sh
创建一个 topology.data 文件,如以下片段中那样;改变 IP 地址和机架,加入你自己的环境变量:
hadoop@master1$ vi $HADOOP_HOME/conf/topology.data
10.161.30.108 /dc1/rack1
10.166.221.198 /dc1/rack2
10.160.19.149 /dc1/rack