文件/RDBMS -> flume/sqoop -> HDFS -> Hive -> HDFS -> Sqoop -> RDBMS

其中,本文实现了

  • 使用 sqoop 从 RDBMS 中读取数据(非Oozie实现,具体错误将在本文最后说明)
  • 从 Hive 处理数据存储到 HDFS
  • 使用 sqoop 将 HDFS 存储到 RDBMS 中\

1.复制一个 sqoop example,拷贝 hive-site.xml 文件,拷贝 mysql 依赖包到 lib 目录下

2.增加 sqoop-import.sql 文件用以从 RDBMS 读取数据到 Hive 中

--connect
jdbc:mysql://cen-ubuntu:3306/test
--username
root
--password
ubuntu
--table
user
--hive-database
default
--hive-table
import_from_mysql
--hive-import
--hive-overwrite
--delete-target-dir

3.增加 select.sql 用于使用 Hive 处理数据导出到 HDFS 中(注意说明输出分隔符)

insert overwrite directory '/user/cen/oozie-apps/sqoop2hive2sqoop/output/' ROW format delimited fields terminated by ',' select id,name from default.import_from_mysql;

4.增加 sqoop-export.sql 用于使用 sqoop 将 HDFS 文件导入到 RDBMS 中

--connect
jdbc:mysql://cen-ubuntu:3306/test
--username
root
--password
ubuntu
--table
export_from_hdfs
--export-dir
/user/cen/oozie-apps/sqoop2hive2sqoop/output/
--fields-terminated-by
','

5.修改 job.properties 文件

nameNode=hdfs://cen-ubuntu.cenzhongman.com:8020
jobTracker=localhost:8032
queueName=default
oozieAppsRoot=oozie-apps oozie.use.system.libpath=true oozie.wf.application.path=${nameNode}/user/cen/${oozieAppsRoot}/sqoop2hive2sqoop/
outputDir=sqoop2hive2sqoop/output

6.修改 workflow.xml 文件

<workflow-app xmlns="uri:oozie:workflow:0.5" name="sqoop2hive2sqoop-wf">
<start to="hive-node"/> <action name="hive-node">
<hive xmlns="uri:oozie:hive-action:0.5">
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<prepare>
<delete path="${nameNode}/user/cen/${oozieAppsRoot}/${outputDir}"/>
</prepare>
<job-xml>${nameNode}/user/cen/${oozieAppsRoot}/sqoop2hive2sqoop/hive-site.xml</job-xml>
<configuration>
<property>
<name>mapred.job.queue.name</name>
<value>${queueName}</value>
</property>
</configuration>
<script>select.sql</script>
</hive>
<ok to="sqoop-export-node"/>
<error to="hive-fail"/>
</action> <action name="sqoop-export-node">
<sqoop xmlns="uri:oozie:sqoop-action:0.3">
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<configuration>
<property>
<name>mapred.job.queue.name</name>
<value>${queueName}</value>
</property>
</configuration>
<command>export --options-file sqoop-export.sql</command>
<file>${nameNode}/user/cen/${oozieAppsRoot}/sqoop2hive2sqoop/sqoop-export.sql#sqoop-export.sql</file>
</sqoop>
<ok to="end"/>
<error to="sqoop-export-fail"/>
</action> <kill name="hive-fail">
<message>hive failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
</kill>
<kill name="sqoop-export-fail">
<message>Sqoop export failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
</kill>
<end name="end"/>
</workflow-app>

注意事项

  • 各个 action 节点的版本号
  • 用到文件拷贝,请使用 file 属性
  • Hive 的配置文件不能忘记

7.上传文件到 HDFS 上

8.执行 sqoop 从 MySQL 中读取数据到 Hive 中(此处出现错误 could not load org.apache.hadoop.hive.conf.HiveConf.Make sure HIVE_CONF_DIR is set corretly.原因及解决请看 注2 )

bin/sqoop import --options-file /opt/cdh5.3.6/oozie-4.1.0-cdh5.12.0/oozie-apps/sqoop2hive2sqoop/sqoop-import.sql

9.检查 Hive 中是否已经存在数据,并执行 Oozie

