CDH5性能调优

为了增加pipeline的运算速度,所以利用集群来进行日志的分析统计。测试数据规模:某机构edX的D版在真实场景下一年多使用记录。
开始日期 2016/11/27
开始时间 2:26:00
结束日期 2016/11/28
结束时间 3:34:00
总时间 23:10:54
日志开始日期 2015/6/7
日志结束日期 2016/11/24
在没有任何设置的情况下,运行完所有任务的时间如上表。。。。将近一天的时间=-=太慢了。
经过不断的尝试、分析如下:
慢的原因是每个任务都会有很多的map和reduce任务生成、而每个mapreduce任务都会占用一个worker节点的容器、每个服务器能申请到的容器数量和每个mapreduce占用的内存CPU资源,决定了同时运行的容器数量。
所以,想提高速度,就要尽可能多的让每个mapreduce节省内存、让容器的大小和mapreduce任务所需内存大小尽可能相等。
以我实验的集群规模为例进行参数设置方法。
1.资源计算
3台worker服务器,每个服务器CPU有8个core,16GB内存。
所以一共有24个CPU核心、48GB内存
虚拟cpu系数定为2,每个服务器预留两个核心给操作系统
所以每个服务器CPU vcore数量为8 * 2 – 2 = 14
内存留8G给操作系统,剩下12GB给Container
所以总memory为12 * 3 = 36GB
2.参数配置
需要配置YARN的参数如下(均为CDH5中YARN2的配置)
yarn.app.mapreduce.am.resource.mb 1024//这是Resource Manager需要的内存、我给了1G
yarn.app.mapreduce.am.resource.cpu-vcores 2//这是Resource Manager需要的CPU、我给了2
ApplicationMaster Java 最大堆栈 819.2 //这个数字是yarn.app.mapreduce.am.resource.mb * 0.8得到的
mapreduce.map.memory.mb 640 //这个是每个map任务需要的内存,实测在512时候会有个reduce任务失败,所以给了600多
mapreduce.map.cpu.vcores 2 //这个是每个map任务需要的CPU
mapreduce.reduce.memory.mb 640 //这个是每个reduce任务需要的内
mapreduce.reduce.cpu.vcores 2 //这个是每个reduce任务需要的CPU
mapreduce.map.java.opts.max.heap 512 //这是mapreduce.map.memory.mb * 0.8得到的
mapreduce.reduce.java.opts.max.heap 512 //这是mapreduce.reduce.memory.mb * 0.8得到的
客户端 Java 堆大小(字节) 512 //这里的客户端指的是yarn客户端的大小
JobHistory Server 的 Java 堆栈大小(字节) 1024
NodeManager 的 Java 堆栈大小(字节) 512
yarn.nodemanager.resource.memory-mb 12288 //这个是刚刚说的12G
yarn.nodemanager.resource.cpu-vcores 14 //这是刚刚说的14个vcore
ResourceManager 的 Java 堆栈大小(字节) 1024
yarn.scheduler.minimum-allocation-mb 1024 //一个容器最小内存占用
yarn.scheduler.increment-allocation-mb 128 //一个容器每次多申请多少内存
yarn.scheduler.maximum-allocation-mb 2048 //一个容器最大内存占用
yarn.scheduler.minimum-allocation-vcores 1 //一个容器最小CPU占用
yarn.scheduler.increment-allocation-vcores 1 //一个容器每次多申请多少CPU
yarn.scheduler.maximum-allocation-vcores 4 //一个容器最大内存占用

这样配置的实验结果时间为
开始日期 2016/12/2
开始时间 12:02:00
结束日期 2016/12/2
结束时间 15:34:00
总时间 3:06:50
日志开始日期 2015/6/7
日志结束日期 2016/11/24

比最开始节省了很多时间。。。因为同时在运行的container增加了,所以速度也变快了。
问题:发现map任务的数量每次处理的数据并不多,能不能合并一些数据,而不是每个map只处理一个文件?并且内存占用我觉得还可以在省一些,因为每个map的数据量不是很大。。。待解决=-=

CDH5使用准备

前言

本次搭建CDH主要用于edX的数据分析,用于安装pipeline加快运算速度。

架构设计

