zoukankan      html  css  js  c++  java
  • Centos中hive/hbase/hadoop/mysql实际操作及问题总结

    目录

    Hive中文乱码问题

    hive和hbase的版本不一致

    Ambari hive插入Hbase出错

    Hive0.12和Hbase0.96不兼容,重新编译hive0.12.0

     hiveserver不能正常启动

    hive连接eclipse不能复杂查询,不能加where

    Hive中文乱码问题

    众所周知,我们都是使用mysql存储hive的元数据,可以执行带有中文注释的建表文件,解决中文乱码的问题:

    要把元数据库设定为latin1而把存储中文的数据表的编码设定为utf-8格式,即存储在hive里的表是utf-8的。

    以下几种是不可行的:

      1. 将meta database(mysql)的编码设定为utf-8.hive运行会报错

      2.将meta server(mysql)的编码全部设定为latin1.表格在导入时会出现Incorrect string value: ‘xC2x8AxC2xA8xC3xA7…’ 的错误。

    所以,将数据库编码为latin1,表编码设定为utf8 

    例子:

    1.按照latin1编码建立hive的meta数据库

    2.修改hive-seite.xml的连接编码为UTF8

     <name>javax.jdo.option.ConnectionURL</name> 
    <value>jdbc:mysql://localhost:3306/hive?useUnicode=true&characterEncoding=UTF-8&createDatabaseIfNotExist=true</value> 
    

    3.修改表编码 

    简单:values为列
    alter table detail3 modify values  character set utf8;
    加注释:name为列
    alter table tabletest modify name COMMENT varchar(256) character set utf8;
    

      如果在SecureCRT运行hive客户端,则

    (1)SecureCRT的Options-Session Options-Character encoding设置为UTF-8;
    (2)SecureCRT的Options-Session Options-Normal font设置为Fixedsys,同时字符集设置为CHINESE_GB2312。
     
    hbase client scan出来的数据时ASCII码,但用java API显示为正确的。
    使用HBase API时不要使用str.getBytes将String转化为byte[] ,而应该使用Bytes.toBytes(str);同样使用Bytes.toString(bytes);完成逆向转换。
     

    hive和hbase的版本不一致

    建表时:

    java.lang.IllegalArgumentException: Not a host:port pair: PBUF
    

    解决办法:

    <HIVE_HOME>/lib/hbase-x.y.z*.jar的版本和当前环境中HBase的版本不一致造成的,只要把hbase-x.y.z*.jar 替换成<HBASE_HOME>/lib/下的相关jar 即可。

    如用用<HBASE_HOME>/lib/目录下得jar包

    hbase-client-0.98.0-hadoop2.jar
    hbase-common-0.98.0-hadoop2-tests.jar
    hbase-common-0.98.0-hadoop2.jar
    hbase-protocol-0.98.0-hadoop2.jar
    hbase-server-0.98.0-hadoop2.jar
    htrace-core-2.04.jar
    

     替换掉<HIVE_HOME>/lib/目录下的jar包:

    hbase-0.94.6.1-tests.jar
    hbase-0.94.6.1.jar
    

    Ambari hive插入Hbase出错

    insert overwrite table hbase_detail3 select * from detail3;出现错误:

    Error: java.lang.ClassNotFoundException: org.apache.hadoop.hbase.mapreduce.TableInputFormatBase

    解决办法:是因为hive_aux_jars_path不生效或者冲突(hive-env.sh hive-site.xml)

    unzip -l /usr/lib/hbase/lib/hbase-server-0.96.0.2.0.6.0-68-hadoop2.jar | grep TableInputFormatBase
    5363 10-09-2013 19:45 org/apache/hadoop/hbase/mapred/TableInputFormatBase.class
    7460 10-09-2013 19:45 org/apache/hadoop/hbase/mapreduce/MultiTableInputFormatBase.class
    8803 10-09-2013 19:45 org/apache/hadoop/hbase/mapreduce/TableInputFormatBase.class

      说明hbase-server-0.96.0.2.0.6.0-68-hadoop2.jar是包含相关的类的,可能hive客户端在启动时并没有加载成功。

    测试:在hive命令行下手动加载hbase的jar包,再运行,最笨的办法

    create table test_hbase(id int,name string) row format delimited fields terminated by ',' stored as textfile;
    
    load data local inpath '/home/kang/hive/test_hbase.txt' overwrite into table test_hbase;
    
    CREATE TABLE test_hbase(id int,name string) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
    WITH SERDEPROPERTIES ("hbase.columns.mapping" = "name:val") TBLPROPERTIES("hbase.table.name" = "testhbase");
    
    insert overwrite table test_hbase select * from testhbase;
    
    hive>add jar /usr/lib/hive/lib/hive-hbase-handler-0.12.0.2.0.6.1-102.jar;
    	add jar /usr/lib/hive/lib/hbase-protocol-0.96.1.2.0.6.1-102-hadoop2.jar;
    	add jar /usr/lib/hbase/lib/protobuf-java-2.5.0.jar;
    	add jar /usr/lib/hbase/lib/hbase-client-0.96.1.2.0.6.1-102-hadoop2.jar;
    	add jar /usr/lib/hbase/lib/hbase-common-0.96.1.2.0.6.1-102-hadoop2.jar;
    	add jar /usr/lib/hbase/lib/zookeeper.jar;
    	add jar /usr/lib/hbase/lib/guava-12.0.1.jar;
    	add jar /usr/lib/hbase/lib/hbase-server-0.96.1.2.0.6.1-102-hadoop2.jar;
    	add jar /usr/lib/hbase/lib/htrace-core-2.04.jar (注意:这个不太确定具体名称,需要到/usr/lib/hbase/lib/下确定下)
    测试:insert overwrite table test_hbase select * from testhbase;
    大量导入:insert overwrite table hbase_detail3 select * from detail3;

    其他可能:

    在运行数据导入前设置hive中的mapreduce的jobtracker为本地,命令为hive>SET mapred.job.tracker=local;

    Hive0.12和Hbase0.96不兼容,重新编译hive0.12.0

    hadoop-2.2.0+hbase-0.96.2+hive-0.12.0在启动时没有问题,但在hive查询或者向hbase表中插入数据时出错 (CentOS 6.5) (Ubuntu 下兼容 )

    搜集的错误主要有两种:

    1. hive复制到hbase:

      insert overwrite table test_hbase select * from testhbase;

    错误:Error: java.lang.NullPointerException 

      Caused by: java.io.IOException: Failed on local exception: java.nio.channels.ClosedByInterruptException; Host Details : local host is: "centos/192.168.0.120"; destination host is: "centos":8020; 

    hive_hbase-handler-0.12.0.jar这个jar包要根据连接hbase的版本进行重新编译

    2. select *  from test_hbase; 查询hbase表

    Failed with exception java.io.IOException:java.lang.ClassCastException: org.apache.hadoop.hbase.client.Result cannot be cast to org.apache.hadoop.io.Writable

    原因:hive0.12是基于hadoop1.x的,hbase-0.98.2和hive-0.13.0都是基于hadoop2.x升级的,是至今为止最新匹配版本,但还是得在maven3下编译hive-0.13.0才可以使用。

    最终采用的是hadoop-2.2.0+hive-0.13.0+hbase-0.96.2,测试通过,没有问题,完全按照文档拷贝jar包、hbase-site.xml、配置hive_aux_jars_path即可,非常方便。

    这里还是讲一下,hive-0.12的编译:

    hive-0.12是基于hadoop1.3和hbase0.94的,所以必须进行替换。

    而hbase0.96是基于hadoop2.2的,所以我们必须先解决hive的hadoop版本问题,目前我们从官网下载的hive都是用1.x的版本编译的,因此我们需要自己下载源码来用hadoop2.X的版本重新编译hive,这个过程也很简单,只需要如下步骤:

    hive0.12是基于hadoop1.x的,hbase是基于hadoop2.2.0的,所以要解决hive的hadoop版本问题,重新编译:

    安装svn

    sudo  yum install -y subversion

    svn checkout http://svn.apache.org/repos/asf/hive/branches/branch-0.12  或者 

    安装maven

    下载地址:http://maven.apache.org/download.cgi

    tar -zxvf apache-maven-3.2.3
    vim /etc/profile
    export MAVEN_HOME=/usr/local/apache-maven-3.2.3 
    export PATH=.:$MAVEN_HOME/bin:$PATH  
    source /etc/profile 
    mvn --version 

    切换到branch-0.12,开始编译hive

    mvn clean package -DskipTests -Phadoop-2

     

       1. 先从http://svn.apache.org/repos/asf/hive/branches/branch-0.12 或者是http://svn.apache.org/repos/asf/hive/trunk   我们下载到/home/hadoop/branch-0.12下。 branch-0.12是使用ant编译,trunk下面是使用maven编译,

       2.编译是需要maven的,如果你机器没有配置maven,需要从http://maven.apache.org/download.cgi 下载maven,然后解压出来并在PATH下把$maven_home/bin加入,然后在dos下或者shell下运行mvn –-version,就能知道maven是否配置成功

      3.配置好maven开始编译hive,我们cd到下载源码的branch-0.12 目录,然后运行mvn clean package -DskipTests -Phadoop-2开始编译

      4.编译好后的新jar包是存放在各个模块下的target的,这些新jar包的名字都叫hive-***-0.13.0-SNAPSHOT.jar,***为hive下的模块名,我们需要运行命令将其拷贝到hive-0.12.0/lib下。

      find /home/hadoop/branch-0.12  -name "hive*SNAPSHOT.jar"|xargs -i cp {} /home/hadoop/hive-0.12.0/lib。

    拷贝过去后我们比照着删除原lib下对应的0.12版本的jar包

     

     hiveserver不能正常启动

    出现问题:

    报错如下:
    org.apache.thrift.transport.TTransportException: Could not create ServerSocket on address 0.0.0.0/0.0.0.0:10000.

    原因:端口被占用或IP配置不正确

    查看端口进程:lsof -i tcp:10001 查看所有端口:netstat -ntlp

    root@centos:# lsof -i tcp:10000
    COMMAND   PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
    java    26781 root  264u  IPv4 3576031      0t0  TCP *:ndmp (LISTEN)

    root@centos:# kill -9 进程id,即kill -9 26781

    hive连接eclipse不能复杂查询

    记住:一定要把防火墙关掉,或者开放端口 service iptables stop

    问题描述

    在Hive查询时,可以运行desc table;select * from table limit n;

    但是涉及到复杂一点的,在CLI下需要运行mapreduce的时候,

    如select count(*) from table 或者 select * from table where 1=1

    解决思路:

    就会报错,一般在eclipse下找不到出错的原因,这时候可以查看

    hive --service hiveserver --hiveconf  hive.root.logger=DEBUG,console输出的调试信息

    这一次遇到的错误是因为,hive-hbase-handle-0.12.0.jar在/usr/local/hive/lib/下找不到,

    mv hive-hbase-handle-0.13.1.jar hive-hbase-handle-0.12.0.jar 即可

    由此看来,hive-hbase-handle 是一个很重要的jar类。

    解决hive的jdbc临时目录的权限问题

    遇到问题

    select * from flag where 1 =1  and cust_no = 'A3325221981121080410'  limit 5java.sql.SQLException: Error while processing statement: FAILED: RuntimeException org.apache.hadoop.security.AccessControlException: Permission denied: user=anonymous, access=WRITE, inode="/tmp/hive-hive":hive:hdfs:drwxr-xr-x
    	at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.check(FSPermissionChecker.java:234)
    	at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.check(FSPermissionChecker.java:214)
    	at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermission(FSPermissionChecker.java:158)
    	at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.checkPermission(FSNamesystem.java:5202)
    	at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.checkPermission(FSNamesystem.java:5184)
    

    查看权限

    [root@HADOOP7 ~]# hadoop fs -ls /tmp
    Found 5 items
    drwxr-xr-x   - hdfs          hdfs          0 2014-10-22 17:06 /tmp/hive-hdfs
    drwxr-xr-x   - hive          hdfs          0 2014-09-22 10:41 /tmp/hive-hive
    drwxr-xr-x   - root          hdfs          0 2014-10-28 10:50 /tmp/hive-root
    -rw-r--r--   3 Administrator hdfs          3 2014-09-01 16:18 /tmp/qq.txt
    -rw-r--r--   3 Administrator hdfs         20 2014-09-03 11:08 /tmp/test.txt
    

     修改权限

    [root@HADOOP7 ~]# hadoop dfs -chmod -R 755 /tmp/  
  • 相关阅读:
    js在html中的加载执行顺序
    外部JS的阻塞下载
    mysql 中文字段排序
    PHP 多维数组排序 array_multisort()
    最简单的Linux下apache+mysql+php安装
    [TJOI2008] 彩灯 (线性基)
    [洛谷P2257] YY的GCD (莫比乌斯反演)
    [SDOI2015] 约数个数和 (莫比乌斯反演)
    [POI2007] ZAP-Queries (莫比乌斯反演)
    [NOI2003] 文本编辑器 (splay)
  • 原文地址:https://www.cnblogs.com/kxdblog/p/4171083.html
Copyright © 2011-2022 走看看