export OOZIE_URL=http://cen-ubuntu:11000/oozie/
bin/oozie job --config /opt/cdh5.3.6/oozie-4.1.0-cdh5.12.0/oozie-apps/sqoop2hive2sqoop/job.properties -run

10.检查程序执行 Wordflow 和 MySQL 中的输出结果

注1:使用 Oozie 通过 sqoop import to hive 执行失败(同样的程序,本地执行成功),但日志无输出,此处贴出完整 wordflow.xml 文件仅供参考

<workflow-app xmlns="uri:oozie:workflow:0.5" name="sqoop2hive2sqoop-wf">
<start to="sqoop-import-node"/> <action name="sqoop-import-node">
<sqoop xmlns="uri:oozie:sqoop-action:0.3">
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<configuration>
<property>
<name>mapred.job.queue.name</name>
<value>${queueName}</value>
</property>
</configuration>
<command>import --options-file sqoop-import.sql</command>
<file>${nameNode}/user/cen/${oozieAppsRoot}/sqoop2hive2sqoop/sqoop-import.sql#sqoop-import.sql</file>
</sqoop>
<ok to="hive-node"/>
<error to="sqoop-import-fail"/>
</action> <action name="hive-node">
<hive xmlns="uri:oozie:hive-action:0.5">
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<prepare>
<delete path="${nameNode}/user/cen/${oozieAppsRoot}/${outputDir}"/>
</prepare>
<job-xml>${nameNode}/user/cen/${oozieAppsRoot}/sqoop2hive2sqoop/hive-site.xml</job-xml>
<configuration>
<property>
<name>mapred.job.queue.name</name>
<value>${queueName}</value>
</property>
</configuration>
<script>select.sql</script>
</hive>
<ok to="sqoop-export-node"/>
<error to="hive-fail"/>
</action> <action name="sqoop-export-node">
<sqoop xmlns="uri:oozie:sqoop-action:0.3">
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<configuration>
<property>
<name>mapred.job.queue.name</name>
<value>${queueName}</value>
</property>
</configuration>
<command>export --options-file sqoop-export.sql</command>
<file>${nameNode}/user/cen/${oozieAppsRoot}/sqoop2hive2sqoop/sqoop-export.sql#sqoop-export.sql</file>
</sqoop>
<ok to="end"/>
<error to="sqoop-export-fail"/>
</action> <kill name="sqoop-import-fail">
<message>Sqoop import failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
</kill>
<kill name="hive-fail">
<message>hive failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
</kill>
<kill name="sqoop-export-fail">
<message>Sqoop export failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
</kill>
<end name="end"/>
</workflow-app>

原因剖析:错误出现在 sqoop-import-node

  • 找不到 hive 配置文件,尝试 (1):如 hive-node 一样增加说明 --> 无效 尝试(2):在 sqoop-import.sql 中增加 --hive-home /opt/xxx/xxx/xxx --> 无效 尝试(3):修改conf/cation-conf/hive.xml --> 并未配置
  • 无法从本地的 sqoop 执行 Hive ? ? 有机会再探索

