• 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/  
  • 相关阅读:
    Codeforces 1316B String Modification
    Codeforces 1305C Kuroni and Impossible Calculation
    Codeforces 1305B Kuroni and Simple Strings
    Codeforces 1321D Navigation System
    Codeforces 1321C Remove Adjacent
    Codeforces 1321B Journey Planning
    Operating systems Chapter 6
    Operating systems Chapter 5
    Abandoned country HDU
    Computer HDU
  • 原文地址:https://www.cnblogs.com/kxdblog/p/4171083.html
Copyright © 2020-2023  润新知