HIVE Streaming小结

Flink1.11 streaming写入hive踩坑 1,踩坑的地方,可能是依赖冲突: 在开始执行代码的时候发现报错是缺少ORC的依赖,所以导致添加了部分依赖,导致程序执行结果跟预想不一样 2,不熟悉具体API导致 3,都是idea本地执行的代码,还没在集群测试。 POM文件,干净版本: <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-json</artifactId> &. 阅读详情

HIVE中的查询可以结合使用非java语言的脚本(比如shell、python、perl等),达到另一种处理数据的方式。

下面通过自己亲自实践的测试程序说明Streaming的常见用法:

(1)恒等变换
(2)改变类型
(3)投影变换
(4)操作转换
(5)使用分布式内存
(6)CLUSTER BY、DISTRIBUTE BY、SORT BY
(7)计算cogroup

Streaming

HIVE是通过利用或扩展Hadoop的组件功能来运行的,常见的抽象有InputFormat、OutputFormat、Mapper、Reducer,还包含一些自己的抽象接口,例如SerializerDeserializer(SerDe)、用户自定义函数(UDF)和StorageHandlers。

这些组件都是java组件,不过hive将这些复杂的底层实现隐藏起来了,而提供给用户通过SQL语句执行的方式,而不是使用java代码。

Streaming 提供了另一种处理数据的方式。在streaming job中,Hadoop StreamingAPI会为外部进程开启一个I/O管道。然后数据会被传给这个进程,然后数据从标准输入中读取数据,然后通过标准输出来写结果数据,最后返回到Streaming API  job。尽管HIVE并没有直接使用Hadoop的StreamingAPI,不过他们的工作方式是一致的。

这种管道计算模型对于Unix操作系统以及其衍生系统,如Linux和Mac OS  X的用户来说是非常熟悉的。

提示:

Streaming的执行效率通常会比对应的编写UDF或改写InputFormat对象的方式要低。管道中的序列化和反序列化数据通常是低效的。而且以通常的方式很难调试整个程序。不过,对于快速原型设计和支持非java编写的已有的代码是非常有用的。对于那些不想写java代码的HIVE用户来说,这也是一个高效的方式。

HIVE中提供了多个语法来使用Streaming,包括:MAP()、REDUCE()、TRANSFORM()。

需要注意的是,MAP()实际上并非可以强制在map阶段执行Streaming,同样REDUCE()实际上并非可以强制在reduce阶段执行Streaming,所以推荐使用TRANSFORM(),这样可以避免误导读者对查询语句产生疑惑。

对于我们的Streaming例子,将使用一个表名为a的小表,其中有两个字段,分别是col1和 col2,它们都是INT类型的,表中有2行数据:

hive> create table a (col1 int,col2 int)
    > row format delimited fields terminated by '\t';

hive> insert into a values (4,5);
hive> insert into a values (3,2);

(1)恒等变换

最基本的Streaming job就是恒等运算。/bin/cat 这个shell命令可以将传递它的数据直接输出,所以满足恒等运算。本例中,/bin/cat 这个shell假定已经安装到所有的TaskTracker节点了。实际上任意的Linux系统都会包含这个脚本的!稍后,我们将展示一些程序没有安装到集群中时,通过hive如何将这些程序“加载”到集群中。

hive> select transform (col1,col2)
    > using '/bin/cat' as newa,newb
    > from default.a;

注意:transform 的参数字段名必需和实际定义的一致,否则会报错:


正确执行结果:

(2)改变类型

TRANSFORM返回的字段的数据类型默认是字符串类型的。不过可以通过如下语法将类型转换为其他数据类型:

hive> select transform (col1,col2)
    > using '/bin/cat' as (newa int,newb double) from a;


(3)投影变换

Streaming中可以使用cut命令提取或者映射出特定的字段。换句话说,可以达到和select相同的效果:

hive> select transform (col1,col2)
    > using '/bin/cut -f1'
> as newa,newb from a;

可以注意到,上面的例子中,查询从外部处理过程中返回的只有一个字段,而实际期望的是两个字段,因此字段newb的值总是null。默认情况下,TRANSFORM需要两个字段,不过实际上可以为比其小的任意个字段:

hive> select transform (col1,col2)
    > using '/bin/cut -f1'
    > as newa from a;

(4)操作转换

/bin/sed 程序是一个 流编辑器,其可以接受输入数据流,然后按照用户的指定进行编辑,最后将编辑后的结果到输出数据流中。如下面的例子,将字符串“4”替换为字符串“10”:

