cdh添加自定义扩展服务,分发,管理

参考

https://github.com/cloudera/cm_ext

https://github.com/cloudera/cm_csds

生成parcel

1
2
3
4
5
6
7
8
9
# 需要在目标文件夹内新建meta文件,并在meta中新建文件parcel.json,文件内容需要自己参考资料填写
# 验证文件
java -jar cm_ext/validator/target/validator.jar -p HELLO-1.0/meta/parcel.json
# 验证目录
java -jar cm_ext/validator/target/validator.jar -d HELLO-1.0
# 打包parcel
tar zcvf HELLO-1.0-el6.parcel HELLO-1.0 --owner=root --group=root
# 验证
java -jar cm_ext/validator/target/validator.jar -f HELLO-1.0-el6.parcel

cdh-Cloudera Manager安装

安装

1
2
3
wget http://archive.cloudera.com/cm5/installer/latest/cloudera-manager-installer.bin
chmod u+x cloudera-manager-installer.bin
sudo ./cloudera-manager-installer.bin

服务命令

1
2
service cloudera-scm-server start|stop|restart
service cloudera-scm-agent start|stop|restart

touch修改文件时间

touch命令

1
2
3
4
5
6
touch -a -m -t 201512180130.09 fileName.ext

-a = accessed
-m = modified
-t = timestamp - use [[CC]YY]MMDDhhmm[.ss] time format
-c, --no-create do not create any files

文件时间说明

  • a访问时间,读一次这个文件的内容,这个时间就会更新。比如对这个文件运用 more、cat等命令。ls、stat命令都不会修改文件的访问时间。
  • m修改时间,修改时间是文件内容最后一次被修改时间。比如:vi后保存文件。ls -l列出的时间就是这个时间。
  • c状态改动时间。是该文件的i节点最后一次被修改的时间,通过chmod、chown命令修改一次文件属性,这个时间就会更新。

python性能调试profile

工具

  • cProfile:基于lsprof的用C语言实现的扩展应用,运行开销比较合理,适合分析运行时间较长的程序
  • profile:纯Python实现的性能分析模块,接口和cProfile一致。但在分析程序时增加了很大的运行开销。不过,如果想扩展profiler的功能,可以通过继承这个模块实现

基本用法

1
python -m cProfile -s cumulative test.py

结果说明

  • ncalls:表示函数调用的次数
  • tottime:表示指定函数的总的运行时间,除掉函数中调用子函数的运行时间
  • percall:(第一个percall)等于 tottime/ncalls
  • cumtime:表示该函数及其所有子函数的调用运行的时间,即函数开始调用到返回的时间
  • percall:(第二个percall)即函数运行一次的平均时间,等于 cumtime/ncalls
  • filename:lineno(function):每个函数调用的具体信息
    另外,上面分析的时候,排序方式使用的是函数调用时间(cumulative),
    还有其它排序方式:calls, cumulative, file, line, module, name, nfl, pcalls, stdname, time

mysql外键约束关系说明

说明

MySQL有两种常用的引擎类型:MyISAM和InnoDB,目前只有InnoDB引擎类型支持外键约束。

1
2
3
4
5
6
ALTER TABLE tbl_name
ADD [CONSTRAINT [symbol]] FOREIGN KEY
[index_name] (index_col_name, ...)
REFERENCES tbl_name (index_col_name,...)
[ON DELETE reference_option]
[ON UPDATE reference_option]

约束关系

1
2
3
4
5
CASCADE:在父表上update/delete记录时,同步update/delete掉子表的匹配记录 
SET NULL:在父表上update/delete记录时,将子表上匹配记录的列设为null (要注意子表的外键列不能为not null)
NO ACTION:如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作
RESTRICT:同no action, 都是立即检查外键约束
mysql下NO ACTION == RESTRICT

inode软连接和硬连接说明

软连接

1
2
3
4
5
ln -s B A

# 文件A和文件B的inode号码不一样,只是文件A的内容是文件B的路径,读取文件A时,系统会自动将访问者导向文件B
# 文件A依赖于文件B而存在,如果删除了文件B,打开文件A就会报错
# 文件A指向文件B的文件名,而不是文件B的inode号码,文件B的inode"链接数"不会因此发生变化

硬连接

1
2
3
4
5
ln B A

# 源文件与目标文件的inode号码相同,都指向同一个inode
# 这意味着,可以用不同的文件名访问同样的内容;对文件内容进行修改,会影响到所有文件名
# 但是,删除一个文件名,不影响另一个文件名的访问

python使用gdb调试

调试运行进程

1
gdb -p pid

增加libpython来获取更多调试信息

  • a)下载python2.7的源码中的Tools/gdb/libpython.py
  • b)引入libpython.py

    1
    2
    3
    4
    5
    6
    7
    # 在gdb -p pid之后运行
    (gdb) python
    >import sys
    >sys.path.append('/path/to/libpython.py')
    >import libpython
    >end
    (gdb)
  • c)之后可使用命令

    1
    py-bt py-bt-full py-down py-list py-locals py-print py-up

注:python2.6的源码中提供了部分预定义函数以便大家使用gdb调试,我们只需将文件Python-2.6/Misc/gdbinit所包括的内容加入到用户目录下的.gdbinit文件中即可,这样每次启动gdb时会自动完成这些宏的定义。但可惜的是Python2.6.2 gdbini对于pylocals的定义居然有错误, 看来是没有随着代码的更新而同步更新。我们只需将 while $_i < f->f_nlocals修改为 while $_i < f->f_code->co_nlocals即可。

使用let's encrypt配置免费的https证书

安装

1
2
3
yum -y install yum-utils
yum-config-manager --enable rhui-REGION-rhel-server-extras rhui-REGION-rhel-server-optional
yum install certbot

关闭nginx

因为standalone需要占用80和443端口

生成证书

1
certbot certonly --standalone -d example.com -d www.example.com

配置nginx证书

1
2
3
ssl_certificate    /etc/letsencrypt/live/simpledao.win/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/simpledao.win/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/simpledao.win/chain.pem;

启动nginx

更新证书,因为生成的证书只有90天有效期

1
2
3
4
# 测试是否能生成
certbot renew --dry-run
# 生成
certbot renew

注意:由于使用的是standalone模式,需要占用80和443端口,所以需要先关闭nginx才能生成或更新证书,使用webroot模式,则可以不关闭nginx,但需要配置。