分享

企业级数据仓库构建(五):数据仓库项目实战

本帖最后由 hanyunsong 于 2020-9-14 18:10 编辑

问题导读:

1. 电商业务的流程是怎么样的?
2. 电商业务库表结构如何设计?
3. 电商表的同步策略是怎么样的?


上一篇:企业级数据仓库构建(四):数据仓库项目实战


一、电商业务简介

1.1 电商业务流程

20200430210237572.png

1.2 电商常识(SKU、SPU)

SKU=Stock Keeping Unit(库存量基本单位)。现在已经被引申为产品统一编号的简称,每种产品均对应有唯一的 SKU 号

SPU(Standard Product Unit):是商品信息聚合的最小单位,是一组可复用、易检索的标准化信息集合

例如:iPhoneX 手机就是 SPU。一台银色、128G 内存的、支持联通网络的 iPhoneX,就是 SKU

SPU 表示一类商品。好处就是:可以共用商品图片,海报、销售属性等

1.3 电商业务表结构

电商表结构

20200430213221266.png

1.3.1 订单表(order_info)

批注 2020-09-14 114641.png

1.3.2 订单详情表(order_detail)

批注 2020-09-14 114701.png

1.3.3 SKU 商品表(sku_info)

批注 2020-09-14 114727.png

1.3.4 用户表(user_info)

批注 2020-09-14 114759.png

1.3.5 商品一级分类表(base_category1)

批注 2020-09-14 114814.png

1.3.6 商品二级分类表(base_category2)

批注 2020-09-14 114851.png

1.3.7 商品三级分类表(base_category3)

批注 2020-09-14 114915.png

1.3.8 支付流水表(payment_info)

批注 2020-09-14 114937.png

1.3.9 省份表(base_province)

批注 2020-09-14 115017.png

1.3.10 地区表(base_region)

批注 2020-09-14 115049.png

1.3.11 品牌表(base_trademark)

批注 2020-09-14 115110.png

1.3.12 订单状态表(order_status_log)

批注 2020-09-14 115126.png

1.3.13 SPU 商品表(spu_info)

批注 2020-09-14 115157.png

1.3.14 商品评论表(comment_info)

批注 2020-09-14 115240.png

1.3.15 退单表(order_refund_info)

批注 2020-09-14 115327.png

1.3.16 加购表(cart_info)

批注 2020-09-14 115348.png

1.3.17 商品收藏表(favor_info)

批注 2020-09-14 115408.png

1.3.18 优惠券领用表(coupon_use)

批注 2020-09-14 115421.png

1.3.19 优惠券表(coupon_info)

批注 2020-09-14 115439.png

1.3.20 活动表(activity_info)

批注 2020-09-14 115459.png

1.3.21 活动订单关联表(activity_order)

批注 2020-09-14 115521.png

1.3.22 优惠规则表(activity_rule)

批注 2020-09-14 115539.png

1.3.23 编码字典表(base_dic)

批注 2020-09-14 115607.png

1.3.24 活动参与商品表(activity_sku)(暂不导入)

批注 2020-09-14 115625.png

1.4 时间相关表

1.4.1 时间表(date_info)

批注 2020-09-14 115646.png

1.4.2 假期表(holiday_info)

批注 2020-09-14 115715.png

1.4.3 假期年表(holiday_year)

批注 2020-09-14 115752.png

二、业务数据采集模块

20200502093723900.png

2.1 MySQL 安装

MySQL详细安装步骤请点击博客【Linux】MySQL安装

2.2 Sqoop 安装

MySQL详细安装步骤请点击博客【Sqoop】Sqoop入门解析

2.3 业务数据生成

2.3.1 连接 MySQL

通过 MySQL 操作可视化工具 SQLyog 连接 MySQL

2.3.2 建表语句

1)通过 SQLyog 创建数据库 gmall
2)设置数据库编码

20200502094011624.png

3)导入数据库结构脚本(gmall2020-03-16.sql)

2.3.3 生成业务数据

1)在 node01 的 /opt/modules/目录下创建 db_log 文件夹

