Sqoop的工作机制是将导入或者导出的命令翻译成MapReduce实现,Sqoop可以理解为:SQL到Hadoop或者Hadoop到SQL
配置文件修改:
cd $SQOOP_HOME/conf
mv sqoop-env-template.sh sqoop-env.sh
vi sqoop-env.sh
export HADOOP_COMMON_HOME= /export/servers/hadoop-2.7.5
export HADOOP_MAPRED_HOME= /export/servers/hadoop-2.7.5
export HIVE_HOME= /export/servers/hive
加入 mysql 的 jdbc 驱动包
cp /hive/lib/mysql-connector-java-5.1.32.jar $SQOOP_HOME/lib/
验证启动
注意,sqoop验证的命令必须要在一行写完,此处我使用了\来表示一行
bin/sqoop list-databases \
--connect jdbc:mysql://localhost:3306/ \
--username root --password hadoop
本命令会列出所有 mysql 的数据库。
到这里,整个 Sqoop 安装工作完成。
bin/sqoop import \
--connect jdbc:mysql://node03:3306/userdb \
--username root \
--password 123456 \
--target-dir /sqoopresult214 \
--fields-terminated-by '\t' \
--split-by id \
--table emp --m 2
使用 query sql 语句来进行查找不能加参数--table ; 并且必须要添加 where 条件; 并且 where 条件后面必须带一个$CONDITIONS 这个字符串; 并且这个 sql 语句必须用单引号,不能用双引号;
所谓的增量数据指的是上次至今中间新增加的数据
sqoop支持两种模式的增量导入
关于lastmodified 中的两种模式:
注意:导出的目标表需要自己手动提前创建 也就是sqoop并不会帮我们创建复制表结构
导出有三种模式:
相关配置参数:
updateonly 只更新已经存在的数据 不会执行insert增加新的数据
allowinsert 更新已有的数据 插入新的数据 底层相当于insert&update
在这里,我们创建一个名为myjob,这可以从RDBMS表的数据导入到HDFS作业。下面的命令用于创建一个从DB数据库的employee表导入到HDFS文件的作业。
bin/sqoop job --create itcastjob1 -- import --connect jdbc:mysql://node-1:3306/userdb \
--username root \
--password hadoop \
--target-dir /sqoopresult555 \
--table emp --m 1
注意import前要有空格
‘--list’ 参数是用来验证保存的作业。下面的命令用来验证保存Sqoop作业的列表。
bin/sqoop job --list
它显示了保存作业列表。
Available jobs: myjob
‘--show’ 参数用于检查或验证特定的工作,及其详细信息。以下命令和样本输出用来验证一个名为myjob的作业。
bin/sqoop job --show myjob
它显示了工具和它们的选择,这是使用在myjob中作业情况。
Job: myjob Tool: import Options: ---------------------------- direct.import = true codegen.input.delimiters.record = 0 hdfs.append.dir = false db.table = employee ... incremental.last.value = 1206 ...
bin/sqoop job --delete jobname
‘--exec’ 选项用于执行保存的作业。下面的命令用于执行保存的作业称为myjob。
bin/sqoop job --exec myjob sqoop需要输入mysql密码 它会显示下面的输出。
10/08/19 13:08:45 INFO tool.CodeGenTool: Beginning code generation ...
sqoop在创建job时,使用--password-file参数,可以避免输入mysql密码,如果使用--password将出现警告,并且每次都要手动输入密码才能执行job,sqoop规定密码文件必须存放在HDFS上,并且权限必须是400。
echo -n "hadoop" > itcastmysql.pwd hdfs dfs -mkdir -p /input/sqoop/pwd/ hdfs dfs -put itcastmysql.pwd /input/sqoop/pwd/ hdfs dfs -chmod 400 /input/sqoop/pwd/itcastmysql.pwd
sqoop.metastore.client.record.password
true
If true, allow saved passwords in the metastore.
在创建job时,使用--password-file参数
bin/sqoop job --create itcastjob2 -- import --connect jdbc:mysql://node03:3306/userdb \
--username root \
--password-file /input/sqoop/pwd/itcastmysql.pwd \
--target-dir /sqoopresult666 \
--table emp --m 1
通过命令验证
sqoop job -exec itcastjob1
在conf/flume-env.sh 中导入java环境变量
保证flume工作的时候一定可以正确加载到环境变量
bin/flume-ng agent --conf conf --conf-file conf/netcat-logger.conf --name a1 -Dflume.root.logger=INFO,console
案例:监控目录数据变化到hdfs
hdfs sink 配置文件编写
# Name the components on this agent
a1.sources = r1
a1.sinks = k1
a1.channels = c1# Describe/configure the source
##注意:不能往监控目中重复丢同名文件
a1.sources.r1.type = spooldir
a1.sources.r1.spoolDir = /root/logs2
a1.sources.r1.fileHeader = true# Describe the sink
a1.sinks.k1.type = hdfs
a1.sinks.k1.channel = c1
a1.sinks.k1.hdfs.path = /flume/events/%y-%m-%d/%H%M/
a1.sinks.k1.hdfs.filePrefix = events-
a1.sinks.k1.hdfs.round = true
a1.sinks.k1.hdfs.roundValue = 10
a1.sinks.k1.hdfs.roundUnit = minute
a1.sinks.k1.hdfs.rollInterval = 3
a1.sinks.k1.hdfs.rollSize = 20
a1.sinks.k1.hdfs.rollCount = 5
a1.sinks.k1.hdfs.batchSize = 1
a1.sinks.k1.hdfs.useLocalTimeStamp = true
#生成的文件类型,默认是Sequencefile,可用DataStream,则为普通文本
a1.sinks.k1.hdfs.fileType = DataStream# Use a channel which buffers events in memory
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100# Bind the source and sink to the channel
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
spooldir source
flume串联跨网络传输数据
avro sink 和 avro source
使用上述两个组件指定绑定的端口ip就可以满足数据跨网络的传递 通常用于flume串联架构中
flume串联启动通常从远离数据源的一端启动
如果没有使用静态拦截器 Event: { headers:{} body: 36 Sun Jun 2 18:26 } 使用静态拦截器之后 自己添加kv标识对 Event: { headers:{type=access} body: 36 Sun Jun 2 18:26 } Event: { headers:{type=nginx} body: 36 Sun Jun 2 18:26 } Event: { headers:{type=web} body: 36 Sun Jun 2 18:26 }
后续在存放数据的时候可以使用flume的规则语法获取到拦截器添加的kv内容
%{type}
模拟数据实时产生
while true; do echo "access access....." >> /root/logs/access.log;sleep 0.5;done
while true; do echo "web web....." >> /root/logs/web.log;sleep 0.5;done
while true; do echo "nginx nginx....." >> /root/logs/nginx.log;sleep 0.5;done
是由领英推出的一款免费开源的工作流调度软件
单节点部署模式 注意时区 内存检测要关闭
启动时必须在安装包的根目录下启动
bin/start-solo.sh
Azkaban的开发流程:
type=command
.......
command=xxxx
2.two server模式部署
该模式的特点是web服务器和executor服务器分别位于不同的进程中
使用第三方的数据库进行数据的保存 :mysql
安装部署注意事项
先对mysql进行初始化操作
配置azkaban.properties 注意时区 mysql相关 ssl
启动时候注意需要自己手动的激活executor服务器 在根目录下启动
如果启动出错 通过安装包根目录下的日志进行判断
访问的页面https
特别注意:executor启动(包括重启)的时候 默认不会激活 需要自己手动激活对应的mysql中的表executors active :0 表示未激活 1表示激活可以自己手动修改数据提交激活 也可以使用官方的命令请求激活curl -G "node03:$(<./executor.port)/executor?action=activate" && echo
azkaban调度总结
理论上任何一款软件,只有可以通过shell command执行 都可以转化成为azkaban的调度执行
type=command command = sh xxx.sh
ooize核心配置是在应该workflow.xml文件中顶一个工作流程规则
类型:
修改 hadoop 的配置文件 core-site.xml
hadoop.proxyuser.root.hosts
*
hadoop.proxyuser.root.groups
*
修改 hadoop 的配置文件 mapred-site.xml
mapreduce.jobhistory.address
node01:10020
MapReduce JobHistory Server IPC host:port
mapreduce.jobhistory.webapp.address
node01:19888
MapReduce JobHistory Server Web UI host:port
mapreduce.jobhistory.done-dir
/export/data/history/done
mapreduce.jobhistory.intermediate-done-dir
/export/data/history/done_intermediate
启动 history-server
mr-jobhistory-daemon.sh start historyserver
停止 history-server
mr-jobhistory-daemon.sh stop historyserver
通过浏览器访问 Hadoop Jobhistory 的 WEBUI
http://node-1:19888
上传 oozie 的安装包并解压
oozie 的安装包上传到/export/softwares
tar -zxvf oozie-4.1.0-cdh5.14.0.tar.gz
解压 hadooplibs 到与 oozie 平行的目录
cd /export/servers/oozie-4.1.0-cdh5.14.0
tar -zxvf oozie-hadooplibs-4.1.0-cdh5.14.0.tar.gz -C ../
添加相关依赖
oozie 的安装路径下创建 libext 目录
cd /export/servers/oozie-4.1.0-cdh5.14.0
mkdir -p libext
拷贝 hadoop 依赖包到 libext
cd /export/servers/oozie-4.1.0-cdh5.14.0
cp -ra hadooplibs/hadooplib-2.6.0-cdh5.14.0.oozie-4.1.0-
cdh5.14.0/* libext/
上传 mysql 的驱动包到 libext
mysql-connector-java-5.1.32.jar
添加 ext-2.2.zip 压缩包到 libext
ext-2.2.zip
cd /export/servers/oozie-4.1.0-cdh5.14.0/conf
vim oozie-site.xml
oozie 默认使用的是 UTC 的时区,需要在 oozie-site.xml 当中配置时区为
GMT+0800 时区
oozie.service.JPAService.jdbc.driver
com.mysql.jdbc.Driver
oozie.service.JPAService.jdbc.url
jdbc:mysql://node03:3306/oozie
oozie.service.JPAService.jdbc.username
root
oozie.service.JPAService.jdbc.password
hadoop
oozie.processing.timezone
GMT+0800
oozie.service.coord.check.maximum.frequency
false
oozie.service.HadoopAccessorService.hadoop.configurations
*=/export/servers/hadoop-2.7.5/etc/hadoop
上传 oozie 的解压后目录的下的 yarn.tar.gz 到 hdfs 目录
bin/oozie-setup.sh sharelib create -fs hdfs://node01:9000 -
locallib oozie-sharelib-4.1.0-cdh5.14.0-yarn.tar.gz
本质上就是将这些 jar 包解压到了 hdfs 上面的路径下面去
创建 mysql 数据库
mysql -uroot -p
create database oozie;
初始化创建 oozie 的数据库表
cd /export/servers/oozie-4.1.0-cdh5.14.0
bin/oozie-setup.sh db create -run -sqlfile oozie.sql
cd /export/servers/oozie-4.1.0-cdh5.14.0
bin/oozie-setup.sh prepare-war
5.7 配置 oozie 环境变量
vim /etc/profile
export OOZIE_HOME=/export/servers/oozie-4.1.0-cdh5.14.0
export OOZIE_URL=http://node03.hadoop.com:11000/oozie
export PATH=$PATH:$OOZIE_HOME/bin
source /etc/profile
启动命令
cd /export/servers/oozie-4.1.0-cdh5.14.0
bin/oozied.sh start
关闭命令
bin/oozied.sh stop
启动的时候产生的 pid 文件,如果是 kill 方式关闭进程 则需要删除该文件
重新启动,否则再次启动会报错。
http://node-1:11000/oozie/
页面访问的时候,发现 oozie 使用的还是 GMT 的时区,与我们现在的时区
相差一定的时间,所以需要调整一个 js 的获取时区的方法,将其改成我们现在的
时区。
修改 js 当中的时区问题
cd oozie-server/webapps/oozie
vim oozie-console.js
function getTimeZone() {
Ext.state.Manager.setProvider(new Ext.state.CookieProvider());
return Ext.state.Manager.get("TimezoneId","GMT+0800");
}
重启 oozie 即可
cd /export/servers/oozie-4.1.0-cdh5.14.0
bin/oozied.sh stop
bin/oozied.sh start