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的数据量不是很大。。。待解决=-=

Linux常用软件(更新ing)

是的=-=我又来挖坑了。。争取慢慢填233333

本文记录Ubuntu Linux下比较好用的软件
软件大部分可以通过apt-get install命令安装,如果你在校内,建议更换清华源(参考基本配置:http://blog.hylstudio.cn/archives/452),如果在校外可以用网易源。

之前还几篇可以参考。。之后会写的更详细的=-=嗯,相信我,一定会写的

 

Linux常用命令备忘录(更新ing)

 

Linux笔记1(Linux运维、大数据相关工具)

Linux笔记2(Linux运维、大数据相关工具)

XShell
远程终端,可以同步操作N个终端,在懒得写ansible的时候简直是神器

git
先继续挖坑23333之后再说
可以参考廖雪峰教程http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000

tree
可以显示指定目录结构的工具
常用命令:tree .

ansible
可以批量操作多个远程电脑,批量部署、自动化运维必备
批量执行命令:ansible all -a 'date'
批量分发文件:ansible -m copy -a 'src=/tmp/file1 dest=/tmp/file1'

fish
漂亮、方便的终端,比bash智能、颜值高
进入终端:fish

tmux
长时间脚本执行的神器(学长说screen也行,然而我没试过)
常用操作命令:
进入tmux:tmux
让tmux在后台运行:先按Ctrl+B,再按d
回到后台运行的tmux:tmux attach
tmux内新建一个窗口:先按Ctrl+B,再按c
切换窗口:先按Ctrl+B,再按对应的窗口编号
关闭当前窗口:先按Ctrl+B,再按&符号(Shift + 7)
滚动查看之前的输出:先按Ctrl+B,再按[(左方括号)
退出滚动模式:在滚动模式下按q

参考:http://www.kancloud.cn/kancloud/tmux/62459

make
make做构建工具的神器
参考:http://blog.csdn.net/ruglcc/article/details/7814546/
http://blog.csdn.net/liang13664759/article/details/1771246

 

 
supervisor
后台控制程序
参考
http://www.supervisord.org/

 

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

es分词引擎

计科的同学做实验如果需要分词可以试用下这个分词引擎。

github地址https://github.com/huaban/elasticsearch-analysis-jieba

es官方文档https://www.elastic.co/guide/en/elasticsearch/reference/2.3/getting-started.html

地址http://es.hylstudio.cn/jieba

接口说明

  • index 主要用于索引分词,分词粒度较细
  • search 主要用于查询分词,分词粒度较粗

返回json中的index为字符序号,从0开始,左闭右开。

 

接口地址 http://es.hylstudio.cn/jieba/_analyze?analyzer=jieba_index

请求方法 POST

请求示例

{“text”:”明天实验取消了,好高兴哈哈哈哈”}

返回示例

接口地址 http://es.hylstudio.cn/jieba/_analyze?analyzer=jieba_search

请求方法 POST

请求示例

{“text”:”明天实验取消了,好高兴哈哈哈哈”}

返回示例

 

Linux笔记关于同步文件

由于insight的数据需要每天同步,所以需要每天定时同步日志到集群的HDFS。所以写了个简单的脚本进行同步。脚本如下
前提是配置好ssh免密码

以上脚本放入集群hdfs的NameNode主机上,执行crontab -e编辑定时任务如下

1 0 * * * /bin/bash /path/sync.sh

这样每天凌晨00:01会定时同步前一天的日志到集群,便于定时执行分析任务。

另外,在初始化好/var/lib/analyticstasks后, 为了节省时间把整个文件夹直接复制到集群并改名为analytics-bistu。但是venv虚拟环境下的变量并没有更改,所以更改所有venv/bin下python解释器,除了activate文件在中间有个环境变量,其他的都在第一行。可以用sed批量替换。。。
scp不会复制软连接,所以可以考虑使用rsync。。。具体命令还没写=-=

Linux服务器基本配置

当拿到一个服务器要开始搭建服务时候,首先应该确认一些设置。。。以免之后被坑。。。
我用的最多的服务器系统版本是Ubuntu 14.04。。以此为例来记录下常见操作

首先确定网络设置,包括IP、DNS、HOSTNAME、HOSTS配置
/etc/resolv.conf中设置dns,常见的202.106.46.151、8.8.8.8、114.114.114.114
持久化DNS配置,/etc/resolvconf/resolv.conf.d/base加入nameserver xxx.xxx.xxx.xxx
/etc/network/interfaces中设置IP、网卡等信息、确定能正常上网
/etc/hostname中设置本机名称
/etc/hosts中把localhost和hostname都解析到本地127.0.0.1

服务器时间的设置,使用NTP服务器同步时间。如果你在BISTU校内,可以使用sudo ntpdate cas.bistu.edu.cn进行同步
使用sudo vim /etc/ntp.conf命令
编辑ntp服务器池,添加server cas.bistu.edu.cn
重启ntp服务sudo service ntp restart即可
如果在校外,可以使用s2c.time.edu.cn北邮的时间服务器,另附常用服务器地址 https://www.douban.com/note/171309770/

设置apt源为国内源,文件地址/etc/apt/sources.list,校内建议用清华的、校外用网易的。

清华地址 https://mirrors.tuna.tsinghua.edu.cn/

网易地址  http://mirrors.163.com/ 
备份原版cp /etc/apt/sources.list /etc/apt/sources.list.backup
清空文件:>/etc/apt/sources.list

把内容更新vim /etc/apt/sources.list

sudo apt-get update