hive脚本
1. sqoop2如何写自动化脚本到hive,或者hbase
Hbase不支持sql语句查询,如果要实现count\group等操作需要借助Maprece程序,门槛较高;
Hive对于SQL的支持有强大的功能,我们不需要写过多的自定义函数就能实现较为复杂的查询
优点:
1、Hive方便地提供了Hive QL的接口来简化MapRece的使用,而HBase提供了低延迟的数据库访问。如果两者结合,可以利用MapRece的优势针对HBase存储的大量内容进行离线的计算和分析;
2、操作方便,hive提供了大量系统功能;
3、降低业务开发人员技术门槛,只需要掌握SQL即可;
缺点:
性能的损失,hive有这样的功能, 他支持通过类似sql语句的语法来操作hbase中的数据, 但是速度慢;
限制条件:
Hbase表需要有多个字段,如果是单列,字段采用特殊字符分隔,那么导入
1、将以下jar包拷贝到$HIVE_HOME/lib/目录中
cp hbase-common-1.0.0-cdh5.5.0.jar$HIVE_HOME/lib/
cp hbase-server-1.0.0-cdh5.5.0.jar$HIVE_HOME/lib/
cp hbase-client-1.0.0-cdh5.5.0.jar$HIVE_HOME/lib/
cp hbase-protocol-1.0.0-cdh5.5.0.jar$HIVE_HOME/lib/
cp hbase-hadoop2-compat-1.0.0-cdh5.5.0.jar $HIVE_HOME/lib/
cp hbase-hadoop-compat-1.0.0-cdh5.5.0.jar$HIVE_HOME/lib/
cp htrace-core-3.2.0-incubating.jar$HIVE_HOME/lib/
cp netty-all-4.0.23.Final.jar$HIVE_HOME/lib/
cp metrics-core-2.2.0.jar $HIVE_HOME/lib/
2、在hive-site.xml中增加以下配置
<property>
<name>hbase.zookeeper.quorum</name>
<value>master:2181,slave1:2182,slave2:2183</value>
</property>
<property>
<name>hive.aux.jars.path</name>
<value>file:///cdh550/hive/lib/hive-hbase-handler-1.1.0-cdh5.5.0.jar,file:///cdh550/hive/lib/hbase-common-1.0.0-cdh5.5.0.jar,file:///cdh550/hive/lib/hbase-server-1.0.0-cdh5.5.0.jar,file:///cdh550/hive/lib/hbase-client-1.0.0-cdh5.5.0.jar,file:///cdh550/hive/lib/hbase-protocol-1.0.0-cdh5.5.0.jar,file:///cdh550/hive/lib/zookeeper-3.4.5-cdh5.5.0.jar</value>
</property>
3、启动Hive服务端
ohup hive --service metastore > metastore.log
ohup hive --service hiveserver2>hiveserver2.log
4、启动hive客户端
hive [-hiveconf hive.root.logger=DEBUG,console]
CREATE EXTERNAL TABLE hive_hbase_1(keystring, value string)
STORED BY'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES("hbase.columns.mapping" = "c1:d1")
TBLPROPERTIES("hbase.table.name"= "platjava_test_20170401", "hbase.mapred.output.outputtable"= " platjava_test_20170401")
--hbase.columns.mapping指向对应的列族;多列时,data:1,data:2;多列族时,data1:1,data2:1;
--hbase.table.name指向对应的表;hbase_table_2(keystring, value string),这个是关联表。
注意:
建表或映射表的时候如果没有指定:key则第一个列默认就是行键
HBase对应的Hive表中没有时间戳概念,默认返回的就是最新版本的值
由于HBase中没有数据类型信息,所以在存储数据的时候都转化为String类型
CREATE TABLE hbase_table_1(key int, valuestring)
STORED BY'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES("hbase.columns.mapping" = ":key,cf1:val")
TBLPROPERTIES ("hbase.table.name"= "xyz", "hbase.mapred.output.outputtable" ="xyz")
hbase.table.name:参数是可选的,是Hbase可识别的名字,如果不设置则和Hive表名一致;
在Hive中创建的和Hbase整合的表不支持load data导入数据,需要在Hive中创建中间表导入数据后采用insert方式导入数据。
例:INSERTOVERWRITE TABLE hbase_table_1 SELECT * FROM pokes WHERE foo=98
当有大量数据导入Hbase时,建议将WAL关闭:sethive.hbase.wal.enabled=false
FAILED: Execution Error, return code 1 fromorg.apache.hadoop.hive.ql.exec.DDLTask. java.lang.RuntimeException: MetaException(message:org.apache.hadoop.hive.serde2.SerDeExceptionorg.apache.hadoop.hive.hbase.HBaseSerDe: columns has 1 elements whilehbase.columns.mapping has 2 elements (counting the key if implicit))
在创建hive/hbase相关联的表时,hbase表结构默认会有一个字段key,如果没有一个显示的字段'key'那么在创建表时,会自己创建,这样hive对应的表就会出现问题,所以在hive对应的表里一定要加上key这个字段,为了避免这个问题,在hbase表结构里可以显示的添加'key'字段,这样不容易出问题。
1、 Hive SQL在执行过程中是否会对Hbase的实时数据读写造成影响?(不考虑主机资源情况下)
2. 如何提升hive脚本的map数
一、 控制hive任务中的map数:
1. 通常情况下,作业会通过input的目录产生一个或者多个map任务。
主要的决定因素有: input的文件总个数,input的文件大小,集群设置的文件块大小(目前为128M, 可在hive中通过set dfs.block.size;命令查看到,该参数不能自定义修改);
2. 举例:
a) 假设input目录下有1个文件a,大小为780M,那么hadoop会将该文件a分隔成7个块(6个128m的块和1个12m的块),从而产生7个map数
b) 假设input目录下有3个文件a,b,c,大小分别为10m,20m,130m,那么hadoop会分隔成4个块(10m,20m,128m,2m),从而产生4个map数
即,如果文件大于块大小(128m),那么会拆分,如果小于块大小,则把该文件当成一个块。
3. hue/oozie 调度shell执行hive脚本
前面已经有篇文章介绍如何编译包含hive的spark-assembly.jar了,不清楚的可以翻看一下前面的文章。clouderamanager装好的spark,直接执行spark-shell进入命令行后,写入如下语句:valhiveContext=neworg.apache.spark.sql.hive.HiveContext(sc)你会发现没法执行通过,因为cm装的原生的spark是不支持sparkhql的,我们需要手动进行一些调整:第一步,将编译好的包含hive的JAR包上传到hdfs上配置的默认的spark的sharelib目录:/user/spark/share/lib第二步:在你要运行spark-shell脚本的节点上的/opt/cloudera/parcels/CDH-5.3.0-1.cdh5.3.0.p0.30/lib/spark/lib/目录下面,下载这个jar到这个目录:hadoopfs-gethdfs://n1:8020/user/spark/share/lib/spark-assembly-with-hive-maven.jar(具体路径替换成你自己的)。然后这个目录下面原来会有个软链接spark-assembly.jar指向的是spark-assembly-1.2.0-cdh5.3.0-hadoop2.5.0-cdh5.3.0.jar,我们把这个软链接删除掉重新创建一个同名的软链接:ln-sspark-assembly-with-hive-maven.jarspark-assembly.jar,指向我们刚下载下来的那个JAR包,这个JAR包会在启动spark-shell脚本时装载到driverprogram的classpath中去的,sparkContext也是在driver中创建出来的,所以需要将我们编译的JAR包替换掉原来的spark-assembly.jar包,这样在启动spark-shell的时候,包含hive的spark-assembly就被装载到classpath中去了。第三步:在/opt/cloudera/parcels/CDH/lib/spark/conf/目录下面创建一个hive-site.xml。/opt/cloudera/parcels/CDH/lib/spark/conf目录是默认的spark的配置目录,当然你可以修改默认配置目录的位置。hive-site.xml内容如下:hive.metastore.localfalsehive.metastore.uristhrift://n1:9083hive.metastore.client.socket.timeout300hive.metastore.warehouse.dir/user/hive/warehouse这个应该大家都懂的,总要让spark找到hive的元数据在哪吧,于是就有了上面一些配置。第四步:修改/opt/cloudera/parcels/CDH/lib/spark/conf/spark-defaults.conf,添加一个属性:spark.yarn.jar=hdfs://n1:8020/user/spark/share/lib/spark-assembly-with-hive-maven.jar。这个是让每个executor下载到本地然后装载到自己的classpath下面去的,主要是用在yarn-cluster模式。local模式由于driver和executor是同一个进程所以没关系。以上完事之后,运行spark-shell,再输入:valhiveContext=neworg.apache.spark.sql.hive.HiveContext(sc)应该就没问题了。我们再执行一个语句验证一下是不是连接的我们指定的hive元数据库:hiveContext.sql("showtables").take(10)//取前十个表看看最后要重点说明一下这里的第二步第三步和第四步,如果是yarn-cluster模式的话,应该替换掉集群所有节点的spark-assembly.jar集群所有节点的sparkconf目录都需要添加hive-site.xml,每个节点spark-defaults.conf都需要添加spark.yarn.jar=hdfs://n1:8020/user/spark/share/lib/spark-assembly-with-hive-maven.jar。可以写个shell脚本来替换,不然手动一个一个节点去替换也是蛮累的。
4. hive SQL里面如何调用shell脚本
hive sql && maprece job
你的采纳是我前进的动力,记得好评和采纳,答题不易,互相帮助,
手机提问的朋友在客户端右上角评价点满意即可.
5. shell脚本里如何保存hive的结果
比如mysql xxx -e "select * from table">file 写入文件
hive只要有终端命令都可以保存
6. 如何hadoop 看hive执行日志
Hadoop archive 唯一的优势可能就是将众多的小文件打包成一个har 文件了,那这个文件就会按照dfs.block.size 的大小进行分块,因为hdfs为每个块的元数据大小大约为150个字节,如果众多小文件的存在(什么是小文件内,就是小于dfs.block.size 大小的文件,这样每个文件就是一个block)占用大量的namenode 堆内存空间,打成har 文件可以大大降低namenode 守护节点的内存压力。但对于MapRece 来说起不到任何作用,因为har文件就相当一个目录,仍然不能讲小文件合并到一个split中去,一个小文件一个split ,任然是低效的,这里要说一点<<hadoop 权威指南 中文版>>对这个翻译有问题,上面说可以分配到一个split中去,但是低效的。
既然有优势自然也有劣势,这里不说它的不足之处,仅介绍如果使用har 并在hadoop中更好的使用har 文件
首先 看下面的命令
hadoop archive -archiveName 20131101.har /user/hadoop/login/201301/01 /user/hadoop/login/201301/01
我用上面的命令就可以将 /user/hadoop/login/201301/01 目录下的文件打包成一个 20131101.har 的归档文件,但是系统不会自动删除源文件,需要手动删除
hadoop fs -rmr /user/hadoop/login/201301/01/*.*.* 我是用正则表达式来删除的,大家根据自己的需求删除原始文件
7. 如何在shell脚本中判断hive已经执行完毕
举个例子,执行一条基本语句建立一个文件 #!/bin/bashtouch test.txtif [ $? -eq 0 ]then echo "执行成功"else echo "执行失败"fi$?可以判断上一条命令是否成功,成功为0,不成功为非0
8. 如何通过脚本的方法,批量执行hive sql语句
操作方法如下:
把SQL语句写成存储过程,这样以后每次只需要调用存储过程就行了
9. python如何增量读取hive数据,每次执行脚本把上次的结果做基准,打印出新增的部分
1.读取文本文件数据(.txt结尾的文件)或日志文件(.log结尾的文件)list0与list1分别为文档中的第一列数据与第二列数据。
10. hadoop hive 操作 是封装在shell脚本好还是java中好
其实把hive做到shell里面最大的优势是可以定时执行,比如之前做一个论坛用户日志分析的时候,需要定时对hive导入数据,并在hive里面对数据做预处理,最后把hive处理的数据导入到hbase中 这样的实现起来用java显然就没有用shell有优势,因为shell写好了丢那 执行linux定时任务就好了,但是shell有个明显的缺陷就是不灵活,不能根据需求和功能做灵活调用,这时候做到java里面就比用shell写死的好很多,比如做即时需求,点某个功能按键的时候就需要跑hive,明显就是java更好嘛