spring mvc+mybatis+velocity开发遇到的一个错误

用spring mvc+mybatis+velocity开发时,遇到了一个报错,折腾了几个小时:

异常信息一大堆,关键的地方是“java.lang.NoSuchMethodError: org.apache.ibatis.builder.xml.XMLConfigBuilder.(Ljava/io/InputStream;Ljava/lang/String;Ljava/util/Properties;)”。

网上搜了下,说把 applicationContext.xml 里面的这行去掉就可以正常运行:

其实就是mybatis的版本问题,我用的版本是:

把 mybatis.version 改为3.0.4就好了。囧

WordPress Twenty Fourteen主题禁用“特殊内容”/页头图片/幻灯片

WordPress Twenty Fourteen(2014)主题页头部分默认以网格形式显示六条推荐阅读的内容。这些图片可以修改为幻灯片风格的。但是没有一个地方可以禁用这个页头部分。网上找到一个修改 Dashboard Appearance(外观) Editor(编辑) Style sheet (style.css文件). 如下:

修改前:

修改后:… --> 阅读全文

工作流调度器Azkaban

介绍

Azkaban是由Linkedin开源的一个批量工作流任务调度器。用于在一个工作流内以一个特定的顺序运行一组工作和流程。Azkaban定义了一种KV文件格式来建立任务之间的依赖关系,并提供一个易于使用的web用户界面维护和跟踪你的工作流。

它有如下功能特点:

  • Web用户界面
  • 方便上传工作流
  • 方便设置任务之间的关系
  • 调度工作流
  • 认证/授权(权限的工作)
  • 能够杀死并重新启动工作流
  • 模块化和可插拔的插件机制
  • 项目工作区
  • 工作流和任务的日志记录和审计

azkaban任务依赖图

安装

Azkaban的配置相当容易, 只需要设置两个服务器和一个数据库:

  • MySQL实例 – Azkaban使用MySQL来存储项目和执行
  • Azkaban Web服务器 – Azkaban使用Jetty作为Web服务器,用作控制器以及提供Web界面
  • Azkaban执行服务器 – Azkaban执行服务器执行提交工作流。

其中:web服务器和执行服务器是分别部署和启动的。

具体安装步骤详见:http://azkaban.github.io/azkaban2/docs/2.5/#getting-started

建立任务

在Azkaban主页面创建一个Project后可以上传任务。Azakban目前只支持上传.zip的文件,把所有需要用到的jar包和配置都放到.zip文件中。
例如:建立foo.job和bar.job两个任务,且bar.job依赖于foo.job

除了通过web界面,Azkaban也支持http协议的方式上传和执行任务。

任务调度

Azkaban里面除了按时间指定任务何时启动,还可以指定任务周期:就是任务的重复执行频率。这对于那些需要每天或每小时重复执行的任务很有用。

除了设置时间,还能设置任务的失败策略和报警机制。比如可以选择是第一次失败就报警,还是整个流完成后报警。对于工作流中的单个任务还可以设置是否启动。
azkaban任务设置

插件机制

Azkaban支持可插拔的扩展插件,以便提供更多功能,更好的支持其他系统。例如hdfs查看插件可以查看hadoop上的文件。而job类型插件则能够定义具体的任务的启动和执行方式,包括hive,pig等。用户可以方便的扩展插件来支持不同的hadoop版本,或者支持其他的系统。

总结

总的来说,Azkaban是一个比较好用的工作流调度系统,可以用来运行hadoop, hive,pig等各种任务,管理hdfs等,功能还是很强大的。

Hadoop工作流调度系统Oozie

Oozie是一个管理hadoop任务的工作流/协调系统。Oozie工作流中拥有多个Action,如Hadoop Map/Reuce job,Hadoop Pig job等,所有的Action以有向无环图(DAG Direct Acyclic Graph)的模式部署运行。所以在Action的运行步骤上是有方向的,只能上一个Action运行完成后才能运行下一个Action。

oozie任务图

