大数据_离线数据处理
- 流程介绍
- 安装搭建
- 离线流程测试
- 可能遇见的问题
- 搭建及入门视频
- 流程介绍
mysql和oracle处理数据太慢,着急想要处理结果,搭建个大数据环境处理吧,不使用快速搭建平台
环境 | centos7.4 |
待处理的关系型数据库 | mysql |
目录结构 | |--bigdata |--install :安装目录 |--software :软件包存放位置 |--test :测试目录 |
ip及主机名 | 192.168.126.128 master(单机版和集群安装区别不大) |
用户 | hadoop |
提前安装 | jdk |
- 安装搭建
hadoop的搭建,现在已经3.0了(很优秀),先安装个低版本的吧
2.hadoop 的安装:
1>.配置环境变量
HADOOP_HOME=/home/hadoop3/bigdata/install/hadoop-2.6.0-cdh5.7.0
export PATH=$HADOOP_HOME/bin:$PATH
2>.修改配置文件
1>>.core-site.xml:
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/install/hadoop-2.7.6/data</value>
</property>
2>>.hadoop-env.sh
JAVA_HOME=/home/hadoop3/bigdata/install/jdk1.8.0_102
3>>.hdfs-site.xml
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
4>>.mapred-site.xml
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
5>>.yarn-site.xml
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
3>.ssh 设置免密码登陆
查看是否已经设置
ssh master
1>.生成密钥对
ssh-keygen -t rsa
2>.将公钥发送出去
ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop3@master
3>.测试
ssh master
4>.格式化namenode
hdfs namenode -format
5>.hadoop 启动 测试
$HADOOP_HOME/sbin/start-all.sh
6> jps查看进程
jps 正常启动 5个3个hdfs2个yarn
7>. 正常启动后测试命令:
本地创建 person.txt
1,zhangsan ,F
2,lisi,M
3,wangwu,F
hadoop fs -ls / :查看
hadoop fs -mkdir /input :创建文件夹
hadoop fs -put person.txt /input :推送文件
hadoop fs -cat /input/person.txt :查看文件
hadoop fs -rmr /input/* :删除
2.hive的安装及测试
1>.解压
2>.配置环境变量
3>.在mysql中创建用户hive和hive(database)
4>.添加conf/hive-site.xml的配置文件
hive的元数据存储支持derby数据库,公司常用mysql做hive元数据的存储
官网在哪里找?hive的配置?
hive.apache.org-》Hive wiki.-》Administrator Documentation-》Setting Up Metastore-》搜索mysql
修改hive-site.xml配置文件
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost:3306/hive?useSSL=false</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>Mysql_01</value>
</property>
</configuration>
5>. mysql连接的jar导入lib
6>.数据初始化(mysql中存放的是hive的元数据)
bin/schematool -dbType mysql -initSchema
7>测试
hive
查看表
show tables;
show databases;
hive的基本数据类型:在官网找:hive.apache.org--> Hive wiki.==>UserDocumentation==>Data Types
hive的测试:
1.创建表(外部表和内部表)
create table stu(id int,username string) row format delimited fields terminated by ','
location '/input/person'
create external table person_w (id int,username string,sex Char(1)) row format delimited fields terminated by ',' location '/input/person_w'
1.1.查看表的结构
desc person
desc formatted person
1.2.表数据的存储位置:
hdfs://master:9000/user/hive/warehouse/person
hdfs://master:9000/user/hive/warehouse/person_w
1.3.查看区别:
drop table person;
drop table person_w;
1.4.查看数据文件是否还在
hadoop fs -ls /user/hive/warehouse
2.数据的导入(本地数据和hdfs上的数据)(本地加local)
load data local inpath '/home/hadoop3/bigdata/test/person.txt' into table person_w
3.分区
create external table person_p (id int,username string,sex Char(1)) partitioned by (dt String) row format delimited fields terminated by ',' location '/input/person_w'
3.1查看结构
desc person_p;
(X) load data local inpath '/home/hadoop3/bigdata/test/person.txt' into table person_p
(v) load data local inpath '/home/hadoop3/bigdata/test/person.txt' into table person_p partition (dt="20180727");
3.2写入两份数据
load data local inpath '/home/hadoop3/bigdata/test/person.txt' into table person_p partition (t="20180726");
3.3 查询:
select * from person_p where t=20180727
3.4查看存储
desc formatted person_p
hadoop fs -ls /input/person_w
3.5 存储方式
/input/person_w/t=20180726
/input/person_w/t=20180727
3.6查看分区数:
show partitions person_p;
分区的好处:不用扫描整个表,减少时间消耗
hive的存储:
hive=====hdfs
表=======目录
分区=====目录
数据======文件
分区如果是多级呢?
hive> create table par_tab_muilt (name string, nation string) partitioned by (sex string,dt string) row format delimited fields terminated by ',' ;
hive> load data local inpath '/home/hadoop/files/par_tab.txt' into table par_tab_muilt partition (sex='man',dt='2017-03-29');
hdfs上查看多级分区的结构:
hadoop dfs -lsr /user/hive/warehouse/par_tab_muilt
/user/hive/warehouse/par_tab_muilt/sex=man
/user/hive/warehouse/par_tab_muilt/sex=man/dt=2017-03-29
/user/hive/warehouse/par_tab_muilt/sex=man/dt=2017-03-29/par_tab.txt
可见,新建表的时候定义的分区顺序,决定了文件目录顺序(谁是父目录谁是子目录),正因为有了这个层级关系,当我们查询所有man的时候,man以下的所有日期下的数据都会被查出来。如果只查询日期分区,但父目录sex=man和sex=woman都有该日期的数据,那么Hive会对输入路径进行修剪,从而只扫描日期分区,性别分区不作过滤(即查询结果包含了所有性别)。
动态分区:
启动动态分区功能
set hive.exec.dynamic.partition=true; --启用动态分区
set hive.exec.dynamic.partition.mode=nonstrict; --可以全部为动态分区
1.创建普通表
create external table usertable(id int,username string,birdata string,sex char(1)) row format delimited fields terminated by ',' location '/input/user' ;
1 zhangsan 2018-01-01 M
2 lisi 2018-02-01 F
3 wangwu 2018-01-01 F
4 zhaoli 2018-03-01 F
2.插入数据
load data local inpath '/home/hadoop3/bigdata/test/student_dp.txt' into table usertable;
创建动态分区表
create external table user_p (id int,username string) partitioned by (birdata String,sex string) row format delimited fields terminated by ',' location '/input/user_p'
3.表中数据插入到动态分区
insert overwrite table user_p partition(birdata,sex) select * from usertable;
4.sqoop的安装
1>.解压
2>.配置环境变量
3>.修改配置文件
修改conf/sqoop-env.sh
export HADOOP_COMMON_HOME=/home/hadoop3/bigdata/install/hadoop-2.6.0-cdh5.7.0
export HADOOP_MAPRED_HOME=/home/hadoop3/bigdata/install/hadoop-2.6.0-cdh5.7.0
export HIVE_HOME=/home/hadoop3/bigdata/install/apache-hive-2.3.3-bin
4>.lib下添加连接mysql的jar
5>.测试
1>>.在mysql上创建两个表
user表
id username
---------------
1, 'zhangsan'
2, 'lisi'
3, 'wangwu'
food表
id foodname, price
-------------------
1, 'apple', '11'
2, 'banana', '12'
3, 'orange', '13'
4, 'mango', '14'
shopping 表
id,fid,uid
--------------
1, 1, 1
2, 2, 1
3, 3, 1
4, 1, 2
5, 4, 2
6, 2, 3
查询:每个用户的消费情况
select c.username,m.money from user c
LEFT JOIN (
select a.uid,sum(price) money from shopping a
left JOIN
food b
on
a.fid=b.id
GROUP BY uid
)m
ON
m.uid=c.id
2>>sqoop 数据导入hdfs:
导入:
sqoop import --connect jdbc:mysql://localhost:3306/hive_test --username root --password Mysql_01 --table food --target-dir /input/food
参数不会写可以用help命令
--target-dir 指定上传的路径 /20180702/student
--append 追加
--delete-target-dir 删除再添加
-m 1 :map的任务个数,默认四个map,数据量少耗时,所以一般会指定文件存hdfs的位置及map数
3>>.sqoop 数据导入到hive:
sqoop import --connect jdbc:mysql://localhost:3306/hive_test --username root --password Mysql_01 --table food -m 1 --hive-import --target-dir /input/food
等价于,数据导入hdfs,在hive中创建表,在删除hdfs上的数据
一些参数:
--target-dir参数来指定临时目录
--hive-overwrite:覆盖原先的数据
--fields-terminated-by:改变导入数据的分隔符
mysql中的数据导入到hdfs中,默认使用的分隔符是逗号
4>>.将三个表全部导入hive
sqoop import --connect jdbc:mysql://localhost:3306/hive_test --username root --password Mysql_01 --table food -m 1 --hive-import --target-dir /input/food
sqoop import --connect jdbc:mysql://localhost:3306/hive_test --username root --password Mysql_01 --table user -m 1 --hive-import --target-dir /input/user
sqoop import --connect jdbc:mysql://localhost:3306/hive_test --username root --password Mysql_01 --table shopping -m 1 --hive-import --target-dir /input/shopping
5>>.测试在mysql中写的语句,hive中也可测试,hive中可用整个流程成功
select c.username,m.money from user c
LEFT JOIN (
select a.uid,sum(price) money from shopping a
left JOIN
food b
on
a.fid=b.id
GROUP BY uid
)m
ON
m.uid=c.id
最后一步要设置定时任务使用crontab,当然你可以使用azkaban或者oozie
crontab -e
编写一下,设置执行时间,当然执行时间一般设置一天执行一次
"0 0 1 * * ?" /data/test/testall
- 可能遇见的问题
hive的问题:
sqoop能导数据到hdfs,hive单独使用也不报错,但是sqoop不能直接导mysql的数据到hive(不提前创建表)
也不能用sqoop在hive中创建表,所以怀疑sqoop和hive的版本不对应,换了n个版本的sqoop和hive问题依旧
原因:hive连接mysql的的jar(在lib下)sqoop中的版本和hive中的版本一致
原先用:mysql-connector-java-5.1.36.jar
更换:mysql-connector-java-5.1.41-bin.jar 提升了连接的版本
权限不够的问题:
我原先用过hadoop用户又强制删除了
Caused by: java.net.BindException: 地址已在使用
解决方法:
可以查看自己端口的使用情况
netstat -alnp | grep 50010
然后清掉对应的进程即可
kill -9 1252
hadoop进程启动不完全问题:
修改数据文件
$HADOOP_HOME/data/dfs/name/VERSION
将name/current下的VERSION中的clusterID复制到data/current下的VERSION中,覆盖掉原来的clusterID
2.如果hdfs或者yarn启动不起来,要去查看日志,日志的位置$HADOOP_HOME/logs下查看,那个没起起来就去查看对应的.log结尾的日志
sqoop的导数据制表符问题:
文件是以制表符"/t"分开的还是以”/001“,制表符是tab键分割
sqoop缺主键问题:
Error during import: No primary key could be found for tablescore. Please specify one with --split-by or perform a sequential import with'-m 1'. 缺主键造成的。
- 搭建及入门视频