山东大学软件学院数据挖掘实验五(2)的坑
山东大学软件学院数据挖掘实验五(2)
一、 实验目的
掌握数据导入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 读取数据,并将整个数据拷贝到数据库中。
五、 实验步骤
1、检查MySQL是否安装
mysql -u root -proot
此时发现报错信息如下:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (111)
执行如下命令,即可成功进入 MySQL。
rm /var/run/mysqld/mysqld.sockservice mysql restart
2、检测是否安装Hadoop
注意:需要在配置文件/etc/profile中注释掉Hadoop3的相关环境变量设置,然后执行命令【source /etc/profile】,让配置的profile文件立刻生效。
启动Hadoop:
start-all.sh
查看守护进程是否启动,如下图所示:
root@localhost:~# jps8423 SecondaryNameNode8712 NodeManager8072 NameNode8203 DataNode9036 Jps8588 ResourceManager
2、启动Mysql和Hive:
service mysql startcd /opt/hivehive
3、创建表
创建film表,分为电影名称、上映日期、票房三个字段,数据格式以“,”分割:
hive> create table film(name string,dates string,prince int) row format delimited fields terminated by ',';
4、导入数据
将本地的film_log3.log文件数据加载到film表:
hive> load data local inpath '/data/dataset/film_log3.log'into table film;
5、查看film表数据的总条数:
hive> select count(*) from film;
6、使用MySQL创建film_info表
mysql -uroot -prootcreate database data;use data;create table film_info(name varchar(50),dates varchar(50),prince double)engine=innodb charset=utf8;
1、查看hive中的film表在HDFS上的存储位置
hadoop fs -ls /user/hive/warehouse/film
2、将hive的film表数据导出到指定表film_info中
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、查看导出的结果
mysql> select * from film_info limit 5;+------------+-----------+--------+| name | dates | prince |+------------+-----------+--------+| ?????? | 2014.1.10 | 52 || ????? | 2015.6.5 | 85 || ????? | 2016.1.1 | 188 || ?????? | 2014.4.11 | 71 || ?????????? | 2016.4.1 | 49 |+------------+-----------+--------+5 rows in set (0.00 sec)
发现name这一列中文都是乱码,是因为导出的编码格式没有指定
4、修改编码格式
#清空表 truncate film_info;
指定编码格式为“UTF-8”
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、查看导出的结果
mysql> select * from film_info limit 5;+--------------------------------+-----------+--------+| name | dates | prince |+--------------------------------+-----------+--------+| 《不爱不散》 | 2014.1.10 | 52 || 《顺风车》 | 2015.6.5 | 85 || 《小门神》 | 2016.1.1 | 188 || 《百变爱人》 | 2014.4.11 | 71 || 《睡在我上铺的兄弟》 | 2016.4.1 | 49 |+--------------------------------+-----------+--------+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
更多推荐


所有评论(0)