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

CAS对接Open edX

Open edX的第三方登录是作为一个django app存在的,配置过程如下。

LMS配置过程

##安装CAS的Client、Mapper
进入edXapp环境,下载CAS的Client、Mapper

CAS Client安装目录在下面的地址

Mapper的安装目录在下面的地址

开启edX特性支持CAS登陆

修改/edx/app/edxapp/lms.env.json文件如下

修改/edx/app/edxapp/edx-platform/lms/envs/common.py如下

同时

修改/edx/app/edxapp/edx-platform/lms/envs/aws.py如下

修改/edx/app/edxapp/edx-platform/lms/urls.py如下

增加一个nextpage属性,当用户通过CAS登陆后自动跳转到dashboard。

修改/edx/app/edxapp/edx-platform/common/djangoapps/external_auth/views.pydjango_cas.views改为cas.view

修改CAS Client配置文件

在cas目录中找到backends.py

默认的Client并没有返回附加的属性,寻找下面的函数

在其返回值增加用户附加属性。也就是代码中的tree。修改如下
原版函数结尾:

改为下面这样:


寻找下面的片段

改为

分析:
username, authentication_response = _verify(ticket, service)这一行是用户认证后返回的用户名和附加属性的XML树。
对接逻辑如下(try之后的部分):
尝试根据用户名获取用户的model。当用户不存在时候,如果设置了自动创建用户。那么就自动根据用户名创建一个用户的model,如果定义了属性解析器、那么根据CAS认证返回的XML树解析用户的属性,对应更改user的model。之后保存model并注册用户。

问题:
1. 是否应该让用户每次通过CAS登陆后都去解析用户的属性来保持edX中用户的资料和CAS系统提供的一致?
2. user和profile的关系是什么?
3. 用户属性的更改是通过更改user还是更改profile?

更改Mapper使其能正确解析CAS Server返回的XML树

修改/edx/app/edxapp/venvs/edxapp/lib/python2.7/site-packages/mitx_cas_mapper/__init__.py

打印源码中的attr结果如下

所以分析、CAS Server返回结果结构大致如下。

修改源代码中原有的XPath、对应实际返回的XML Tag即可正常解析XML

CMS配置过程

开启edX特性支持CAS登陆

修改/edx/app/edxapp/cms.env.json文件如下

修改/edx/app/edxapp/edx-platform/cms/envs/common.py如下,增加一行

修改/edx/app/edxapp/edx-platform/cms/envs/aws.py如下

修改/edx/app/edxapp/edx-platform/cms/urls.py如下

增加一个nextpage属性,当用户通过CAS登陆后自动跳转到dashboard。

修改/edx/app/edxapp/edx-platform/common/djangoapps/external_auth/views.pydjango_cas.views改为cas.view

其他的说明

如果要对CAS返回的结果进行解析,需要更改mapper的代码。在mapper的安装目录下可以看到python脚本。在这里给出一个示例,本校CAS将会返回学号等登录信息,需要自动填写姓名、邮箱。解析脚本参考如下。