2)把 gmall-mock-db-2020-03-16-SNAPSHOT.jarapplication.properties 上传到 node01
/opt/module/db_log 路径上

3)根据需求修改 application.properties 相关配置
  1. logging.level.root=info
  2. spring.datasource.driver-class-name=com.mysql.jdbc.Driver
  3. spring.datasource.url=jdbc:mysql://node01:3306/gmall?charac
  4. terEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8
  5. spring.datasource.username=root
  6. spring.datasource.password=hadoop
  7. logging.pattern.console=%m%n
  8. mybatis-plus.global-config.db-config.field-strategy=not_null
  9. #业务日期
  10. mock.date=2020-03-10
  11. #是否重置
  12. mock.clear=1
  13. #是否生成新用户
  14. mock.user.count=50
  15. #男性比例
  16. mock.user.male-rate=20
  17. #收藏取消比例
  18. mock.favor.cancel-rate=10
  19. #收藏数量
  20. mock.favor.count=100
  21. #购物车数量
  22. mock.cart.count=10
  23. #每个商品最多购物个数
  24. mock.cart.sku-maxcount-per-cart=3
  25. #用户下单比例
  26. mock.order.user-rate=80
  27. #用户从购物中购买商品比例
  28. mock.order.sku-rate=70
  29. #是否参加活动
  30. mock.order.join-activity=1
  31. #是否使用购物券
  32. mock.order.use-coupon=1
  33. #购物券领取人数
  34. mock.coupon.user-count=10
  35. #支付比例
  36. mock.payment.rate=70
  37. #支付方式 支付宝:微信 :银联
  38. mock.payment.payment-type=30:60:10
  39. #评价比例 好:中:差:自动
  40. mock.comment.appraise-rate=30:10:10:50
  41. #退款原因比例:质量问题 商品描述与实际描述不一致 缺货 号码不合适 拍错 不想买了 其他
  42. mock.refund.reason-rate=30:10:20:5:15:5:5
复制代码
4)并在该目录下执行,如下命令,生成 2020-03-10 日期数据:
  1. java -jar gmall-mock-db-2020-03-16-SNAPSHOT.jar
复制代码
5)在配置文件 application.properties 中修改
  1. mock.date=2020-03-11
  2. mock.clear=0
复制代码
6)再次执行命令,生成 2020-03-11 日期数据:
  1. java -jar gmall-mock-db-2020-03-16-SNAPSHOT.jar
复制代码

2.4 同步策略

数据同步策略的类型包括:全量表、增量表、新增及变化表

  • 全量表:存储完整的数据
  • 增量表:存储新增加的数据
  • 新增及变化表:存储新增加的数据和变化的数据
  • 特殊表:只需要存储一次

2.4.1 全量同步策略

20200502100146413.png

2.4.2 增量同步策略

20200502100205745.png

2.4.3 新增及变化策略

每日新增及变化,就是存储创建时间和操作时间都是今天的数据
适用场景为,表的数据量大,既会有新增,又会有变化
例如:用户表、订单表、优惠卷领用表

2.4.4 特殊策略

某些特殊的维度表,可不必遵循上述同步策略

  • 1)客观世界维度

没变化的客观世界的维度(比如性别,地区,民族,政治成分,鞋子尺码)可以只存一
份固定值。

  • 2)日期维度

日期维度可以一次性导入一年或若干年的数据

  • 3)地区维度

省份表、地区表

2.5 业务数据导入 HDFS

2.5.1 分析表同步策略

20200502100327470.png

2.5.2 脚本编写

1)创建脚本
  1. vim mysql_to_hdfs.sh
复制代码
2)添加如下内容:
  1. vim mysql_to_hdfs.sh