3+N结构,3台主机负责HDFS主节点、CDH自身服务、YARN的ResourceManager等主要服务。 其他N台负责HDFS的NameNode和YARN的NodeManager,承担计算任务。现初步设计为6台、即3+3

硬件配置

主节点

CPU:双核E5*4
内存:16G

工作节点

CPU :双核E5*4
内存:16G

操作系统

Ubuntu 14.04 64位

准备工作

hostname、hosts

每台hostname统一前缀,我写的是hadoop。域名有dns的情况下使用dns更方便。
sudo vim /etc/hostname
sudo vim /etc/hosts

127.0.0.1 localhost
IP1 hadoop1.xxx.cn hadoop1
IP2 hadoop2.xxx.cn hadoop2
IP3 hadoop3.xxx.cn hadoop3
IP4 hadoop4.xxx.cn hadoop4
IP5 hadoop5.xxx.cn hadoop5
IP6 hadoop6.xxx.cn hadoop6

关闭防火墙

sudo ufw disable
sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT
sudo iptables -F
sudo apt-get remove iptables

配置网络

sudo vim /etc/sysctl.conf

在最后添加
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
net.ipv6.conf.eth0.disable_ipv6 = 1
vm.swappiness = 10

然后运行sudo sysctl -p

配置CDH库

安装Apache
sudo apt-get install apache2

从官网下载CDH的库并解压到/var/www/html/cm
从官网下载CDH的parcels并解压到/var/www/html/CDH

配置ssh

切换到root下生成密钥和公钥并添加信任
sudo su
ssh-keygen -t rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

添加本地库

sudo vim /etc/apt/sources.list.d/my-private-cloudera-repo.list
添加以下内容

deb [arch=amd64] http://这里替换IP/cm trusty-cm5.0.0 contrib
deb [arch=amd64] http://这里替换IP/cm trusty-cm5.7.0 contrib
deb [arch=amd64] http://这里替换IP/cm trusty-cm5.7 contrib

添加信任
curl -s http://这里替换IP/cm/archive.key | sudo apt-key add -

下载安装程序开始安装

wget https://archive.cloudera.com/cm5/installer/latest/cloudera-manager-installer.bin
sudo chmod u+x ./cloudera-manager-installer.bin
sudo ./cloudera-manager-installer.bin --skip_repo_package=1

如果报错查看/var/log下的错误日志

初始化集群

访问http://这里替换IP:7180执行安装向导
安装成功后即可开始使用

扩展集群

为了方便其他学校使用,遂制作了单节点镜像、安装了所有最基本的CDH角色。内存要求32G、CPU要求8核以上。镜像中已经做完了之前说的所有工作,可直接使用。
扩展节点时裸机要求和之前写的一样、做到下载安装程序之前就可以了(也要给root添加公钥信任),之后通过主节点添加角色实例即可。在主节点的apt缓存中有下载好的5.7.0所有安装包,可直接拷贝加快安装速度。路径:/var/cache/apt/archives

CDH5分布式运行任务的各种坑(更新ing)

# CDH搭建、配置(待填坑)

# 角色分配设计(待填坑)

# 参数调优(待填坑)

因为要把edX中Insight的数据导入到一个6节点集群中做运算,所以尝试分离pipline,远程执行分析任务。具体过程有时间另写文章分析(先挖个坑)=-=
今天发现luigi调度任务的时候把任务挂起后就不动了,最开始怀疑luigi配置问题,按官方文档修改metastore_hostmetastore_port均无效
但是CDH的监控显示hive的Server正常运行,查看日志也没看到输出错误,然后我查看了task的源码发现需要从hive中查询数据,所以怀疑hive配置有问题,
hive配置文件由/etc/hive/conf指定,查看/etc/hive/conf指向了/etc/alternatives/hive-conf,而这个文件又是个符号链接,指向了/opt/cloudera/parcels/CDH-5.7.0-1.cdh5.7.0.p0.45/etc/hive/conf.dist
而启动时候发现加载的log4j配置文件是从这里读取的,而其他正常的节点是指向的/etc/hive/conf.cloudera.hive/,所以执行下面命令指向正常的配置

重试hive,成功~
重新执行task,成功~

更好的办法,仿照正常节点的alternatives修复链接

执行

sudo update-alternatives --install /etc/hive/conf hive-conf /etc/hive/conf.cloudera.hive 90

选择hive-conf正常优先级的链接路径即可

sudo update-alternatives --config hive-conf
发现重启集群后依然错误。。。遂删掉之前的
sudo update-alternatives --remove hive-conf /opt/cloudera/parcels/CDH-5.7.0-1.cdh5.7.0.p0.45/etc/hive/conf.dist
待观察是否管用。。。
这次成功了!
——————-
另外当第一个任务的Mapreduce执行后会卡死,但是不用管,耐心等待即可,不知道为啥是在极慢的写入HDFS= =
——————-
另外还发现几个可能卡死的,由于yarn-site.xml配置错误导致连接超时,虽然CDH监控显示正常但是实际是错误的。需要修改/etc/hive/下的配置文件指向正常的ResourceManager。
还有当luigi生成tmp下的临时sql文件传给hive -f执行时,可能由于hive的配置问题假死,重启hive即可、本质原因同上
另外当任务执行一半强行停止时、warehouse下的文件夹一定要手动删除、否则下次虽然会pending一个任务但是却会读取那个空的hdfs文件夹,命令hdfs dfs -rm -r -f /WAREHOUSE_PATH

——————-
关于hdfs权限的设计
hdfs权限依赖于linux权限,常用命令
hdfs dfs -chmod [-R] 3bit权限掩码 文件地址
hdfs dfs -chown [-R] [owner[:group]] 文件地址
我的方案是仿照windows用户体系,设立单独的用户组,对应hadoop。
在hdfs的设置中可以设计supergroup的默认组,可以改成hadoop
dfs.permissions.supergroup, dfs.permissions.superusergroup

另外,如何多人同时共享CDH集群?先挖坑之后再分析
——————————-
hadoop-stream-tool.jar居然是用jdk1.6编译的
而分数统计的一个jar用的是8u65编译的
而我没注意装上的jdk版本是8u31,导致提示major版本不支持= =已经换成大于65的版本重试。。。希望是这个问题,手动微笑
最终在.bashrc下export了JAVA_HOME,问题解决。。是否应该执行hadoop_env呢??

———————————
学生答题分析任务依然报错,根据调用路径猜测又是hdfs权限问题
/tmp/pipeline-task-scheduler/AnswerDistributionWorkflow/
多次实验并且追查hdfs的NameNode日志,发现WARN,mapred和yarn尝试写这个路径,然而它的状态确实755 hadoop:supergroup
所以更改权限和属组
hdfs dfs -chown -R :hadoop path
hdfs dfs -chmod -R 775 path

然而当新创建的目录出现时候权限依然不对,所以查找hdfs默认权限设置,发现了权限的掩码默认为022,那么默认生成的权限就是755

所以更改掩码为002使得默认权限为775,对应xml的dfs.umaskmode, fs.permissions.umask-mode

———————————
小批量数据测试成功,准备导入一年的使用记录进行运行。编写脚本,提交。。。睡觉去了。。。。。
截张监控图保佑我成功~~~
hadoop-zabbix

———————————————

最长的任务居然运行了7小时=-=

目前为止没出现错误。。。。。233333

但是HUE时间显示不正常,更改时区即可。。。

配置文件中如下

# Time zone name

time_zone=Asia/Shanghai

——————————————–
总时间从最开始24小时能跑完。。。截止至今天加cpu和内存前。。。通过优化YARN2参数使得同样的任务需要12小时。。。。。
今天老师把CPU从1核加到了8核,内存从4G加到了8G… 还是三台Worker。。。。速度最终为3小时执行完同样任务,感觉还有优化空间。。。正在试验中,结束后再分析YARN的配置
另外,虽然zabbix的监控看起来高大上,但是CDH自带的生成器的监控图漂亮啊~~如下
附上生成代码
cpu
select cpu_percent where category = HOST;
select cpu_percent_across_hosts where category=CLUSTER;

memory
select physical_memory_used_across_hosts where category=CLUSTER;
select physical_memory_used;

network
SELECT bytes_transmit_rate_across_network_interfaces, bytes_receive_rate_across_network_interfaces where category = CLUSTER;
SELECT bytes_transmit_rate_across_network_interfaces, bytes_receive_rate_across_network_interfaces where category = HOST;

CMmonitor