Archive for the ‘J2EE’ Category

eclipse上单步调试Hive

在百度找到这篇文章:在Windows eclipse上单步调试Hive教程 可是我死活搞不定在windows安装hadoop和hive,cgywin不靠普啊。。还是在ubuntu下调试了。 准备 前提条件是你已经部署好hadoop和hive,能够正常的执行hive查询。 我在~/workspace/hive新建了两个目录lib和conf 从hive目录中的lib和hadoop目录中的lib复制一份到一个目录里,我是放在~/workspace/hive/lib 还要把hadoop目录下的hadoop*.jar都拷贝过来吧。 如果用mysql做metastore的数据库,还需要把mysql-connector的lib加上 把hive的conf文件夹拷贝过来(要已配置好的conf文件哦) 把hive中的src目录拷贝进来 创建项目 在这个目录下(~/workspace/hive/src/cli)的代码是hive命令行的代码,我们可以通过调试它来了解hive的执行过程。 在这个目录下,用eclipse新建一个项目。 配置bulid path,把我们准备好的lib全部加上 这个时候,代码应该没有编译错误了,如果有,请检查一下那个lib没加上。 还有个重要的步骤!hive是怎样找它的配置文件的呢? 我们要把conf目录加入classpath中,在debug configuration中的Classpath,点击左侧的advanced,add exteral path,选上我们准备好的conf目录。 这样就可以开始debug了! 如果你运行报does not have a sch错误,应该是由于没找到配置文件引起的。   顺便看看hive是怎么找到配置文件的。 都是通过getClassLoader().getResource()方法来获取的,所以配置文件夹必须在classpath中! URL hconfurl = getClassLoader().getResource("hive-default.xml"); if (hconfurl == null) { l4j.debug("hive-default.xml not found."); } else { addResource(hconfurl); } URL hsiteurl = getClassLoader().getResource("hive-site.xml"); if (hsiteurl == [...]


Hive为什么会创建DELETEME表

在Hive中会去取schme name和catalog(暂时不知道这个东西有什么用) 是第三方的库datanucleus在操作, 可以看到它创建DELETEME123213一些随机数字的表,然后删掉。。目的就为了去获取schme name和catalog 可以在hive-site.xml配置,不让做这个操作… <property> <name>datanucleus.fixedDatastore</name> <value>true</value> </property> 这样会导致的结果暂时未知。。。o(╯□╰)o 另外,最好把datanucleus.autoCreateSchema设为false 官方的注释中表明,如果你第一次已经建好了表,就把这个设回false,为了方便第一次创建表结构。 <property> <name>datanucleus.autoCreateSchema</name> <value>false</value> </property>


Hive MetaStore建表与修改表分析

问题 使用Hive MetaStore(这里指的是通过thrift连接hiveserver) Create table 和 Alter table的时候遇到一个问题 建表时指定的location为 /mnt/dfs/xxx,实质上使用hiveMetastore会帮你做一个转换,最后location变成 hdfs://hostname:port/mnt/dfs/xxx的路径 但在修改表的时候,却不会帮你做这样的转换!!坑爹啊。。你指定的是什么就是什么~ 注:通过hive命令行方式执行sql命令建表也是这样,不过修改表的时候,location必须是这样的路径hdfs://hostname:port/mnt/dfs/xxx才可以修改成功,否则报错。 分析问题 从代码入手吧。。 进入这个目录 hive-0.7.1-cdh3u3\src\metastore\src\java\org\apache\hadoop\hive\metastore 这里都是hiveserver的代码了。 打开HiveMetaStore.java代码,咱们直奔主题,找create_table和alter_table去 public void create_table(final Table tbl) throws AlreadyExistsException, MetaException, InvalidObjectException { … create_table_core(ms, tbl); 调用了create_table_core(ms, tbl);继续 private void create_table_core(final RawStore ms, final Table tbl) throws AlreadyExistsException, MetaException, InvalidObjectException { //检查了一些名称,列名,分区之类的 //… ms.openTransaction(); //…. if (!TableType.VIRTUAL_VIEW.toString().equals(tbl.getTableType())) { if [...]


org.hibernate.NonUniqueObjectException的原因与解决方法

使用hibernate更新对象时,出现如下错误: org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session:[com.fatkun.dao.hibernate.User#12] 原因 在同一个session内,如果已经有一个对象已经是持久化状态(load进来等),现在构造一个新的PO,和前一个持久化对象拥有相同的持久化标识(identifier),在update的时候,就会抛这个错误。 举个例子(伪代码): User user1 = session.load(1); User user2 = new User(); user2.setId(1);//此时ID和user1一样 user2.setUsername("fatkun"); session.update(user2);//这里会抛出错误 解决方法 1.不要重新new一个对象,使用load的对象对他进行更改值。 例如上面例子直接对user1操作,最后更新user1 2.如果是hibernate3以上,可以使用session.merge()方法 3.把session中同标识的对象移出(session.evict(user1)),使他成为脱管的状态,然后user2就可以update了。


JDK源码分析:java.lang.String

最近开始看JDK源码,不能太懒了~~注释非常详细(虽然是英文),而且部分代码也不算很复杂。先挑的简单的看看。。为了坚持下去,所以在博客写些记录,一是为了记忆,二是给自己一个坚持的理由~~哇咔咔,英文不算很好,那就对着中文API一起看吧。。 String结构 这个类结构很简单。。 /** The value is used for character storage. */ private final char value[];   /** The offset is the first index of the storage that is used. */ private final int offset;   /** The count is the number of characters in the String. */ private final int count; 用了一个char数组来存储字符,然后offset是偏移(这个我还搞不懂有啥用),count是String的长度。 注意到String类是final的,不可以被继承,而且private final [...]


SQL Server JDBC Driver 2.0编译失败

  Exception in thread "main" java.lang.UnsupportedClassVersionError: Bad version number in .class file 这个错误是因为JDK的版本不对,请检查你的JDK版本。然后检查你的包是不是都用低版本JDK编译的。 如果你在使用JDK1.5的话,一定要使用sqljdbc.jar包,sqljdbc4.jar是在JDK1.6的环境下才能使用的。