复制代码
  1. #! /bin/bash
  2. sqoop=/opt/modules/sqoop/bin/sqoop
  3. do_date=`date -d '-1 day' +%F`
  4. if [[ -n "$2" ]]; then
  5. do_date=$2
  6. fi
  7. import_data(){
  8. $sqoop import \
  9. --connect jdbc:mysql://node01:3306/gmall \
  10. --username root \
  11. --password hadoop \
  12. --target-dir /origin_data/gmall/db/$1/$do_date \
  13. --delete-target-dir \
  14. --query "$2 and \$CONDITIONS" \
  15. --num-mappers 1 \
  16. --fields-terminated-by '\t' \
  17. --compress \
  18. --compression-codec lzop \
  19. --null-string '\\N' \
  20. --null-non-string '\\N'
  21. hadoop jar /opt/modules/hadoop/share/hadoop/common/hadoop-lzo-0.4.20.jar com.hadoop.compression.lzo.DistributedLzoIndexer /origin_data/gmall/db/$1/$do_date
  22. }
  23. import_order_info(){
  24. import_data order_info "select
  25. id,
  26. final_total_amount,
  27. order_status,
  28. user_id,
  29. out_trade_no,
  30. create_time,
  31. operate_time,
  32. province_id,
  33. benefit_reduce_amount,
  34. original_total_amount,
  35. feight_fee
  36. from order_info
  37. where (date_format(create_time,'%Y-%m-%d')='$do_date'
  38. or date_format(operate_time,'%Y-%m-%d')='$do_date')"
  39. }
  40. import_coupon_use(){
  41. import_data coupon_use "select
  42. id,
  43. coupon_id,
  44. user_id,
  45. order_id,
  46. coupon_status,
  47. get_time,
  48. using_time,
  49. used_time
  50. from coupon_use
  51. where (date_format(get_time,'%Y-%m-%d')='$do_date'
  52. or date_format(using_time,'%Y-%m-%d')='$do_date'
  53. or date_format(used_time,'%Y-%m-%d')='$do_date')"
  54. }
  55. import_order_status_log(){
  56. import_data order_status_log "select
  57. id,
  58. order_id,
  59. order_status,
  60. operate_time
  61. from order_status_log
  62. where
  63. date_format(operate_time,'%Y-%m-%d')='$do_date'"
  64. }
  65. import_activity_order(){
  66. import_data activity_order "select
  67. id,
  68. activity_id,
  69. order_id,
  70. create_time
  71. from activity_order
  72. where
  73. date_format(create_time,'%Y-%m-%d')='$do_date'"
  74. }
  75. import_user_info(){
  76. import_data "user_info" "select
  77. id,
  78. name,
  79. birthday,
  80. gender,
  81. email,
  82. user_level,
  83. create_time,
  84. operate_time
  85. from user_info
  86. where (DATE_FORMAT(create_time,'%Y-%m-%d')='$do_date'
  87. or DATE_FORMAT(operate_time,'%Y-%m-%d')='$do_date')"
  88. }
  89. import_order_detail(){
  90. import_data order_detail "select
  91. od.id,
  92. order_id,
  93. user_id,
  94. sku_id,
  95. sku_name,
  96. order_price,
  97. sku_num,
  98. od.create_time
  99. from order_detail od
  100. join order_info oi
  101. on od.order_id=oi.id
  102. where
  103. DATE_FORMAT(od.create_time,'%Y-%m-%d')='$do_date'"
  104. }
  105. import_payment_info(){
  106. import_data "payment_info" "select
  107. id,
  108. out_trade_no,
  109. order_id,
  110. user_id,
  111. alipay_trade_no,
  112. total_amount,
  113. subject,
  114. payment_type,
  115. payment_time
  116. from payment_info
  117. where
  118. DATE_FORMAT(payment_time,'%Y-%m-%d')='$do_date'"
  119. }
  120. import_comment_info(){
  121. import_data comment_info "select
  122. id,
  123. user_id,
  124. sku_id,
  125. spu_id,
  126. order_id,
  127. appraise,
  128. comment_txt,
  129. create_time
  130. from comment_info
  131. where date_format(create_time,'%Y-%m-%d')='$do_date'"
  132. }
  133. import_order_refund_info(){
  134. import_data order_refund_info "select
  135. id,
  136. user_id,
  137. order_id,
  138. sku_id,
  139. refund_type,
  140. refund_num,
  141. refund_amount,
  142. refund_reason_type,
  143. create_time
  144. from order_refund_info
  145. where
  146. date_format(create_time,'%Y-%m-%d')='$do_date'"
  147. }
  148. import_sku_info(){
  149. import_data sku_info "select
  150. id,
  151. spu_id,
  152. price,
  153. sku_name,
  154. sku_desc,
  155. weight,
  156. tm_id,
  157. category3_id,
  158. create_time
  159. from sku_info where 1=1"
  160. }
  161. import_base_category1(){
  162. import_data "base_category1" "select
  163. id,
  164. name
  165. from base_category1 where 1=1"
  166. }
  167. import_base_category2(){
  168. import_data "base_category2" "select
  169. id,
  170. name,
  171. category1_id
  172. from base_category2 where 1=1"
  173. }
  174. import_base_category3(){
  175. import_data "base_category3" "select
  176. id,
  177. name,
  178. category2_id
  179. from base_category3 where 1=1"
  180. }
  181. import_base_province(){
  182. import_data base_province "select
  183. id,
  184. name,
  185. region_id,
  186. area_code,
  187. iso_code
  188. from base_province
  189. where 1=1"
  190. }
  191. import_base_region(){
  192. import_data base_region "select
  193. id,
  194. region_name
  195. from base_region
  196. where 1=1"
  197. }
  198. import_base_trademark(){
  199. import_data base_trademark "select
  200. tm_id,
  201. tm_name
  202. from base_trademark
  203. where 1=1"
  204. }
  205. import_spu_info(){
  206. import_data spu_info "select
  207. id,
  208. spu_name,
  209. category3_id,
  210. tm_id
  211. from spu_info
  212. where 1=1"
  213. }
  214. import_favor_info(){
  215. import_data favor_info "select
  216. id,
  217. user_id,
  218. sku_id,
  219. spu_id,
  220. is_cancel,
  221. create_time,
  222. cancel_time
  223. from favor_info
  224. where 1=1"
  225. }
  226. import_cart_info(){
  227. import_data cart_info "select
  228. id,
  229. user_id,
  230. sku_id,
  231. cart_price,
  232. sku_num,
  233. sku_name,
  234. create_time,
  235. operate_time,
  236. is_ordered,
  237. order_time
  238. from cart_info
  239. where 1=1"
  240. }
  241. import_coupon_info(){
  242. import_data coupon_info "select
  243. id,
  244. coupon_name,
  245. coupon_type,
  246. condition_amount,
  247. condition_num,
  248. activity_id,
  249. benefit_amount,
  250. benefit_discount,
  251. create_time,
  252. range_type,
  253. spu_id,
  254. tm_id,
  255. category3_id,
  256. limit_num,
  257. operate_time,
  258. expire_time
  259. from coupon_info
  260. where 1=1"
  261. }
  262. import_activity_info(){
  263. import_data activity_info "select
  264. id,
  265. activity_name,
  266. activity_type,
  267. start_time,
  268. end_time,
  269. create_time
  270. from activity_info
  271. where 1=1"
  272. }
  273. import_activity_rule(){
  274. import_data activity_rule "select
  275. id,
  276. activity_id,
  277. condition_amount,
  278. condition_num,
  279. benefit_amount,
  280. benefit_discount,
  281. benefit_level
  282. from activity_rule
  283. where 1=1"
  284. }
  285. import_base_dic(){
  286. import_data base_dic "select
  287. dic_code,
  288. dic_name,
  289. parent_code,
  290. create_time,
  291. operate_time
  292. from base_dic
  293. where 1=1"
  294. }
  295. case $1 in
  296. "order_info")
  297. import_order_info
  298. ;;
  299. "base_category1")
  300. import_base_category1
  301. ;;
  302. "base_category2")
  303. import_base_category2
  304. ;;
  305. "base_category3")
  306. import_base_category3
  307. ;;
  308. "order_detail")
  309. import_order_detail
  310. ;;
  311. "sku_info")
  312. import_sku_info
  313. ;;
  314. "user_info")
  315. import_user_info
  316. ;;
  317. "payment_info")
  318. import_payment_info
  319. ;;
  320. "base_province")
  321. import_base_province
  322. ;;
  323. "base_region")
  324. import_base_region
  325. ;;
  326. "base_trademark")
  327. import_base_trademark
  328. ;;
  329. "activity_info")
  330. import_activity_info
  331. ;;
  332. "activity_order")
  333. import_activity_order
  334. ;;
  335. "cart_info")
  336. import_cart_info
  337. ;;
  338. "comment_info")
  339. import_comment_info
  340. ;;
  341. "coupon_info")
  342. import_coupon_info
  343. ;;
  344. "coupon_use")
  345. import_coupon_use
  346. ;;
  347. "favor_info")
  348. import_favor_info
  349. ;;
  350. "order_refund_info")
  351. import_order_refund_info
  352. ;;
  353. "order_status_log")
  354. import_order_status_log
  355. ;;
  356. "spu_info")
  357. import_spu_info
  358. ;;
  359. "activity_rule")
  360. import_activity_rule
  361. ;;
  362. "base_dic")
  363. import_base_dic
  364. ;;
  365. "first")
  366. import_base_category1
  367. import_base_category2
  368. import_base_category3
  369. import_order_info
  370. import_order_detail
  371. import_sku_info
  372. import_user_info
  373. import_payment_info
  374. import_base_province
  375. import_base_region
  376. import_base_trademark
  377. import_activity_info
  378. import_activity_order
  379. import_cart_info
  380. import_comment_info
  381. import_coupon_use
  382. import_coupon_info
  383. import_favor_info
  384. import_order_refund_info
  385. import_order_status_log
  386. import_spu_info
  387. import_activity_rule
  388. import_base_dic
  389. ;;
  390. "all")
  391. import_base_category1
  392. import_base_category2
  393. import_base_category3
  394. import_order_info
  395. import_order_detail
  396. import_sku_info
  397. import_user_info
  398. import_payment_info
  399. import_base_trademark
  400. import_activity_info
  401. import_activity_order
  402. import_cart_info
  403. import_comment_info
  404. import_coupon_use
  405. import_coupon_info
  406. import_favor_info
  407. import_order_refund_info
  408. import_order_status_log
  409. import_spu_info
  410. import_activity_rule
  411. import_base_dic
  412. ;;
  413. esac
