[转]解决ubuntu下mysql不能远程连接数据库的问题

来源:http://www.php100.com/html/webkaifa/database/Mysql/2010/1115/6818.html
Ubuntu10.04上自带的MySQL,执行了
root@ubuntu:~#sudo apt-get install mysql
安装完mysql-server

启动mysql
root@ubuntu:~#/etc/init.d/mysql start

本地可以连接进入数据库。
root@ubuntu:~#mysql -uroot -p

设置了远程访问权限:
mysql> grant all PRIVILEGES on *.* to admin@’%’ identified by ‘123456′;
Query OK, 0 rows affected (0.04 sec)

mysql> use information_schema
mysql> select * from user_privileges;
查询到有下面的结果:’admin’@’%',说明mysql已经授权远程连接。

在windows下访问Ubuntu的数据库,连接不上,但是Ubuntu上安装的apache可以访问。
用iptalbes添加端口3306后也无法访问。
root@ubuntu:~# iptables -A INPUT -p tcp –dport 3306 -j ACCEPT

Ubuntu上查看Mysql网络连接:
root@ubuntu:~# netstat -an |grep 3306
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN
本地端口也在监听

root@ubuntu:~# ufw status
Firewall not loaded
本地防火墙未打开

后来在网上找到一个解决办法:
查看/etc/mysql/my.cnf找到bind-address才发现配置的是 127.0.0.1(bind-address=127.0.0.1),直接改为bind-address=192.168.0.xxx(本机ip),然 后再查看3306端口打开了,ok,可以正常连接了


Fatkun图片批量下载谷歌浏览器扩展1.3版更新了

1.3版插件地址:https://bath-image-download.googlecode.com/files/batch1_3.crx

1.3版update:2012-05-01

  1. 支持特定网站取大图,添加新浪微博和新浪轻博客的支持
  2. 支持input图片
  3. 添加视图切换

 

最近工作上有点忙,先做一个小更新。有好多东西要学,是压力也是动力~!

详细信息:http://fatkun.com/2010/09/batch-image-download.html


Ubuntu 11.04 下安装配置 JDK 7

Tags: , ,

文章来源:Ubuntu 11.04 下安装配置 JDK 7

这篇文章说得很清晰。。复制过来。。以作备用。。
———————
第一步:下载jdk-7-linux-i586.tar.gz

wget -c http://download.oracle.com/otn-pub/java/jdk/7/jdk-7-linux-i586.tar.gz

(注:如果下载不下来,建议使用迅雷下载,然后拷贝到Linux系统上。)
第二步:解压安装

sudo tar zxvf ./jdk-7-linux-i586.tar.gz  -C /usr/lib/jvm  
cd /usr/lib/jvm  
sudo mv jdk1.7.0/ java-7-sun

第三步:修改环境变量

vim ~/.bashrc

添加:

export JAVA_HOME=/usr/lib/jvm/java-7-sun  
export JRE_HOME=${JAVA_HOME}/jre  
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib  
export PATH=${JAVA_HOME}/bin:$PATH

保存退出,输入以下命令使之立即生效。

source ~/.bashrc

第四步:配置默认JDK版本
由于ubuntu中可能会有默认的JDK,如openjdk,所以,为了将我们安装的JDK设置为默认JDK版本,还要进行如下工作。
执行代码:

sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-7-sun/bin/java 300  
sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/java-7-sun/bin/javac 300  
sudo update-alternatives --install /usr/bin/jar jar /usr/lib/jvm/java-7-sun/bin/jar 300

执行代码:

sudo update-alternatives --config java

系统会列出各种JDK版本,如下所示:

snowdream@snowdream:~$ sudo update-alternatives --config java  
有 3 个候选项可用于替换 java (提供 /usr/bin/java)。  
 
 
  选择       路径                                    优先级  状态  
