#第十六天 - Sqoop工具使用 - Hadoop、Hive、Sqoop常见问题 - 数据可视化工具ECharts
一、Sqoop从MySql导数据到Hive过程
#####导入至HDFS
- 指定命令 - 声明配置项 - 指定参数
- 命令语句 - 翻译成程序 - 打成jar包
- 将jar包(核心程序 - 依赖jiar包)提交至集群
- 简单的数据导出:只有Map阶段 – 数据源:关系型数据库(结构化的数据)
- 单表数据导出:将数据全部查出,拼接分隔符输出,Reduce阶段原样输出
- 默认使用4个MapTask执行 - 产生了四个结果文件 – 通过-m参数实现
- 默认使用第一列作为分割任务的列,确定固定的区间,--split--bug(指定分割列)
- 在相应的目录下生成结果,使用sql(聚合函数运算)
#####导入至Hive
- 确定路径:当前执行sqoop命令的家目录
- 导入为HDFS时指定的部分参数会被Hive导入时进行读取(如分隔符)
- 如果目标表不存在则创建(数据表结构信息(数据源的表结构) - 命令指定的相关参数)
- 如果目标表存在:默认追加导入,数据结构保持一致,目标Hive表的相关参数(分隔符)一致
- 导入数据 – 将中间目录的文件夹下的数据文件移动至内部表目录下
###二、Sqoop从Mysql导数据到Hive部分参数
#####数据来源
整表导出 --table
导出表中的某几列 --columns
查询语句(多表联查 - 条件查询) --query
出现条件时需要使用and $CONDITIONS
#####目标
1.HDFS(--target-dir)(默认分隔符:逗号) - 执行MapReduce后得到结果,读取结果文件,export
--delete-target-dir:导出前先删除目标目录(会自动检验是否存在)
数据文件输出格式:Output line formatting arguments
--fields-terminated-by 数据库表不同字段之间的数据分隔符
--lines-terminated-by 数据库表不同条目之间的数据分隔符
2.Hive,通过hql或HiveJDBC获取结果,export
注:在Hive中自动创建(默认内部表) – 导入到已创建的表
--hive-import 以Hive的方式进行导入
--hive-database 导入到指定的Hive库中
--external-table-dir 以外部表的形式创建
--hive -table 导入到指定的Hive表中
--hive-overwrite 是否覆盖导入
--create-hive-table 在Hive中创建表 - 只包含结构信息
执行Sqoop命令
sqoop import
–connect jdbc:mysql://SZ01:3306/w01
–username root
–password root
–table make
–hive-import
–hive-database default
–hive-table make1
-m 1
执行sqoop导入命令
连接信息(从mysql数据库中导出、主机名、端口、库名)
用户名
密码
要导出的表
导入到hive
要导入到hive中的default库
要导入到make1表
使用1个map task执行导入操作
运行时会出现以下错误:
Could not load org.apache.hadoop.hive.conf.HiveConf. Make sure HIVE_CONF_DIR is set correctly.
注:该错误会在Sqoop1.4.7版本中出现
解决办法:
在环境变量中添加以下语句
export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$HIVE_HOME/lib/*
刷新环境变量文件
source .bash_profile
运行成功后在hive中无法找到该表
在hive中无法找到该表的原因如下:
- Hive 默认使用derby作为数据元信息存储数据库
- 在进行数据导入时如果不进行配置,会导致在mysql中无法正常写入数据结构信息
- 在Hive中无法查询到表的结构信息
解决办法:将hive-site.xml复制到sqoop中
cp /home/bigdata/apache-hive-1.2.2-bin/conf/hive-site.xml /home/bigdata/sqoop-1.4.7.bin/conf/
###三、sqoop从文本读取执行命令
编辑要读取命令的文件:
vi sqoopCmd
--connect
jdbc:mysql://192.168.128.121:3306/w01
--username
root
--password
root
--query
'select * from make where id < 10 and $CONDITIONS'
--target-dir
/tmp/make
--delete-target-dir
--hive-import
--hive-database
default
--hive-table
make2
--hive-overwrite
-m
1
执行命令
命令格式sqoop {cmd} --options-file {fileName}
sqoop import --options-file sqoopCmd
效果
###四、Hadoop、Hive、Sqoop常见问题
#####Hadoop
-
节点启动失败
-
报错信息:address already in use - bind Address:50070
解决步骤:
- 查询端口占用:lsof -i:50070,查询到占用端口的进程:pid
- 杀死进程:kill -9 {pid}
-
报错信息(namenode):could not find dir:xxx,找不到namenode格式化产生的路径
解决方法:
格式化namenode:
hdfs namenode -format
每次格式化时都会产生新的集群id -> clusterID
保存信息的文件位于/home/bigdata/hadoop/data/dfs/name/current/VERSION
-
报错信息(datanode):could not find dir:xxx,找不到datanode的路径
保存信息的文件位于/home/bigdata/hadoop/data/dfs/dn/current/VERSION
解决办法:
删除之前遗留的信息:dn
手动修改VERSION中的版本信息,使得一致
-
要求输入密码
解决办法:
配置免密码登录(包括启动脚本的机器)
-
获取SZ01的公钥(公钥只需获取一次即可)
ssh-keygen -t rsa
在此过程中使用默认配置即可,即一路回车直到生成RSA文件
-
将SZ01的公钥发送给所有集群机器(包括自身),发送时需要输入密码
ssh-copy-id bigdata@SZ01
ssh-copy-id bigdata@SZ02
ssh-copy-id bigdata@SZ03
-
-
进程启动成功后消失
查看启动日志根据日志处理错误。可以尝试重启节点,关闭防火墙
-
-
操作HDFS
-
报错信息:permission denied,权限不足
解决办法:
- 伪装用户(启动hdfs进程的用户) ,配置环境变量HADOOP_USER
- hdfs-site.xml -> 关闭权限校验
-
报错信息:无法建立通信,端口8020
解决办法:保证hdfs进程启动
-
-
运行MapReduce
注:MapReduce以队列的方式进行
杀死MapReduce运行进程的命令:
hadoop job -kill {jobId}
MapReduce的日志位置:
(1)通过web的管理界面查看
(2)$HADOOP_HOME/logs/userlogs下有相应的三个日志文件
报错信息(远程调用执行)
-
权限不足
原因:中间结果的临时目录无相关权限
解决办法:赋予该临时目录相应的权限
hdfs dfs -chmod -R 777 /tmp
-
结果输出目录已经存在,解决办法:重新指定一个不存在的结果输出目录
-
源数据目录不存在,解决办法:指定正确的源数据目录
-
逻辑错误
-
accept阶段卡住不动,解决办法:防火墙关闭
-
#####Hive
Hive的日志文件位置:在conf中指定的目录及文件名
/home/${user.home}
hive.log
-
错误提示:parseException
这种错误是在配置文件中配置项出错,会提示比较完整的错误位置信息,根据信息找到目标行/列修正即可
-
JDBC相关异常,启动过程中读取配置文件打开MySQL,检查报错信息,MySQL是否启动
-
MySQL数据库密码修改。在MySQL中,是根据host和user唯一确定的用户的密码(联合主键的方式实现)
密码验证信息存放位置:mysql.user表中host,password,user,password_expired,权限相关
修改密码方式:
方式一:直接修改表 -> update mysql.user set password = password(‘xxx’) where host = ‘xx’ and user = ‘xx’
方式二:set password = password(‘root’);此命令默认修改当前连接进入的密码,但是可以通过参数修改其他用户的密码
添加或修改一条连接规则:
GRANT ALL PRIVILEGES ON . to ‘user’@‘host’ IDENTIFIED by ‘root’ WITH GRANT OPTION;
FLUSH PRIVILEGES;
-
ClassNotFountException:com.mysql.jdbc.Driver
解决方法:拷贝驱动jar包至$HIVE_HOME/lib
-
Hive客户端或HiveJDBC操作Hive
远程操作
return code 1,原因是/tmp/hadoop-yarn/staging/anonymous权限不足
解决方法:修改该文件夹的权限
hdfs dfs -chmod -R 777 /tmp/hadoop-yarn/staging/anonymous
Sqoop
sqoop import
–connect jdbc:mysql://localhost:3306/w01
–username root
–password root
–table make
–hive-import
–hive-database default
–hive-table make1
-m
原因:连接mysql的jdbc中主机名不能为localhost,必须是ip地址或者是主机名(hosts中配置的)
sqoop import
–connect jdbc:mysql://SZ01:3306/w01
–username root
–password root
–table make
–hive-import
–hive-database default
–hive-table make1
-m
###五、数据可视化工具ECharts
简介
ECharts,一个使用 JavaScript 实现的开源可视化库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE8/9/10/11,Chrome,Firefox,Safari等),底层依赖轻量级的矢量图形库 ZRender,提供直观,交互丰富,可高度个性化定制的数据可视化图表。
ECharts 提供了常规的折线图、柱状图、散点图、饼图、K线图,用于统计的盒形图,用于地理数据可视化的地图、热力图、线图,用于关系数据可视化的关系图、treemap、旭日图,多维数据可视化的平行坐标,还有用于 BI 的漏斗图,仪表盘,并且支持图与图之间的混搭。
使用方法
从官网下载js文件,点击下载
将js文件导入到项目中
实例(官方案例)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<!--1.引入相关的库文件-->
<script type="text/javascript" src="js/echarts.min.js" ></script>
</head>
<body>
<!--2.定义相关图标显示区域-->
<div id="main" style="width: 600px;height:400px;"></div>
<!--3.配置图表显示内容 - 柱形图案例-->
<script type="text/javascript">
/*主要参数:1.内置对象:echarts 2.配置对象:option 3.相关方法:init(),setOption() */
var myChart = echarts.init(document.getElementById("main"));
// 指定图表的配置项和数据
var option = {
title: {
text: 'ECharts 入门示例'
},
tooltip: {},
legend: {
data:['销量']
},
xAxis: {
data: ["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"]
},
yAxis: {},
series: [{
name: '销量',
type: 'bar',
data: [5, 20, 36, 10, 10, 20]
}]
};
myChart.setOption(option);
</script>
</body>
</html>