一、 实验目的

  掌握数据导入Hive表的方式
  理解三种数据导入Hive表的原理

二、 实验内容

  1、启动Hadoop和Hive服务并创建数据表
  2、将Hive表中的数据导出

三、 实验环境

  硬件:ubuntu 16.04
  软件:JDK-1.8、hive-2.3、Hadoop-2.7、MySQL-5.7、Sqoop1.4
  数据存放路径:/data/dataset
  tar包路径:/data/software
  tar包压缩路径:/data/bigdata
  软件安装路径:/opt
  实验设计创建文件:/data/resource

四、 实验原理

  Export工具将文件从HDFS导出到关系型数据库。目标表必须存在于数据库中,根据用户指定的分隔符读取输入文件并解析为一条记录。
  默认操作是将这些数据以“insert ”的方式插入到数据库表中;在“更新模式”中,Sqoop将使用“update”的方式更新记录。


  Sqoop 数据导出流程,首先用户输入一个 Sqoop export 命令,它会获取关系型数据库的 schema,建立 Hadoop 字段与数据库表字段的映射关系。 然后会将输入命令转化为基于 Map 的 MapReduce作业,这样 MapReduce作业中有很多 Map 任务,它们并行的从 HDFS 读取数据,并将整个数据拷贝到数据库中。

五、 实验步骤

5.1、启动Hadoop和Hive服务并创建数据表

  1、检查MySQL是否安装


  1. mysql -u root -proot

  此时发现报错信息如下:


  1. ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (111)

  执行如下命令,即可成功进入 MySQL。


  1. rm /var/run/mysqld/mysqld.sock
  2. service mysql restart

  2、检测是否安装Hadoop
  注意:需要在配置文件/etc/profile中注释掉Hadoop3的相关环境变量设置,然后执行命令【source /etc/profile】,让配置的profile文件立刻生效。

启动Hadoop:


  1. start-all.sh

  查看守护进程是否启动,如下图所示:


  1. root@localhost:~# jps
  2. 8423 SecondaryNameNode
  3. 8712 NodeManager
  4. 8072 NameNode
  5. 8203 DataNode
  6. 9036 Jps
  7. 8588 ResourceManager

  2、启动Mysql和Hive:


  1. service mysql start
  2. cd /opt/hive
  3. hive

  3、创建表
  创建film表,分为电影名称、上映日期、票房三个字段,数据格式以“,”分割:


  1. hive> create table film(name string,dates string,prince int) row format delimited fields terminated by ',';

  4、导入数据
  将本地的film_log3.log文件数据加载到film表:


  1. hive> load data local inpath '/data/dataset/film_log3.log'into table film;

  5、查看film表数据的总条数:


  1. hive> select count(*) from film;

  6、使用MySQL创建film_info表


  1. mysql -uroot -proot
  2. create database data;
  3. use data;
  4. create table film_info(name varchar(50),dates varchar(50),prince double)engine=innodb charset=utf8;

5.2、将Hive表中的数据导出

  1、查看hive中的film表在HDFS上的存储位置


  1. hadoop fs -ls /user/hive/warehouse/film

  2、将hive的film表数据导出到指定表film_info中


  1. sqoop export --connect jdbc:mysql://localhost:3306/data --username root --password root --table film_info --export-dir /user/hive/warehouse/film --input-fields-terminated-by ',' --m 1

  3、查看导出的结果


  1. mysql> select * from film_info limit 5;
  2. +------------+-----------+--------+
  3. | name | dates | prince |
  4. +------------+-----------+--------+
  5. | ?????? | 2014.1.10 | 52 |
  6. | ????? | 2015.6.5 | 85 |
  7. | ????? | 2016.1.1 | 188 |
  8. | ?????? | 2014.4.11 | 71 |
  9. | ?????????? | 2016.4.1 | 49 |
  10. +------------+-----------+--------+
  11. 5 rows in set (0.00 sec)

  发现name这一列中文都是乱码,是因为导出的编码格式没有指定
  4、修改编码格式


  1. #清空表 truncate film_info;

  指定编码格式为“UTF-8”


  1. sqoop export --connect "jdbc:mysql://localhost:3306/data?useUnicode=true&characterEncoding=utf-8" --username root --password root --table film_info --export-dir /user/hive/warehouse/film --input-fields-terminated-by ',' --m 1

  5、查看导出的结果


  1. mysql> select * from film_info limit 5;
  2. +--------------------------------+-----------+--------+
  3. | name | dates | prince |
  4. +--------------------------------+-----------+--------+
  5. | 《不爱不散》 | 2014.1.10 | 52 |
  6. | 《顺风车》 | 2015.6.5 | 85 |
  7. | 《小门神》 | 2016.1.1 | 188 |
  8. | 《百变爱人》 | 2014.4.11 | 71 |
  9. | 《睡在我上铺的兄弟》 | 2016.4.1 | 49 |
  10. +--------------------------------+-----------+--------+
  11. 5 rows in set (0.00 sec)

1.hadoop3环境变量的修改

cd /opt/etc

vi profile

将hadoop3的环境变量注释掉

2.npm install mysql-server

在启动mysql之前需要npm install mysql-server

按照提示进行npm update之后npm install mysql-server

Logo

永洪科技,致力于打造全球领先的数据技术厂商,具备从数据应用方案咨询、BI、AIGC智能分析、数字孪生、数据资产、数据治理、数据实施的端到端大数据价值服务能力。

更多推荐