------------------------------------------------------------  
* 0            /usr/lib/jvm/java-6-openjdk/jre/bin/java   1061      自动模式  
  1            /usr/lib/jvm/java-6-openjdk/jre/bin/java   1061      手动模式  
  2            /usr/lib/jvm/java-6-sun/jre/bin/java       63        手动模式  
  3            /usr/lib/jvm/java-7-sun/bin/java           300       手动模式

要维持当前值[*]请按回车键,或者键入选择的编号:3
update-alternatives: 使用 /usr/lib/jvm/java-7-sun/bin/java 来提供 /usr/bin/java (java),于 手动模式 中。
第五步:测试

snowdream@snowdream:~$ java -version  
java version "1.7.0"  
Java(TM) SE Runtime Environment (build 1.7.0-b147)  
Java HotSpot(TM) Server VM (build 21.0-b17, mixed mode)

eclipse上单步调试Hive

Tags: ,

在百度找到这篇文章:在Windows eclipse上单步调试Hive教程

可是我死活搞不定在windows安装hadoop和hive,cgywin不靠普啊。。还是在ubuntu下调试了。

准备

前提条件是你已经部署好hadoop和hive,能够正常的执行hive查询。

我在~/workspace/hive新建了两个目录lib和conf

  1. 从hive目录中的lib和hadoop目录中的lib复制一份到一个目录里,我是放在~/workspace/hive/lib
  2. 还要把hadoop目录下的hadoop*.jar都拷贝过来吧。
  3. 如果用mysql做metastore的数据库,还需要把mysql-connector的lib加上
  4. 把hive的conf文件夹拷贝过来(要已配置好的conf文件哦)
  5. 把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 == null) {
      l4j.debug("hive-site.xml not found.");
    } else {
      addResource(hsiteurl);
    }

Hive为什么会创建DELETEME表

Tags:

在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 (tbl.getSd().getLocation() == null
            || tbl.getSd().getLocation().isEmpty()) {
            tblPath = wh.getDefaultTablePath(
              tbl.getDbName(), tbl.getTableName());
          } else {
            if (!isExternal(tbl) && !MetaStoreUtils.isNonNativeTable(tbl)) {
              LOG.warn("Location: " + tbl.getSd().getLocation()
                + " specified for non-external table:" + tbl.getTableName());
            }
            // 主要就是这里啦!getDnsPath!!!帮我们把dataurl补全
            tblPath = wh.getDnsPath(new Path(tbl.getSd().getLocation()));
          }
          tbl.getSd().setLocation(tblPath.toString());
        }
 
        //...
        ms.createTable(tbl);
 
    }

因为我们的location不为空~所以..
主要就是这一句:tblPath = wh.getDnsPath(new Path(tbl.getSd().getLocation()));
看看getDnsPath()做了什么,打开代码Warehouse.java

  public Path getDnsPath(Path path) throws MetaException {
    FileSystem fs = getFs(path);
    return (new Path(fs.getUri().getScheme(), fs.getUri().getAuthority(), path
        .toUri().getPath()));
  }

就帮我们做了些转换。。。我们建表看到的hdfs://hostname:port就是这里加上的。

再来看一下alter_table

    public void alter_table(final String dbname, final String name, final Table newTable)
        throws InvalidOperationException, MetaException {
\\...
 alterHandler.alterTable(ms, wh, dbname, name, newTable);

跳入这个类HiveAlterHandler.java,只有一个方法:

public void alterTable(RawStore msdb, Warehouse wh, String dbname,
      String name, Table newt) throws InvalidOperationException, MetaException {
//这里主要判断表名有没有改
//如果改了分区字段则抛错误
//如果改了表名但location没改或者为空,并且不是外部表,则把数据给移了~
 
//最后,直接的alterTable了。。?虾米,location就这样保存进去了?!
      // now finally call alter table
      msdb.alterTable(dbname, name, newt);
      // commit the changes
      success = msdb.commitTransaction();
}

location没做什么处理就保存进去了。。。

RawStore是什么东西?代码中很多用了反射的方式调用。。貌似实质上是ObjectStore.java类。。
这个类使用jdo来操作metastore数据库