复制代码
说明 1:
  1. [ -n 变量值 ] 判断变量的值,是否为空
  2. -- 变量的值,非空,返回 true
  3. -- 变量的值,为空,返回 false
复制代码
说明 2:
  1. 查看 date 命令的使用,date --help
复制代码
2)修改脚本权限
  1. chmod 770 mysql2hdfs.sh
复制代码
3)初次导入
  1. mysql2hdfs.sh first 2020-03-10
复制代码
4)每日导入
  1. mysql2hdfs.sh all 2020-03-11
复制代码
注意:此过程可能会执行10-20分钟左右,请耐心等待!

2.5.3 项目经验

Hive 中的 Null 在底层是以“\N”来存储,而 MySQL 中的 Null 在底层就是 Null,为了
保证数据两端的一致性。在导出数据时采用–input-null-string 和–input-null-non-string 两个参
数。导入数据时采用–null-string 和–null-non-string

三、数据环境准备

3.1 安装 Hive2.3

(PS:博主曾经安装过Hive,不过版本是Hive-1.1.0的,但是这次使用的是Hive2.3,配置稍有不同,所以就重新在这里写一遍配置!)

1)上传 apache-hive-2.3.0-bin.tar.gz 到/opt/software 目录下,并解压到/opt/modules
  1. tar -zxf apache-hive-2.3.6-bin.tar.gz -C /opt/modules