Oozie工作流

  • Oozie工作流通过HPDL(一种通过XML自定义处理的语言,类似JBOSS JBPM的JPDL)来构造。
  • Oozie工作流中的Action在运程系统运行如(Hadoop,Pig服务器上).一旦Action完成,远程服务器将回调Oozie的接口并通知Action已经完成,这时Oozie又会以同样的方式执行工作流中的下一个Action,直到工作流中所有Action都完成(完成包括失败)。
  • Oozie工作流中包含可控制的工作流节点(control flow node)和Action节点(action node)。
  • Control flow node其实可以理解为Oozie的语法,比如可以定义开始(start),结束(end),失败(fail)节点.开始节点就表示从该节点开始运行.同时也提供一种机制去控制工作流的执行过程,如选择(decision),并行(fork),join节点。
  • Oozie工作流提供各种类型的Action用于支持不同的需要,如Hadoop Map/Reduce,Hadoop File System,Pig,SSH,HTTP,Email,Java,以及Oozie子流程.Oozie也支持自定义扩展以上各种类型的Action。
  • Oozie工作流允许自定义参数,如${inputDir}。

例如wordcount的例子:启动后执行”mapreduce wordcount”,如果成功执行end,如果失败执行kill。
其workflow.xml定义如下:

配置打包后通过OozieClient提交给Hadoop就直接可以运行了

任务种类

Oozie任务分为三种模式:

  • workflow – 这种方式最简单,就是定义DAG来执行。
  • coordinator – 它构建在workflow工作方式之上,提供定时运行和触发运行任务的功能。
  • bundle – bundle的作用就是将多个coordinator管理起来。这样我们只需要提供一个bundle提交即可。然后可以start/stop/suspend/resume任何coordinator。

Shell Action

如果想通过Oozie调度远程服务器上的命令,可以通过ssh action来执行任意的shell命令。用户必须明确的上传所需要的第三方库。Oozie通过Hadoop的分布式缓冲来上传、打标签、使用。

Shell命令会在任意一个hadoop计算节点上运行,但是计算节点上默认安装的工具集可能会不一样。不过在所有的计算节点上,通常都装有大部分普通的unix工具。因此需要明确的很重要的一点是:Oozie只支持有被安装到计算节点上的命令或者通过分布式缓存上传的命令。也就是说,我们必须通过file上传我们要用到的文件。

参考:
http://www.infoq.com/cn/articles/introductionOozie
http://jyd.me/nosql/oozie-shell-action-config/

记MySQL的哈希加密问题导致的远程连接异常:”ERROR 2049 (HY000): Connection using old (pre-4.1.1) authentication protocol refused”

今天折腾mysql的时候,遇到一个问题。我在mac book上下载最新的mysql-5.6.15-osx10.7-x86_64,在连接一个远程的mysql服务器(5.0.77版)时报如下的异常:

看字面意思是两边的mysql版本不一致, 使用了mysql 4.1.1之前的授权协议连接时被拒绝。奇怪,本地的版本更新,远程的mysql是5.0.77版也大于4.1.1啊?后来查到在服务器上的密码加密是打开了old_passwords,用的旧的加密方式。

本质原因是:mysql变更过哈希加密的方法,早前是16位以下的,而在4.1以后是更长的hash。

可以测试下:

这是16位的hash,查看old_password选项的值:

可以在当前会话里面设置密码格式:

现在试下新密码的hash长度:

如果执行 查看mysql.user表可以发现,长密码和短密码都有。

现在,创建新用户:

通过

可以看到新建用户baoniu的密码hash值是长的。
接着可以授权用户 baoniu 远程登录权限:

格式:grant 权限 on 数据库名.表名 to 用户@登录主机 identified by “用户密码”; @ 后面是访问mysql的客户端ip地址(或是主机名) % 代表任意的客户端,如果填写 localhost 为本地访问(那此用户就不能远程访问该mysql数据库了)。
(让刚才的内容立即生效)

至此,新创建的用户 baoniu 就可以远程登录了,不会再报这个异常信息了。


如果想把老的账号都改用新的hash方式,可以执行:

参考:
1. MySQL_4.1之后的哈希加密问题
2. mysql-error-2049-hy000-connection-using-old-pre-4-1-1-authentication-protoc