hive> select transform (col1,col2)
    > using '/bin/sed s/4/10/'
    > as newa,newb from a;

(5)使用分布式内存

到目前为止所列举的Streaming例子都是UNIX系统或其衍生系统自带的如cat或sed这样的系统脚本程序。当一个查询所需要的文件没有在每个TaskTracker上事先安装好时,用户需要使用分布式缓存将数据或者程序传输到集群中,然后在job完成后会清理掉这些缓存的数据和文件。(Hadoop的分布式缓存可以对缓存内的文件按照LRU原则进行删除,因此并非是job一结束就立即删除)。

这个功能非常有用,因为在大规模集群上安装或者卸载大量的小组件会成为一件很有负担的事情。同时,缓存中会独立保存每个job的缓存文件,而不会相互干扰。

下面是一个将摄氏度转换为华氏温度的shell程序脚本:

#!/bin/bash

while read LINE
do
  res=$(echo "scale=2;((9/5) * $LINE ) + 32" | bc)
  echo $res
done

可以在本地测试脚本,脚本不会提示输入,输入100,然后按回车键,这时这个进程会通过标准输出打印出 212.00;输入拎一个值,会得到另一个相应的结果。用户可以持续的输入数值,也可以通过 Ctrl +D终止输入:


HIVE的ADD FILE功能可以将文件加入到分布式缓存中。而被增加的文件会被存储到每个task节点机器的当前工作目录下。这样可以使得transform task直接使用脚本而不用确定到哪里去找这些文件:

首先把本地脚本放到hive的根目录下(每个人的配置可能不同):

[root@localhost shell_test]# cp ctof.sh /root

然后可以直接使用“相对路径”的分布式文件执行脚本:

hive> add file ${env:HOME}/ctof.sh;

hive> select transform (col1)  using 'ctof.sh' as convert from a;

笔者在实际测试上面的例子中,遇到下面错误:


最后解决方案是,在根目录下(root)中,发现sh脚本没有可执行权限,所以增加+x可执行权限:

增加执行权限之后,测试程序可以正确运行。(下面的测试python脚本程序同理)

(6)CLUSTER BY、DISTRIBUTE BY、SORT BY

Hive提供了语法来控制数据是如何被分发和排序的。这些功能可以应用在大多数的查询中,不过在处理Streaming时显得特别有用。例如,具有相同键的数据需要分发到同一个处理节点中,或者数据需要按照指定的列或者指定函数进行排序。hive提供了多种方式来控制这种行为。

第一种控制方式就是cluster by 语句,其可以保证类似的数据可以分发到同一个reduce task中,而且保证数据是有序的。

为了演示cluster by的用法,我们使用一个特殊的例子:通过另一种方式来实现Word Count算法。现在,我们使用transform功能和2个python脚本,一个脚本用于将读取的每行内容分割为单词,另一个脚本用于接收字频数据流以及单词的中间计数值,然后对每个单词的次品求和汇总。

下面是第一个python脚本,其可以按照空格将每行内容分割为单词:

mapper.py(注意要增加可执行权限,同上面的ctof.sh文件)

import sys

for line in sys.stdin:
words = line.strip().split()
for word in words:
    print “%s\t1” %(word.lower())

这个脚本从通用模块sys中引入常见的函数,然后循环获取“标准输入流”中的每行数据,然后按照空格划分每行的单词,生成一个单词集words,然后遍历整个集合并输出每个单词和对应的词频。

在展示第二个脚本之前,我们边讨论下传递给这个脚本的数据。我们的transform  hive查询中,我们将对第一个脚本的输出词组使用cluster by 。这样可以将所有相同的单词分配到同一个组中,每行一对数据,每对的数据形式是单词\t次数:

word1	1
word1	1
word1	1
word1	1
…

因此第二个脚本会复杂些,因为其需要缓存当前处理的单词,以及迄今为止这个单词出现的次数。当处理下一个单词时,这个脚本需要输出上一个单词的频数,然后重置缓存。

 

下面是第二个脚本:

reducer.py(同样注意执行权限)

import sys
 
(last_key,last_count) = (None,0)
for line in sys.stdin:
(key,count) = line.strip().split(“\t”)
if last_key and last_key != key:
   print “%s\t%d” % (last_key,last_count)
   (last_key,last_count) = (key,int(count))
else:
    last_key = key
last_count += int(count) 
if last_key:
    print “%s\t%d” % (last_key,last_count)

不妨先看一下第一个脚本的执行结果:

hive  > select transform (line) using '${env:HOME}/mapper.py'
      > as word,count from docs;