复制代码
2)修改 apache-hive-2.3.6-bin 名称为 hive
  1. mv apache-hive-2.3.6-bin hive
复制代码
3)将 Mysql 的 mysql-connector-java-5.1.27-bin.jar 拷贝到 /opt/modules/hive/lib
  1. cp /opt/software/mysql-libs/mysql-connector-java-5.1.27/mysql-connector-java-5.1.27-bin.jar /opt/modules/hive/lib/
复制代码
4)在/opt/modules/hive/conf 路径上,修改hive-env.sh,添加如下配置

20200502142744650.png

5)在/opt/modules/hive/conf 路径上,创建 hive-site.xml 文件
  1. vim hive-site.xml
复制代码
  1. <?xml version="1.0"?>
  2. <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
  3. <configuration>
  4.         <property>
  5.                 <name>javax.jdo.option.ConnectionURL</name>
  6.                 <value>jdbc:mysql://node01:3306/hive?createDatabaseIfNotExist=true</value>
  7.         </property>
  8.         <property>
  9.                 <name>javax.jdo.option.ConnectionDriverName</name>
  10.                 <value>com.mysql.jdbc.Driver</value>
  11.         </property>
  12.         <property>
  13.                 <name>javax.jdo.option.ConnectionUserName</name>
  14.                 <value>root</value>
  15.         </property>
  16.         <property>
  17.                 <name>javax.jdo.option.ConnectionPassword</name>
  18.                 <value>hadoop</value>
  19.         </property>
  20.         <property>
  21.                 <name>hive.metastore.warehouse.dir</name>
  22.                 <value>/user/hive/warehouse</value>
  23.         </property>
  24.         <property>
  25.                 <name>hive.cli.print.header</name>
  26.                 <value>true</value>
  27.         </property>
  28.         <property>
  29.                 <name>hive.cli.print.current.db</name>
  30.                 <value>true</value>
  31.         </property>
  32.         <property>
  33.                 <name>hive.metastore.schema.verification</name>
  34.                 <value>false</value>
  35.         </property>
  36.         <property>
  37.                 <name>datanucleus.schema.autoCreateAll</name>
  38.                 <value>true</value>
  39.         </property>
  40.         <property>
  41.                 <name>hive.server2.thrift.bind.host</name>
  42.                 <value>node01</value>
  43.         </property>
  44.         <property>
  45.                 <name>hive.metastore.uris</name>
  46.                 <value>thrift://node01:9083</value>
  47.         </property>
  48. </configuration>