注2:执行 sqoop 过程出现错误could not load org.apache.hadoop.hive.conf.HiveConf.Make sure HIVE_CONF_DIR is set corretly.

  • 原因:系统使用了变量$HADOOP_CLASSPATH 但本机未定义

  • 解决:增加用户环境变量~/.bash_profile

    export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:/opt/cdh5.3.6/hive-1.1.0-cdh5.12.0/lib/*

详情请参考

Oozie 配合 sqoop hive 实现数据分析输出到 mysql的更多相关文章

  1. [转]云计算之hadoop、hive、hue、oozie、sqoop、hbase、zookeeper环境搭建及配置文件

     云计算之hadoop.hive.hue.oozie.sqoop.hbase.zookeeper环境搭建及配置文件已经托管到githubhttps://github.com/sxyx2008/clou ...

  2. 将Hive统计分析结果导入到MySQL数据库表中(一)——Sqoop导入方式

    https://blog.csdn.net/niityzu/article/details/45190787 交通流的数据分析,需求是对于海量的城市交通数据,需要使用MapReduce清洗后导入到HB ...

  3. Sqoop是一款开源的工具,主要用于在HADOOP(Hive)与传统的数据库(mysql、oracle...)间进行数据的传递

    http://niuzhenxin.iteye.com/blog/1706203   Sqoop是一款开源的工具,主要用于在HADOOP(Hive)与传统的数据库(mysql.postgresql.. ...

  4. oozie调度sqoop Job 数据库密码无法保存

    问题描述 通过oozie调度sqoop作业时,需要输入数据库作业密码,但在sqoop元数据服务配置密码后,过一段时间会失效. 解决方法 将数据库密码写入HDFS文件,通过配置Sqoop job,实现传 ...

  5. oozie调度sqoop脚本时操作符号替换

    oozie调度sqoop脚本时,sqoop中使用的sql查询语句,需要使用以下字符串替换操作符,否则会出现各种诡异的错误: //替换字符 < < Less than 小于 > > ...

  6. Hive中如何添加自定义UDF函数以及oozie中使用hive的自定义函数

    操作步骤: 1. 修改.hiverc文件 在hive的conf文件夹下面,如果没有.hiverc文件,手工自己创建一个. 参照如下格式添加: add jar /usr/local/hive/exter ...

  7. HUE中Oozie执行Sqoop

    Oozie执行Sqoop,传入参数(注意,在使用--query时,参数中一定不要带有空格,否则出错)1. 新建一个workflow 2. 拖入一个sqoop 3. sqoop抽取命令如下(建议先在命令 ...

  8. Oozie 之 sqoop 实战

    1.创建 lib 目录并拷贝 mysql 支持包 2.修改 job.properties 文件 nameNode=hdfs://cen-ubuntu.cenzhongman.com:8020 jobT ...

  9. Sqoop hive导出到mysql[转]

    通过Sqoop将Hive表数据导入到MySQL通常有两种情况. 第一种是将hive上某张表的全部数据导入到mysql对应的表中. 第二种是将hive上某张表中的部分数据导入到mysql对应的表中. 两 ...

随机推荐

  1. May 18th 2017 Week 20th Thursday

    The greater the struggle, the more glorious the triumph. 挑战愈艰巨,胜利愈辉煌. Sometimes it would be better t ...

  2. CRM中间件里的发布-订阅者模式

    从事务码SMW01里能观察到一个BDOC可能被发送往不止一个目的site去,比如下图所示的5个site都会收到该site,而高亮显示的SMOF_ERPSITE代表ERP系统QI3的client 504 ...

  3. Android(java)学习笔记37:String类型的面试题

    1. String类型面试题: package cn.itcast_02; /* * String s = new String(“hello”)和String s = “hello”;的区别? * ...

  4. gluon 实现线性回归

    from mxnet import autograd, nd num_inputs = 2 num_examples = 1000 true_w = [2,-3.4] true_b = 4.2 fea ...

  5. Oracle文本导入器

    将文本格式化为Tab分隔的数据行,可以用Excel搞定 如果新增列需要从前面的列获取数据,比如用身份证号计算年龄 需要保证新增列在导入的文件中实际存在列,否则无法使用相对位置和绝对位置进行取值 相对位 ...

  6. AQS(一) 对CLH队列的增强

    基本概念 AQS(AbstractQueuedSynchronizer),顾名思义,是一个抽象的队列同步器. 它的队列是先进先出(FIFO)的等待队列 基于这个队列,AQS提供了一个实现阻塞锁的机制 ...

  7. 【洛谷P1774】最接近神的人

    最接近神的人_NOI导刊2010提高(02) 用类似于桶的方法,树状数组记录原序列的某位置之前已经插入了多少个数, 插入时树状数组单点加1即可 先排一遍序,从大到小插入所有数在原序列的位置, 统计每次 ...

  8. 【题解】洛谷P2607【ZJOI2008】骑士

    洛谷P2607:https://www.luogu.org/problemnew/show/P2607 一道毒瘤的环基树问题 第一次做环基树的题目 刚看题目的时候觉得不就是跟没有上司的舞会一样嘛 然后 ...

  9. sql字段为datetime,插入''的时候默认为1900年

    Microsoft SQL Server Database Engine 用两个 4 字节的整数内部存储 datetime 数据类型的值. 第一个 4 字节存储“基础日期”(即 1900 年 1 月  ...

  10. Javascript文件中的控制器II

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...