执行完整的hive查询,并将结果存入word_count结果表中:


using语句指定了python脚本的绝对路径。

替代cluster by 的最方便的方式就是使用 distribute by 和sort by ,使用它们的常用场景是:用户希望将数据按照某个字段划分,然后按另一个字段排序。

实际上cluster by word等价于distribute by word sort by word asc。

如下面的程序就是按照降序排序:

from 
     (from docs
     select transform (line) using '${env:HOME}/mapper.py'
     as word,count
     distribute by word sort by word desc) wc
     insert overwrite table word_count
     select transform (wc.word,wc.count) using '${env:HOME}/reducer.py'
     as word ,count;

可以对比和cluster by word执行的结果。

world   1
word    2
hello   3
count   1

对比之前cluster by 的结果:

count   1
hello   3
word    2
world   1


使用cluster by 或者使用结合sort by 的distribute by是非常重要的,因为如果没有这些指示,hive可能无法合理的并行执行job,所有的数据可能都会分发到同一个reducer上,这样会导致整体job执行时间延长。

如果没有指定cluster by 或者使用结合sort by 的distribute by,那么最后的结果是不正确的:

from 
     (from docs
     select transform (line) using '${env:HOME}/mapper.py'
     as word,count
     ) wc
     insert overwrite table word_count
     select transform (wc.word,wc.count) using '${env:HOME}/reducer.py'
     as word ,count;

可以对比一下两者的查询日志信息:

对比日志信息可以发现,没有reduce过程。

通常情况下,使用Streaming是为了将非java代码结合到hive中。使用java编写Streaming也是可以的,Hive中包含了GenericMR API 来试图为Streaming提供类似于MapReduce API的接口。

(7)计算cogroup

在MapReduce程序中,经常会对多数据进行join连接处理,然后使用transform进行处理。使用union all和cluster by,我们可以实现cogroup by操作的常见效果。

假设我们有多个不同源的日志文件,它们具有相同的schema。我们希望将它们合并起来,然后通过一个reduce_script进行分析:(这仅是一个模板)

from(
from(
       from log1 o1
       select o1.id,o1.order_id ……
       union all
       from log2 o2
select o2.id,o2.order_id ……
) union_msg
select  union_msg.id, union_msg.order_di ….
cluster by union_msg.id
) map
insert overwrite table log_analysis
select transform(map.id,map.order_id…) using ‘reduce_script’
as (id,order_id …);




参考资料:《Hive编程指南》












spark streaming消费kafka的数据 并写入HDFS和直接写hive表 (scala版本) 首先我消费的kafka的数据的类型为json类型数据 话不多说直接上代码 pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"&gt. 阅读详情

相关推荐

数仓工具—Hive streaming(10)

streaming 提供了另一种处理数据的方式。在streaming job中,Hadoop StreamingAPI会为外部进程开启一个I/O管道。然后数据会被传给这个进程,然后数据从标准输入中读取数据,然后通过标准输出来写结果数据,最后返回到Streaming API job。尽管HIVE并没有直接使用Hadoop的StreamingAPI,不过他们的工作方式是一致的。这种管道计算模型对于Unix操作系统以及其衍生系统,如Linux和Mac OS X的用户来说是非常熟悉的。

5万+

hive java streaming_Hive Streaming

1.Hive Streaming介绍在前面我们看到了UDF、UDTF、UDAF的实现并不是很简单,而且还要求对Java比较熟悉,而Hive设计的初衷是方便那些非Java人员使用。因此,Hive提供了另一种数据处理方式——Streaming,这样就可以不需要编写Java代码了,其实Streaming处理方式可以支持很多语言。但是,Streaming的执行效率通常比对应编写的UDF或改写InputFo...

weixin_39572316的博客 242

streamsets精简版01

大数据迁移工具,可以让市面上几乎所有主流的数据库连接进行数据迁移,共3份压缩文件太大分批上传

HiveStreaming使用笔记

HiveStreaming使用笔记HiveStreaming作用HiveStreaming使用要求HiveStreaming API 使用补充说明 HiveStreaming作用 hive传统的数据导入方式是批量导入,HiveStreaming支持流式数据导入。比如说从kafka批量中连续不断的导入数据到hive表中,传统的导入方式难以胜任该需求。 HiveStreaming使用要求 Hive...

weixin_43172032的博客 2343

hive Hcatalog streaming API使用

hive streaming hive传统的数据导入采用批量导入的方式,这中数据导入难以满足实时性的要求。hive streaming提供了数据流式写入的API,这样外部数据可以连续不断的写入hive中。 必备条件 hive streaming 需要配合hive 事务表使用,表的数据存储格式式必须为 orc 在 hive-site.xml 中设置如下参数以支持hive事务表hive.txn.manager =org.apache.hadoop.hive.ql.lockmgr.DbTxnManager hive.compactor.initiator.on = true (See more im

解决linux 2.5G网卡驱动问题

解决linux 2.5G网卡驱动问题 关键词:2.5G网卡驱动,ubuntu,安装,2.5G Ethernet LINUX driver,Realtek网卡驱动 由于2.5G网卡较新,各linux发行版的通用驱动已不适用,新装的系统会出现无法上网问题,由于国内网络环境去Realtek官网很难下载到驱动文件,故本文提供github上的2.5G Ethernet LINUX driver r8125 for kernel up to 5.6的版本驱动文件r8125-9.003.05.tar.bz2各位可以自

poorguy_aos的博客 1万+

Hive之——Streaming

转载请注明出处:https://blog.youkuaiyun.com/l1028386804/article/details/88624013 Hive中提供了多个语法来使用streaming,包括:MAP()、REDUCE()和TRANSFORM()。要注释的是MAP()实际上并非可以强制在map阶段执行streaming,正如reduce并非可以强制在reduce阶段执行streaming。因为这个原...

冰河的专栏 1782

FPGA实战:手把手教你实现雷达信号数字下变频(DDC)完整流程

本文提供了一份完整的FPGA实现雷达信号数字下变频(DDC)的实战指南。内容涵盖从Matlab行为级仿真到FPGA硬件实现的完整闭环流程,详细讲解了数字混频、滤波、抽取等核心步骤,并分享了基于Vivado的IP核配置、数据位宽量化及资源优化等关键工程实践经验,旨在帮助读者掌握DDC系统的硬件实现与调试。

dog123的博客 341

Hive Streaming

1.Hive Streaming介绍 在前面我们看到了UDF、UDTF、UDAF的实现并不是很简单,而且还要求对Java比较熟悉,而Hive设计的初衷是方便那些非Java人员使用。因此,Hive提供了另一种数据处理方式——Streaming,这样就可以不需要编写Java代码了,其实Streaming处理方式可以支持很多语言。但是,Streaming的执行效率通常比对应编写的UDF或改写Input

GatsbyNewton 5260

Python+Flask+Echarts打造全国气象数据可视化分析大屏

本文详细介绍了如何使用Python+Flask+Echarts构建全国气象数据可视化分析大屏,实现实时监控、趋势分析和快速决策。通过Python强大的数据处理能力、Flask的轻量级优势和Echarts的交互体验,打造高效的气象数据可视化系统,提升农业、物流等行业的决策效率。

weixin_29061531的博客 1060

Node框架之NestJS入门学习

文章主要分为三部分:1 NestJS 与Egg对比2 NestJS 基础知识介绍3 使用NestJS快速搭建应用,实现CURD操作e-link文档Egg官网NestJS 官网NestJS中文文档(非官方)

十九万里的博客 4741

Flink Sql on Zeppelin(6)——Hive Streaming

概述 Flink1.11 在上周二正式release了,在此之前我也给大家分享过了Flink1.11的一些新特性,然后和大家说过这一期会给大家单独说Flink X Hive 本来打算找点数据,然后做一期类似于实时数仓的内容,但是数据不太好找,加上时间、精力有限就简单和大家聊聊吧 在开始之前,大家参考一下Hive Integration,把flink 连接hive所需要的包放到lib目录下 Hive Streaming Sink 先看看官网是怎么描述Hive Streaming Sink的吧 SET

狄杰的博客 1944

freeswitch系列二 kamailio 5.0安装及实现kamailio集成freeswitch

kamailio是个纯粹的SIP服务器。本文介绍先如何在debian8下安装debian5.0,然后详细介绍如何实现使用kamailio做freeswitch均衡负载。kamailio同时实现做为代理服务器、注册服务器、重定向服务器。

不积跬步无以至千里; 不积小流无以成江海 1万+

Spark-Streaming+HDFS+Hive实战

本文介绍了一个实战示例,展示了如何使用Spark Streaming从GBIF接口获取数据并进行处理,然后将处理后的数据保存到HDFS文件系统,并在Hive中创建外部表映射。文章从需求说明开始,详细介绍了使用Spark Streaming、HDFS和Hive的背景知识。接着,文章提供了代码示例,展示了如何编写工具类、实体类和接收器类来实现数据处理和存储。最后,文章展示了如何使用Spark Streaming将数据保存到HDFS,并在Hive中创建外部表映射。

zcs2312852665的博客 1811

3.6KW储能双向逆变器(原理图PCB源码)

通过百度网盘分享的文件:优快云 3.6KW储能双向逆变器 链接:https://pan.baidu.com/s/18NN6KnpywFUIDtAQ4b1LTg?pwd=csdn 提取码:csdn

2401_86562087的博客 2182

动态视频目标追踪系统:基于YOLOv11+DeepSORT的从入门到实战全流程指南

仅保留车辆类别(假设车辆类别ID为2)if det.class_index == 2: # 车辆类别ID通过本指南,你已完成从环境搭建数据准备模型训练到追踪系统与UI界面的全流程,搭建了一套完整的动态视频目标追踪系统。该系统在安防监控、交通管理等场景中具有实用价值,可实现目标的实时稳定追踪。未来,你可尝试结合多模态特征(如目标外观+运动特征)提升追踪鲁棒性,或探索轻量化模型部署(如TensorRT加速),让系统在边缘设备上也能高效运行。

LXY_LOVE36的博客 142

Hive Python Streaming的原理及写法

在Hive中,需要实现Hive中的函数无法实现的功能时,就可以用Streaming来实现。其原理可以理解成:用HQL语句之外的语言,如Python、Shell来实现这些功能,同时配合HQL语句,以实现特殊的功能。 比如,我有一张不同网站访问的日志表,其中有两个列是url和ref,分别代表当前访问的网址和来源地址,我想要查看用户的来源,即看用户都是从那些网站跳到这些网站上去的,这里有些网站可能域名

三分地 4793

2025华为od机试真题B卷【停车场费用统计】Python实现

2025华为od机试真题B卷【停车场费用统计】Python实现

MISAYAONE的博客 535

Spark Streaming 实时写入Hive

一、背景 公司Flume版本过低,使用Flume时有数据丢失问题,但是暂时不方便更新框架。所以使用Spark Streaming替代Flume实现入库Hive功能。 二、流程图 Created with Raphaël 2.2.0kafkaSpark StreamingETLhive 三、代码实现 pom文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"

soldiers_A的博客 1万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Hive函数与Streaming

Hive 允许用户编写自定义函数(UDF)来扩展其功能。以下是使用 Java 编写一个简单的自定义函数的步骤。自定义函数不仅限于简单的字符串操作,还可以实现更复杂的逻辑。例如,编写一个计算两点间距离的函数:java编译并打包后,可以在 Hive 中使用这个 UDF 来计算两点间的距离。Hive Streaming 允许用户实时将数据流式写入到 Hive 表中。这对于需要实时数据处理和分析的场景非常有用,如实时日志分析、实时监控等。

qq_69558236的博客 1190

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Flink x Zeppelin ,Hive Streaming 实战解析

Flink 1.11 正式发布已经三周了,其中最吸引我的特性就是 Hive Streaming。正巧 Zeppelin-0.9-preview2 也在前不久发布了,所以就写了一篇 Zep...

Ververica的博客 770

hive streaming java_hive Streaming

1.Hive Streaming介绍在前面我们看到了UDF、UDTF、UDAF的实现并不是很简单,而且还要求对Java比较熟悉,而Hive设计的初衷是方便那些非Java人员使用。因此,Hive提供了另一种数据处理方式——Streaming,这样就可以不需要编写Java代码了,其实Streaming处理方式可以支持很多语言。但是,Streaming的执行效率通常比对应编写的UDF或改写InputFo...

weixin_39886929的博客 211

hive streaming java_Streaming Data Ingest V2

Starting in release Hive 3.0.0,Streaming Data Ingest is deprecated and is replaced by newer V2 API (HIVE-19205).Hive Streaming APITraditionally adding new data into Hive requires gathering a large am...

weixin_29515393的博客 339

hive json解析_Flink x Zeppelin ,Hive Streaming 实战解析

Flink 1.11 正式发布已经三周了,其中最吸引我的特性就是 Hive Streaming。正巧 Zeppelin-0.9-preview2 也在前不久发布了,所以就写了一篇 Zeppelin 上的 Flink Hive Streaming 的实战解析。本文主要从以下几部分跟大家分享:Hive Streaming 的意义Checkpoint & Dependency写入 Ka...

weixin_39711721的博客 166
上一篇: 一个简单的UDF小程序(HIVE)
ITrue的天空
博客等级 码龄14年 4粉丝 5原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值