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: ‘\xC2\x8A\xC2\xA8\xC3\xA7…’ 的错误。
所以,将数据库编码为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客户端,则
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
切换到branch-0.12,开始编译hive
mvn clean package -DskipTests -Phadoop-2
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/
Centos中hive/hbase/hadoop/mysql实际操作及问题总结的更多相关文章
- Sqoop_具体总结 使用Sqoop将HDFS/Hive/HBase与MySQL/Oracle中的数据相互导入、导出
一.使用Sqoop将MySQL中的数据导入到HDFS/Hive/HBase watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWFyb25oYWRvb3A=/ ...
- CentOs中iptables配置允许mysql远程访问
在CentOS系统中防火墙默认是阻止3306端口的,我们要是想访问mysql数据库,我们需要这个端口,命令如下: 1 /sbin/iptables -I INPUT -p tcp --dport 30 ...
- CentOS 中利用docker安装MySQL
1.前提条件 centos7 且内核版本高于3.10, 可通过命令: uname -r 查看内核版本 2.利用yum 安装docker 安装一些必要的系统工具: sudo yum install -y ...
- 在centos中php 在连接mysql的时候,出现Can't connect to MySQL server on 'XXX' (13)
原文连接:http://hi.baidu.com/zwfec/item/64ef5ed9bf1cb3feca0c397c 红色的是命令 SQLSTATE[HY000] [2003] Can't con ...
- centos中创建自动备份Mysql脚本任务并定期删除过期备份
背景: OA系统数据库是mysql,引擎为myisam,可以直接通过拷贝数据库文件的方式进行备份 创建只备份数据库的任务: 创建保存mysql数据库备份文件的目录mysqlbak mkdir /hom ...
- centos中编译安装nginx+mysql +php(未完)
参考地址:http://www.cnblogs.com/htian/p/5728599.html 去官网找到PCRE,并下载http://www.pcre.org/wget ftp://ftp.csx ...
- Centos搭建mysql/Hadoop/Hive/Hbase/Sqoop/Pig
目录: 准备工作 Centos安装 mysql Centos安装Hadoop Centos安装hive JDBC远程连接Hive Hbase和hive整合 Centos安装Hbase 准备工作: 配置 ...
- Hadoop + Hive + HBase + Kylin伪分布式安装
问题导读 1. Centos7如何安装配置? 2. linux网络配置如何进行? 3. linux环境下java 如何安装? 4. linux环境下SSH免密码登录如何配置? 5. linux环境下H ...
- hadoop之hive&hbase互操作
大家都知道,hive的SQL操作非常方便,但是查询过程中需要启动MapReduce,无法做到实时响应. hbase是hadoop家族中的分布式数据库,与传统关系数据库不同,它底层采用列存储格式,扩展性 ...
随机推荐
- java 中的instanceof
java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例.instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例. 用法:resu ...
- Bootstrap fileinput:文件上传插件的基础用法
官网地址:http://plugins.krajee.com/ 官网提供的样例:http://plugins.krajee.com/file-input/demo 基础用法一 导入核心CSS及JS文件 ...
- 新awk整理
总感觉上一篇awk的总结几乎是照着man翻译过来的,惨不忍睹 无意间在互联网上有找到了宝贵的资料 感觉整理的很好,想着照着这个来重新写下,对照新的man更新下吧,只是总是在改变的 一.awk简介二.a ...
- CSS中的字体属性和文本属性
1.CSS字体的属性 font 简写,作用是把所有的针对字体的属性设置在一个声明中 font-family 设置字体系列 font-size 设置字体尺寸 font-style 设置字体风格,ital ...
- 面向对象编程之super内置函数的用法
先来看一段代码: 定义一个名叫People的父类,又定义了一个叫Teacher的老师类和一个叫Student的学生类 来继承People的类,并根据这两个子类实例化出两个对象s1和t1. class ...
- (转)Elasticsearch 5 Ik+pinyin分词配置详解
今天以这篇文章结束同城旅游网的面试,正好面试官也问到站内检索,可以尝试一下这篇文章介绍的方法.Elasticsearch 5 Ik+pinyin分词配置详解
- RChain的Casper共识算法
RChain的Casper共识算法是基于Vlad Zamfir的correct-by-construction共识协议和CTO Greg Meredith和其他RChain成员讨论而来的.他们还为Ca ...
- POJ3155 Hard Life [最大密度子图]
题意:最大密度子图 #include<iostream> #include<cstdio> #include<cstring> #include<algo ...
- 【ASP.NET Core】处理异常(上篇)
依照老周的良好作风,开始之前先说点题外话. 前面的博文中,老周介绍过自定义 MVC 视图的搜索路径,即向 ViewLocationFormats 列表添加相应的内容,其实,对 Razor Page 模 ...
- hbuilder ios 打包失败,无法导入p12证书的解决方案
问题描述: 在profile文件和私钥证书通过hbuilder ios 打包成功过的前提下,突然遇到打包失败的问题,问题详情是无法导入p12证书. 探索过程: 本着遇到问题先自省的态度,重复打包了几次 ...