复制代码
6)启动!
  1. nohup ./bin/hive --service metastore &
  2. nohup ./bin/hiveserver2 &
  3. ./bin/beeline
  4. !connect jdbc:hive2://node01:10000
复制代码

3.2 Hive 集成引擎 Tez

Tez 是一个 Hive 的运行引擎,性能优于 MR。为什么优于 MR 呢?看下图

20200502153538638.png

用 Hive 直接编写 MR 程序,假设有四个有依赖关系的 MR 作业,上图中,绿色是 ReduceTask,云状表示写屏蔽,需要将中间结果持久化写到 HDFS
Tez 可以将多个有依赖的作业转换为一个作业,这样只需写一次 HDFS,且中间节点较少,从而大大提升作业的计算性能

3.2.1 安装包准备

1)下载 tez 的依赖包:http://tez.apache.org

2)将 apache-tez-0.9.1-bin.tar.gz 上传到 HDFS 的 /tez 目录下
  1. hdfs dfs -mkdir /tez
  2. hdfs dfs -put /opt/software/apache-tez-0.9.1-bin.tar.gz /tez
复制代码
3)解压缩 apache-tez-0.9.1-bin.tar.gz,并重命名为 tez
  1. tar -zxf apache-tez-0.9.1-bin.tar.gz -C /opt/modules
  2. mv /opt/modules/apache-tez-0.9.1-bin tez
复制代码
3.2.2 集成 Tez
1)进入到 Hive 的配置目录:/opt/modules/hive/conf
  1. cd /opt/modules/hive/conf
