百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

Mysql和Hive之间通过Sqoop进行数据同步

ztj100 2025-03-28 23:31 19 浏览 0 评论


文章回顾

理论

大数据框架原理简介

大数据发展历程及技术选型

实践

搭建大数据运行环境之一

搭建大数据运行环境之二

本地MAC环境配置

CPU数和内存大小

  • 查看CPU数
  • sysctl machdep.cpu
    
    # 核数为4
    machdep.cpu.core_count: 4    
    # cpu数量为8个,使用了超线程技术:四核八线程
    machdep.cpu.thread_count: 8  
    
  • 内存大小
  • top -l 1 | head -n 10 | grep PhysMem
    
    PhysMem: 16G used (10G wired), 67M unused.
    

    在本地开了3个虚拟机centos服务器

    虚拟机服务器配置

    服务器1 192.168.84.128 4核4G
    服务器2 192.168.84.131 1核2G
    服务器3 192.168.84.132 1核2G
    
    因为服务器1上的按照的软件比较多 所以这样分配核数和内存 可以将大数据环境运行起来
    
    

    虚拟机软件给一个虚拟机分配核数和内存的方式

    通过Sqoop查看Mysql数据库

    /usr/local/sqoop/bin/sqoop list-databases --connect jdbc:mysql://hadoop001:3306/?useSSL=false --username root --password 123456
    

    在Hive中创建测试表

    创建test表

    CREATE TABLE IF NOT EXISTS test (
    id int
    ,uid int
    ,title string
    ,name string
    ,status int
    ,time timestamp)
    COMMENT '简介'
    ROW FORMAT DELIMITED
    FIELDS TERMINATED BY "\001"
    LINES TERMINATED BY "\n"
    STORED AS TEXTFILE;
    

    创建test_out表

    CREATE TABLE IF NOT EXISTS test_out (
    name string
    , count int
    ,time date)
    COMMENT '简介'
    ROW FORMAT DELIMITED
    FIELDS TERMINATED BY '\001'
    LINES TERMINATED BY '\n'
    STORED AS TEXTFILE;
    

    hive删除表

  • 使用truncate仅可删除内部表数据,不可删除表结构
  • truncate table 表名
    (truncate可删除所有的行,但是不能删除外部表)
    
  • 使用shell命令删除外部表
  • hdfs -dfs -rm -r 外部表路径
    
  • 使用 drop 可删除整个表
  • drop table 表名
    

    查看hive表

  • 查询hive所有表
  • hive -e "show databases ;" > databases.txt
    
    cat databases.txt
    default
    
  • 指定default数据库
  • ./hive -d default
    

    在Mysql中创建测试表

  • 创建test
  • DROP TABLE IF EXISTS `test`;
    CREATE TABLE `test` (
      `id` int(10) DEFAULT NULL,
      `uid` int(10) DEFAULT NULL,
      `title` varchar(100) DEFAULT NULL,
      `name` varchar(100) DEFAULT NULL,
      `status` int(10) DEFAULT NULL,
      `time` timestamp NULL DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    

    插入3条测试数据

    INSERT INTO `test`.`test`(`id`, `uid`, `title`, `name`, `status`, `time`) VALUES (1, 1, '第一条数据', '平凡人笔记', 1, '2021-01-11 16:30:02');
    
    INSERT INTO `test`.`test`(`id`, `uid`, `title`, `name`, `status`, `time`) VALUES (2, 2, '第二条数据', '孟凡霄', 2, '2021-01-11 16:30:20');
    
    INSERT INTO `test`.`test`(`id`, `uid`, `title`, `name`, `status`, `time`) VALUES (3, 3, '第三条数据', '平凡人', 3, '2021-01-11 16:30:41');
    
  • 创建test_out
  • DROP TABLE IF EXISTS `test_out`;
    CREATE TABLE `test_out` (
      `name` varchar(100) DEFAULT NULL,
      `count` int(10) DEFAULT NULL,
      `time` date DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    

    Mysql导入Hive

    /usr/local/sqoop/bin/sqoop import \
    --driver com.mysql.jdbc.Driver \
    --connect jdbc:mysql://hadoop001:3306/test?useSSL=false \
    --username root \
    --password 123456 \
    --table test \
    --fields-terminated-by '\001' \
    --lines-terminated-by '\n' \
    --delete-target-dir \
    --num-mappers 1 \
    --hive-import \
    --hive-database default \
    --hive-table test \
    --direct
    

    虽然有报错 
    
    ERROR bonecp.BoneCP: Unable to start/stop JMX
    java.security.AccessControlException: access denied ("javax.management.MBeanTrustPermission" "register")
    
    但不影响导入结果
    

  • 查看hive表
  • 说明从Mysql导入hive成功
    

    增量数据定时导入

    mysql test表增加一条测试数据

    INSERT INTO `test`.`test`(`id`, `uid`, `title`, `name`, `status`, `time`) VALUES (4, 4, '第四条数据', '笔记', 4, '2021-01-11 16:50:00');
    
  • 删除指定job
  • /usr/local/sqoop/bin/sqoop job --delete testJob
    
  • 添加一个增量更新的job
  • /usr/local/sqoop/bin/sqoop job --create testJob -- \
    import \
    --driver com.mysql.jdbc.Driver \
    --connect jdbc:mysql://hadoop001:3306/test?useSSL=false \
    --username root \
    --password 123456 \
    --table test \
    --check-column time \
    --incremental lastmodified \
    --last-value '2018-08-09 15:30:29' \
    --merge-key id \
    --fields-terminated-by '\001' \
    --lines-terminated-by '\n' \
    --num-mappers 1 \
    --target-dir /user/hive/warehouse/test
    
  • 执行job
  • /usr/local/sqoop/bin/sqoop job --exec testJob
    
  • 查看数据已被更新
  • 查看job
  • /usr/local/sqoop/bin/sqoop job --show testJob
    

    通常情况可以结合sqoop job和crontab等任务调度工具实现相关业务

    Hive导入Hive

    
    cd /usr/local/hive/bin
    
    hive
    
    # 统计后将结果数据加入另一个表
    INSERT INTO TABLE 
    test_out(name,count,time) 
    SELECT name,count(1),to_date(time) 
    FROM test 
    GROUP BY name,to_date(time);
    
    # 或者
    
    INSERT OVERWRITE 
    TABLE test_out
    SELECT name,count(1),to_date(time) 
    FROM test 
    GROUP BY name,to_date(time);
    

    查看统计结果

    统计成功
    

    Hive导入Mysql

    
    # hive的default库中的test_out表数据导出到mysql的test库test_out表
    
    /usr/local/sqoop/bin/sqoop export \
    --connect "jdbc:mysql://hadoop001:3306/test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai" \
    --username root \
    --password 123456 \
    --input-null-string '\\N' \
    --input-null-non-string '\\N' \
    --input-fields-terminated-by '\t' \
    --table test_out \
    --hcatalog-database default \
    --hcatalog-table test_out \
    -m 1;
    
    
    

    导出成功
    

    可能遇到的问题及注意点

  • hive访问mysql数据库权限问题
  • 服务器1上hive访问mysql如果报错
    
    Access denied for user 'root'@'192.168.84.128' (using password: YES)
    

    mysql需要授权访问者

    GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.84.128' IDENTIFIED BY '123456' WITH GRANT OPTION;
    
    flush privileges;
    

  • 在namenode上执行
  • 报错:
    
    RemoteException(org.apache.hadoop.ipc.StandbyException):
    Operation category READ is not supported in state standby
    
    原因:
    
    服务器1是namenode节点 active 状态
    服务器2是secondNamenode节点是 standby状态
    
    执行命令要在active的namenode才可以
    
  • 只有namenode才会有webui 50070端口
  • 服务器1(192.168.84.128)上安装namenode 有50070端口
    服务器2(192.168.84.131)上安装secondNamenode 有50070端口
    服务器3(192.168.84.132)上没有安装namenode 没有
    

    后记

    接下来研究的方向:
    
    1、hive运行原理
    2、弄一笔数据走一下搭建好的大数据运行环境
    3、10亿数据如何分库分表存储Mysql
    4、10亿数据同步到hive
    5、flink数据如何求交
    
    

    相关推荐

    30天学会Python编程:16. Python常用标准库使用教程

    16.1collections模块16.1.1高级数据结构16.1.2示例...

    强烈推荐!Python 这个宝藏库 re 正则匹配

    Python的re模块(RegularExpression正则表达式)提供各种正则表达式的匹配操作。...

    Python爬虫中正则表达式的用法,只讲如何应用,不讲原理

    Python爬虫:正则的用法(非原理)。大家好,这节课给大家讲正则的实际用法,不讲原理,通俗易懂的讲如何用正则抓取内容。·导入re库,这里是需要从html这段字符串中提取出中间的那几个文字。实例一个对...

    Python数据分析实战-正则提取文本的URL网址和邮箱(源码和效果)

    实现功能:Python数据分析实战-利用正则表达式提取文本中的URL网址和邮箱...

    python爬虫教程之爬取当当网 Top 500 本五星好评书籍

    我们使用requests和re来写一个爬虫作为一个爱看书的你(说的跟真的似的)怎么能发现好书呢?所以我们爬取当当网的前500本好五星评书籍怎么样?ok接下来就是学习python的正确姿...

    深入理解re模块:Python中的正则表达式神器解析

    在Python中,"re"是一个强大的模块,用于处理正则表达式(regularexpressions)。正则表达式是一种强大的文本模式匹配工具,用于在字符串中查找、替换或提取特定模式...

    如何使用正则表达式和 Python 匹配不以模式开头的字符串

    需要在Python中使用正则表达式来匹配不以给定模式开头的字符串吗?如果是这样,你可以使用下面的语法来查找所有的字符串,除了那些不以https开始的字符串。r"^(?!https).*&...

    先Mark后用!8分钟读懂 Python 性能优化

    从本文总结了Python开发时,遇到的性能优化问题的定位和解决。概述:性能优化的原则——优化需要优化的部分。性能优化的一般步骤:首先,让你的程序跑起来结果一切正常。然后,运行这个结果正常的代码,看看它...

    Python“三步”即可爬取,毋庸置疑

    声明:本实例仅供学习,切忌遵守robots协议,请不要使用多线程等方式频繁访问网站。#第一步导入模块importreimportrequests#第二步获取你想爬取的网页地址,发送请求,获取网页内...

    简单学Python——re库(正则表达式)2(split、findall、和sub)

    1、split():分割字符串,返回列表语法:re.split('分隔符','目标字符串')例如:importrere.split(',','...

    Lavazza拉瓦萨再度牵手上海大师赛

    阅读此文前,麻烦您点击一下“关注”,方便您进行讨论和分享。Lavazza拉瓦萨再度牵手上海大师赛标题:2024上海大师赛:网球与咖啡的浪漫邂逅在2024年的上海劳力士大师赛上,拉瓦萨咖啡再次成为官...

    ArkUI-X构建Android平台AAR及使用

    本教程主要讲述如何利用ArkUI-XSDK完成AndroidAAR开发,实现基于ArkTS的声明式开发范式在android平台显示。包括:1.跨平台Library工程开发介绍...

    Deepseek写歌详细教程(怎样用deepseek写歌功能)

    以下为结合DeepSeek及相关工具实现AI写歌的详细教程,涵盖作词、作曲、演唱全流程:一、核心流程三步法1.AI生成歌词-打开DeepSeek(网页/APP/API),使用结构化提示词生成歌词:...

    “AI说唱解说影视”走红,“零基础入行”靠谱吗?本报记者实测

    “手里翻找冻鱼,精心的布局;老漠却不言语,脸上带笑意……”《狂飙》剧情被写成歌词,再配上“科目三”背景音乐的演唱,这段1分钟30秒的视频受到了无数网友的点赞。最近一段时间随着AI技术的发展,说唱解说影...

    AI音乐制作神器揭秘!3款工具让你秒变高手

    在音乐创作的领域里,每个人都有一颗想要成为大师的心。但是面对复杂的乐理知识和繁复的制作过程,许多人的热情被一点点消磨。...

    取消回复欢迎 发表评论: