一、使用PigLatin语句来分析数据
注意:类似Spark RDD的算子(方法、函数)
Spark的算子两种类型:
()Transformation:不会触发计算
()Action:会触发计算
注意:启动Yarn的history server
mr-jobhistory-daemon.sh start historyserver
web界面查看:http://ip:19888/jobhistory
1、常用的PigLatin:有些会触发计算、有些不会
语句 | 解释说明 |
---|---|
load | 加载数据并生产表 |
foreach | 相当于循环,对bag中的每一条tuple进行处理, Spark:RDD.foreach |
filter | 过滤, Spark:RDD.filter |
group by | 分组 |
join | 连接操作 |
union/intersect | 集合运算 |
dump | 将结果打印屏幕 |
store | 将结果输出到文件 |
generate | 提取列值 |
2、举例:数据:员工表、部门表
7654,MARTIN,SALESMAN,7698,1981/9/28,1250,1400,30
(*)加载员工数据到员工表
emp = load '/scott/emp.csv';
表结构
grunt> describe emp;
Schema for emp unknown.
grunt>
加载数据到员工表,并指定结构
emp = load '/scott/emp.csv' as(empno,ename,job,mgr,hiredate,sal,comm,deptno);
默认的数据类型:字节数组
加载数据到员工表,并指定结构和数据的类型
emp = load '/scott/emp.csv' using PigStorage(',') as(empno:int,ename:chararray,job:chararray,mgr:int,hiredate:chararray,sal:int,comm:int,deptno:int);
创建部门表
dept = load '/scott/dept.csv' using PigStorage(',') as(deptno:int,dname:chararray,loc:chararray);
(*)查询员工信息:员工号,姓名,薪水
SQL:select empno,ename,sal from emp;
PL: emp1 = foreach emp generate empno,ename,sal;
(*)查询员工信息,按照月薪排序
SQL: select * from emp order by sal;
PL: emp2 = order emp by sal;
dump emp2;
(*)分组:求每个部门的工资最大值
SQL: select deptno,max(sal) from emp group by deptno;
PL: 第一步:分组
emp3 = group emp by deptno;
结构
emp3: {group: int,
emp: {(empno: int,ename: chararray,job: chararray,mgr: int,hiredate: chararray,sal: int,comm: int,deptno: int)}}
数据:
(10,{(7934,MILLER,CLERK,7782,1982/1/23,1300,0,10),
(7839,KING,PRESIDENT,-1,1981/11/17,5000,0,10),
(7782,CLARK,MANAGER,7839,1981/6/9,2450,0,10)})
(20,{(7876,ADAMS,CLERK,7788,1987/5/23,1100,0,20),
(7788,SCOTT,ANALYST,7566,1987/4/19,3000,0,20),
(7369,SMITH,CLERK,7902,1980/12/17,800,0,20),
(7566,JONES,MANAGER,7839,1981/4/2,2975,0,20),
(7902,FORD,ANALYST,7566,1981/12/3,3000,0,20)})
(30,{(7844,TURNER,SALESMAN,7698,1981/9/8,1500,0,30),
(7499,ALLEN,SALESMAN,7698,1981/2/20,1600,300,30),
(7698,BLAKE,MANAGER,7839,1981/5/1,2850,0,30),
(7654,MARTIN,SALESMAN,7698,1981/9/28,1250,1400,30),
(7521,WARD,SALESMAN,7698,1981/2/22,1250,500,30),
(7900,JAMES,CLERK,7698,1981/12/3,950,0,30)})
第二步:求每个部门的工资最大值
emp4 = foreach emp3 generate group,MAX(emp.sal);
(*)查询10号部门的员工
SQL: select * from emp where deptno=10;
PL: emp5 = filter emp by deptno==10; 注意:两个等号
(*)多表查询
查询员工信息:员工姓名、部门名称
SQL:select dname,ename from emp,dept where emp.deptno=dept.deptno;
PL:emp6 = join dept by deptno,emp by deptno;
emp7 = foreach emp6 generate dept::dname,emp::ename;
(*)执行:WordCount单词计数
① 加载数据
mydata = load '/input/data.txt' as (line:chararray);
② 将字符串分割成单词
words = foreach mydata generate flatten(TOKENIZE(line)) as word;
③ 对单词进行分组
grpd = group words by word;
④ 统计每组中单词数量
cntd = foreach grpd generate group,COUNT(words);
⑤ 打印结果
dump cntd;
注意:PigLatin中,bag具有依赖关系
Spark中,RDD也具有依赖关系(宽依赖、窄依赖)
二、Pig的自定义函数:三种
1、自定义的过滤函数
2、自定义的运算函数
3、(最麻烦)自定义的加载函数
(*)默认:load语句加载数据,一行会被加载成一个Tuple
(*)需要MapReduce的库(jar文件)
需要的jar包:
/root/training/pig-0.14.0/pig-0.14.0-core-h2.jar
/root/training/pig-0.14.0/lib
/root/training/pig-0.14.0/lib/h2
/root/training/hadoop-2.4.1/share/hadoop/common
/root/training/hadoop-2.4.1/share/hadoop/common/lib
三、Sqoop
1、是数据交换工具:RDBMS <----> Sqoop <---> HDFS(HBase、Hive等等)
2、基于JDBC
3、执行数据交换的时候,本质是执行的是一个MapReduce
4、使用Oracle数据库:自带的测试数据
提供一个实验环境:安装Oracle
C:\oracle\product\10.2.0\db_1\jdbc\lib\ojdbc14.jar
注意:如果是Oracle数据库:大写:用户名、表名、列名
Sqoop安装部署
2)解压
tar -zxvf .tar
3)修改配置
vi sqoop-env.sh
export HADOOP_COMMON_HOME=/root/hd/hadoop-2.8.4
export HADOOP_MAPRED_HOME=/root/hd/hadoop-2.8.4
export HIVE_HOME=/root/hd/hive
export ZOOCFGDIR=/root/hd/zookeeper-3.4.10/conf
4)发送mysql驱动到lib下
5)检测是否安装成功
bin/sqoop help
Sqoop的import命令
1)数据从mysql中导入到hdfs当中
bin/sqoop import --connect jdbc:mysql://192.168.50.183:3306/sq --username root --password root --table user --target-dir /sqoop/datas --delete-tar get-dir --num-mappers 1 --fields-terminated-by "\t"
2)数据mysql中导入到hdfs当中进行筛选
bin/sqoop import --connect jdbc:mysql://192.168.50.183:3306/sq --username root --password root --target-dir /sqoop/selectdemo --delete-target-dir --num-mappers 1 --fields-terminated-by "\t" --query 'select * from user w here id<=1 and $CONDITIONS'
3)通过where筛选
bin/sqoop import --connect jdbc:mysql://192.168.50.183:3306/sq --username root --password root --target-dir /sqoop/selectdemo2 --delete-target-dir --num-mappers 1 --fields-terminated-by "\t" --table user --where "id<=1"
4)mysql导入到hive
需要先创建hive表
bin/sqoop import --connect jdbc:mysql://hd09-01:3306/sq --username root - -password root --table user1 --num-mappers 1 --hive-import --fields-termi nated-by "\t" --hive-overwrite --hive-table user_sqoop
问题:hiveconf
解决:
vi ~/.bash_profile
export HADOOP_CLASSPATH=$HADOOP_CLASSPASS:/root/hd/hive/lib/*
mysql权限问题:
grant all privileges on *.* to root@'%' identified by "password";
flush privileges;
Sqoop的export命令
需求:Hive/hdfs的数据导出到mysql
1)根据hive中的字段创建mysql表
2)编写sqoop启动命令
bin/sqoop export --connect jdbc:mysql://hd09-01:3306/sq --username root - -password root --table user1 --num-mappers 1 --export-dir /user/hive/ware house/user_sqoop --input-fields-terminated-by "\t"
3)mysql中查看数据是否导入
Sqoop打包脚本的使用
1)创建文件夹
mkdir sqoopjob
2)创建文件脚本
vi sqoop_job.opt
export
--connect
jdbc:mysql://hd09-01:3306/sq
--username
root
--password
root
--table
user1
--num-mappers
1
--export-dir
/user/hive/warehouse/user_sqoop
--input-fields-terminated-by
"\t"
注意:一行命令 一行值
3)执行脚本文件
bin/sqoop --options-file /root/sqoopjob/job_hdfs2mysql.opt
sqoop常用命令
命令说明
import 将数据导入到集群
export 将集群数据导出
codegen 将某数据库中表生成javaBean并打包为jar
eval 查看sql执行结果
createhivetable
创建hive表
importalltables
导入某个数据库中所有表到hdfs中
listtables
列出某个数据库下的所有表
merge 将hdfs中不同目录下的数据合并在一起
version V 查看sqoop版本
help 查看帮助信息
sqoop常用参数
参数说明
–connect 连接关系型数据库URL
–connectionmanager
指定连接管理类
–driver JDBC的driver class
–username 连接数据库的用户名
–password 连接数据库的密码
–verbose 在控制台中打印详细信息
–help 查看帮助
–hiveimport
将关系型数据库导入到hive表中
–hiveoverwrite
覆盖掉hive表中已存在的数据
–createhivetable
创建hive表
–hivetable
接入hive表
–table 指定关系型数据库的表名
5、Sqoop的命令
(*)codegen 将关系数据库表映射为一个Java文件、Java class类、以及相关的jar包
sqoop codegen --connect jdbc:oracle:thin:@192.168.157.163:1521/orcl --username SCOTT --password tiger --table EMP --outdir /root/temp
(*)create-hive-table 生成与关系数据库表的表结构对应的HIVE表
sqoop create-hive-table --connect jdbc:mysql://localhost:3306/test --table username --username root --password 123456 --hive-table test
(*)eval 以快速地使用SQL语句对关系数据库进行操作,这可以使得在使用import这种工具进行数据导入的时候,可以预先了解相关的SQL语句是否正确,并能将结果显示在控制台。
sqoop eval --connect jdbc:oracle:thin:@192.168.157.163:1521/orcl --username SCOTT --password tiger --query 'select * from emp'
(*)export 从hdfs中导数据到关系数据库中
(*)help
(*)import 将数据库表的数据导入到HDFS中
(1)导入EMP表,所有的列
sqoop import --connect jdbc:oracle:thin:@192.168.157.163:1521/orcl --username SCOTT --password tiger --table EMP --target-dir /sqoop/import/emp1
(2)导入指定的列:员工号,姓名,薪水
sqoop import --connect jdbc:oracle:thin:@192.168.157.163:1521/orcl --username SCOTT --password tiger --table EMP --columns EMPNO,ENAME,SAL --target-dir /sqoop/import/emp2
(3)导入订单表:大概有92万数据
sqoop import --connect jdbc:oracle:thin:@192.168.157.163:1521/orcl --username SH --password sh --table SALES --target-dir /sqoop/import/sales -m 1
错误
ERROR tool.ImportTool: Error during import: No primary key could be found for table SALES. Please specify one with --split-by or perform a sequential import with '-m 1'.
(*)import-all-tables 将数据库中所有的表的数据导入到HDFS中
(*)job 用来生成一个sqoop的任务,生成后,该任务并不执行,除非使用命令执行该任务。
(*)list-databases 打印出关系数据库所有的数据库名
(*)list-tables 打印出关系数据库某一数据库的所有表名
(*)merge 将HDFS中不同目录下面的数据合在一起,并存放在指定的目录中
(*)metastore 记录sqoop job的元数据信息
(*)version 显示sqoop版本信息
sqoop version
create table user(uid int primary key auto_increment,
uname varchar(20), addr varchar(100));
1.把mysql数据导入到hdfs中:
bin/sqoop import
--connect jdbc:mysql://master:3306/sq
--username root
--password root
--table user
--target-dir /sqoop/datas
--delete-target-dir
--num-mappers 1
--fields-terminated-by "\t"
2.把MySQL数据导入到hdfs中进行筛选:
bin/sqoop import
--connect jdbc:mysql://master:3306/sq
--username root
--password root
--target-dir /sqoop/selectdemo
--delete-target-dir
--num-mappers 1
--fields-terminated-by "\t"
--query 'select * from user where uid<=1 and $CONDITIONS'
和上面这个作用相同:
bin/sqoop import --connect jdbc:mysql://master:3306/sq --username root --password root --target-dir /sqoop/selectdemo --delete-target-dir --num-mappers 1 --fields-terminated-by "\t" --table user --where 'uid<=1'
注意会出现hive配置有问题:
vim ~/.bash_profile 添加下面这句话:
export HADOOP_CLASSPATH=$HADOOP_CLASSPASS:/root/hive-1.2.2/lib/*
然后 source ~/.bash_profile使文件生效.
3.把MySQL数据导入到hive中
bin/sqoop import --connect jdbc:mysql://master:3306/sq --username root --password root --table user --num-mappers 1 --hive-import --fields-terminated-by "\t" --hive-overwrite --hive-table user_sqoop
4.把hdfs或hive中数据导入到MySQL中:
bin/sqoop export --connect jdbc:mysql://master:3306/sq --username root --password root --table user --num-mappers 1 --export-dir /user/hive/warehouse/user_sqoop --input-fields-terminated-by "\t"
5.使用脚本文件避免写很多命令执行数据转移:
/root/sqoopjob/job_hdfs2mysql.opt 这个文件内容:(注意每一行只能有一个参数)
export
--connect
jdbc:mysql://master:3306/sq
--username
root
--password
root
--table
user
--num-mappers
1
--export-dir
/user/hive/warehouse/user_sqoop
--input-fields-terminated-by
"\t"
然后执行脚本文件:
bin/sqoop --options-file /root/sqoopjob/job_hdfs2mysql.opt
1.配置SSL:
keytool -keystore keystore -alias jetty -genkey -keyalg RSA
<user username="admin" password="password" roles="admin,metrics">
四、Flume:采集日志
1)官网地址
http://flume.apache.org/
2)日志采集工具
Flume是一种分布式,可靠且可用的服务,用于有效地收集,聚合和移动大量日志数据。它具有基于
流数据流的简单灵活的架构。它具有可靠的可靠性机制和许多故障转移和恢复机制,具有强大的容错
能力。它使用简单的可扩展数据模型,允许在线分析应用程序。
3)为什么需要flume
数据从哪里来?
-》爬虫
-》日志数据 flume
-》传统型数据库 sqoop
4)flume架构
source:数据源
产生数据流,同时source将产生的数据流传输到channel
channel:传输通道
用于桥接Source和sinks
sinks:下沉
从channel收集数据
event:传输单元
Flume数据传传输的基本单元,以事件的形式将数据送往目的地。
Flume安装部署
1)下载安装包
http://archive.apache.org/dist/flume/1.6.0/
2)上传到linux
alt+p
3)解压
tar -zxvf .tar
4)重命名
mv flume-env.sh.template flume-env.sh
5)修改配置文件
export JAVA_HOME=/root/hd/jdk1.8.0_141
Flume监听端口
1)安装telnet
yum search telnet
yum intsall telnet.x86_64
2)写配置文件
flumejob_telnet.conf
3)启动
bin/flume-ng agent --conf conf/ --name a1 --conf-file conf/flumejob_telne t.conf -Dflume.root.logger==INFO,console
4)发送数据
telnet localhost 44444
5)查看
实时的采集文件到HDFS
启动
bin/flume-ng agent --conf conf/ --name a1 --confile conf/flumejob_hdfs.conf
实时监听文件夹
bin/flume-ng agent --conf conf/ --name a1 --confile conf/flumejob_dir.conf
多个channel/sink
需求:监控hive.log文件,用同时产生两个channel,一个channel对应的sink存储到hdfs中, 另外一个channel对应的sink存储到本地。
flume配置文件:a4.conf
#bin/flume-ng agent -n a4 -f myagent/a4.conf -c conf -Dflume.root.logger=INFO,console
#定义agent名, source、channel、sink的名称
a4.sources = r1
a4.channels = c1
a4.sinks = k1
#具体定义source
a4.sources.r1.type = spooldir
a4.sources.r1.spoolDir = /root/training/logs
#具体定义channel
a4.channels.c1.type = memory
a4.channels.c1.capacity = 10000
a4.channels.c1.transactionCapacity = 100
#定义拦截器,为消息添加时间戳
a4.sources.r1.interceptors = i1
a4.sources.r1.interceptors.i1.type = org.apache.flume.interceptor.TimestampInterceptor$Builder
#具体定义sink
a4.sinks.k1.type = hdfs
a4.sinks.k1.hdfs.path = hdfs://192.168.157.111:9000/flume/%Y%m%d
a4.sinks.k1.hdfs.filePrefix = events-
a4.sinks.k1.hdfs.fileType = DataStream
#不按照条数生成文件
a4.sinks.k1.hdfs.rollCount = 0
#HDFS上的文件达到128M时生成一个文件
a4.sinks.k1.hdfs.rollSize = 134217728
#HDFS上的文件达到60秒生成一个文件
a4.sinks.k1.hdfs.rollInterval = 60
#组装source、channel、sink
a4.sources.r1.channels = c1
a4.sinks.k1.channel = c1