复制代码
2)在 Hive 的/opt/modules/hive/conf 下面创建一个 tez-site.xml 文件
vim tez-site.xml
添加如下内容
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
  3. <configuration>
  4.         <property>
  5.                 <name>tez.lib.uris</name>
  6.                 <value>${fs.defaultFS}/tez/apache-tez-0.9.1-bin.tar.gz</value>
  7.         </property>
  8.         <property>
  9.                 <name>tez.use.cluster.hadoop-libs</name>
  10.                 <value>true</value>
  11.         </property>
  12.         <property>
  13.                 <name>tez.history.logging.service.class</name>
  14.                 <value>org.apache.tez.dag.history.logging.ats.ATSHistoryLoggin
  15.         gService</value>
  16.         </property>
  17. </configuration>
复制代码
2)在 hive-env.sh 文件中添加 tez 环境变量配置和依赖包环境变量配置
vim hive-env.sh
添加如下配置
  1. export TEZ_HOME=/opt/modules/tez #是你的 tez 的解压目录
  2. export TEZ_JARS=""
  3. for jar in `ls $TEZ_HOME |grep jar`; do
  4. export TEZ_JARS=$TEZ_JARS:$TEZ_HOME/$jar
  5. done
  6. for jar in `ls $TEZ_HOME/lib`; do
  7. export TEZ_JARS=$TEZ_JARS:$TEZ_HOME/lib/$jar
  8. done
  9. # HIVE_AUX_JARS_PATH是引用外部Jar包的路径
  10. export HIVE_AUX_JARS_PATH=/opt/modules/hadoop/share/hadoop/common/hadoop-lzo-0.4.20.jar$TEZ_JARS
复制代码
3)在 hive-site.xml 文件中添加如下配置,更改 hive 计算引擎
  1. <property>
  2.         <name>hive.execution.engine</name>
  3.         <value>tez</value>
  4. </property>
复制代码

3.2.3 测试


1)启动 Hive

2)创建表
  1. create table student(id int,name string);
复制代码
3)向表中插入数据
  1. insert into student values(1,"zhangsan");
复制代码
4)如果没有报错就表示成功了
  1. select * from student;
复制代码

3.2.4 注意事项


1)运行 Tez 时检查到用过多内存而被 NodeManager 杀死进程问题:
  1. Caused by: org.apache.tez.dag.api.SessionNotRunning: TezSession
  2. has already shutdown. Application application_1546781144082_0005
  3. failed 2 times due to AM Container for appattempt_1546781144082_0005_000002 exited with exitCode: -103
  4. For more detailed output, check application tracking
  5. page:http://hadoop103:8088/cluster/app/application_15467811440
  6. 82_0005Then, click on links to logs of each attempt.
  7. Diagnostics: Container
  8. [pid=11116,containerID=container_1546781144082_0005_02_000001]
  9. is running beyond virtual memory limits. Current usage: 216.3 MB
  10. of 1 GB physical memory used; 2.6 GB of 2.1 GB virtual memory used.
  11. Killing container.
复制代码
这种问题是从机上运行的 Container 试图使用过多的内存,而被 NodeManager kill 掉了

2)解决方法:

(1)关掉虚拟内存检查,修改 yarn-site.xml,添加如下配置
  1. <property>
  2.         <name>yarn.nodemanager.vmem-check-enabled</name>
  3.         <value>false</value>
  4. </property>
复制代码
(2)修改后分发配置文件,并重新启动 hadoop 集群

结束语

至此,MySQL、Sqoop、Hive环境已经搭建完毕,数据也已生产至HDFS,博主将会在下一章开启数仓建模搭建的过程!




加微信w3aboutyun,获取更多资源



领取100本书+1T资源
http://www.aboutyun.com/forum.php?mod=viewthread&tid=26480

大数据5个项目视频
http://www.aboutyun.com/forum.php?mod=viewthread&tid=25235

名企资源、名企面试题、最新BAT面试题、专题面试题等资源汇总
https://www.aboutyun.com/forum.php?mod=viewthread&tid=27732



文章来源:https://blog.csdn.net/qq_43733123/article/details/105868759

没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条