人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新)
由于sqoop需要通过MR才能把数据从一个数据库导出到另外一个数据库,所以需要启动hdfs和yarn
1.启动 hdfs 集群:(在主节点的机器上执行)
cd /root/hadoop/sbin
./start-dfs.sh
2.启动yarn集群:(在主节点的机器上执行)
cd /root/hadoop/sbin
./start-yarn.sh
3.停止 hdfs 集群:
cd /root/hadoop/sbin
./stop-dfs.sh
4.停止 yarn 集群:
cd /root/hadoop/sbin
./stop-yarn.sh
5.hdfs dfsadmin -safemode 打印 hdfs dfsadmin [-safemode enter | leave | get | wait | forceExit]
获取状态:hdfs dfsadmin -safemode get 打印 Safe mode is OFF
6.hadoop job -list
列出 hadoop 中运行的 程序
hadoop job -kill
停止掉 hadoop中运行的程序
7.hdfs、yarn web UI 页面
http://node1:50070
http://node1:8088
====================================================================================
aliyun下载地址:http://mirrors.aliyun.com/apache/sqoop/
需要下载
sqoop-1.4.7.tar.gz
sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz
官网地址:http://sqoop.apache.org/
mysql connector驱动jar包 mysql-connector-java-5.1.49 下载地址:https://dev.mysql.com/downloads/connector/j/5.1.html
oracle jdbc连接驱动jar包 下载地址:
https://www.oracle.com/database/technologies/appdev/jdbc-downloads.html
https://repo1.maven.org/maven2/com/oracle/database/
1.tar -zxvf sqoop-1.4.7.tar.gz
mv sqoop-1.4.7 sqoop
或者 更推荐
tar -zxvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz
mv sqoop-1.4.7.bin__hadoop-2.6.0 sqoop
2.cd /root/sqoop/conf
cp sqoop-env-template.sh sqoop-env.sh
vim /root/sqoop/conf/sqoop-env.sh
export HADOOP_COMMON_HOME=/root/hadoop # hadoop的根目录的绝对路径
export HADOOP_MAPRED_HOME=/root/hadoop # hadoop的根目录的绝对路径
注意:
可以查看 vim /etc/profile 中的HADOOP路径配置。
写法一:
export SQOOP_HOME=/root/sqoop
export PATH=$PATH:$SQOOP_HOME/bin:$SQOOP_HOME/lib
写法二:
SQOOP_HOME=/root/sqoop
PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$FLINK_HOME/bin:$SQOOP_HOME/bin:$SQOOP_HOME/lib
export JAVA_HOME CLASSPATH PATH
保存配置文件,重新加载配置文件:source /etc/profile
3.拷贝mysql驱动包/oracle驱动包 到 /root/sqoop/lib中
mysql驱动包:mysql-connector-java-5.1.49.jar
oracle驱动包:ojdbc8.jar
4.sqoop连接mysql
cd /root/sqoop/bin
sqoop list-databases --connect jdbc:mysql://192.168.25.100:3306/ --username root --password admin
最后会打印出MySQL数据库中的所有的数据库名字
5.sqoop连接oracle
oracle登录命令:sqlplus c##rootuser/123456
是在 192.168.189.201 机器下安装oracle
测试Oracle连接:获取该用户下的所有databases
cd /root/sqoop/bin
./sqoop list-databases --connect jdbc:oracle:thin:@ip:port:sid --username 用户名 --password 密码
./sqoop list-databases --connect jdbc:oracle:thin:@192.168.189.201:1521:orcl --username c##rootuser --password 123456
./sqoop list-databases --connect jdbc:oracle:thin:@192.168.189.201:1521:xe --username c##rootuser --password 123456
1.错误:找不到或无法加载主类 org.apache.sqoop.Sqoop
解决:
把sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz 解压目录下的 sqoop-1.4.7.jar 拷贝到以下两个目录中
/root/hadoop/lib
/root/hadoop/share/hadoop/mapreduce/lib
2.错误:
Data Connector for Oracle and Hadoop is disabled.
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/avro/LogicalType
Caused by: java.lang.ClassNotFoundException: org.apache.avro.LogicalType
解决:
find ./ -name avro 可以查找当前目录下和所有子目录下的文件名
把 avro-1.8.1.jar 拷贝到 /root/sqoop/lib
(更建议使用sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz,而不是使用sqoop-1.4.7.tar.gz,
因为sqoop-1.4.7.bin__hadoop-2.6.0会包含更多的jar包)
3.错误:
The catalog view DBA_USERS was not found.
This may happen if the user does not have DBA privileges.
Please check privileges and try again.
解决:
很多时候我们用拥有DBA权限的用户 从oracle数据库导出数据,
那么再导入新的数据库时就还得需要DBA权限的用户,下面是如何创建一个新用户并授予DBA权限命令。
1.用有dba权限的用户登录:sys用户
2.创建一个新用户:
创建用户的时候用户名以c##或者C##开头即可。
create user c##或者C##开头的用户名 identified by 密码;
3.授予DBA权限:
1.grant connect,resource,dba to 用户名;
2.grant connect,resource,create any table,drop any table,create sequence,
select any table, create any index, drop any index,alter any trigger,
create any trigger, drop any trigger,alter any type, create any type,
drop any type,create any view, drop any view, create any directory,
create procedure, query rewrite, create session to 用户名;
4.以下查看操作,前提是你是有dba权限的帐号,如sys,system。
#查看数据库里面所有用户,
select * from dba_users;
#查看你能管理的所有用户!
select * from all_users;
#查看当前用户信息 !
select * from user_users;
6.执行import操作host:port:sid
sqoop import
--connect jdbc:oracle:thin:@host:port:sid
--username c##rootuser --password 123456 --table 表名(必须大写)
--target-dir hdfs多级目录 -m 1 --where "字段名=字段值 and 字段名=字段值"
参数解释:
--target-dir hdfs多级目录:
hdfs中可预先存在多级的父级目录,但最后一级的子目录必须预先不存在。
如果最后一级的子目录预先存在的话则会报错org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://node1:9000/。。。
-m 1:
map任务的数量,有多少个map任务就有多少个输出文件。
如果使用大于1的map任务的数量的话,则需要在命令加上 -Dorg.apache.sqoop.splitter.allow_text_splitter=true
例子:
sqoop import --connect jdbc:oracle:thin:@192.168.189.201:1521:xe --username c##rootuser --password 123456 --table STUDENT --target-dir /out -m 1
sqoop import --connect jdbc:oracle:thin:@192.168.189.201:1521:xe --username c##rootuser --password 123456 --table STUDENT --target-dir /out -m 1 --where "sno=103"
错误:
Generating splits for a textual index column allowed only in case of
"-Dorg.apache.sqoop.splitter.allow_text_splitter=true" property passed as a parameter
解决:
sqoop import -Dorg.apache.sqoop.splitter.allow_text_splitter=true --connect jdbc:oracle:thin:@192.168.189.201:1521:xe --username c##rootuser --password 123456 --table STUDENT --target-dir /out/o3 -m 4
说明:
1、导入的目录若已经存在则要先删除已经存在的目录,否则会报路径以存在的错误提示:
FileAlreadyExistsException:
Output directoryhdfs://master:8020/user/operate already exists
删除路径语句:hadoop fs –rmr /user/operate
如果多次导入同一个表中的数据,数据要以append的形式插入到HDFS目录中。
2、-m 1表示使用几个map任务处理,sqoop默认采用4个map任务,
有几个任务在HDFS中执行结果中就有几个part-m文件;若m值不等于1,则导入的表需要有主键,
否则会报错:
Error during import: No primary key could befound for table KW_CARENLIST.
Please specify one with --split-by or perform asequential import with '-m 1'.
sqoop是根据--splite-by <字段名>进行分区,--m设置map的数量,
sqoop根据不同的splite参数进行切分,然后将切分出来的区域分配到不同的map中。
Splite-by的参数类型不同则其切分方法不同,如int型,sqoop会取最大和最小splite-by字段。
Sqoop会向关系数据库发送一个命令;select max(id),min(id) from table,
然后会把max、min之间的区间平均分成m份,最后m个并行的map会执行任务。
--splite-by操作主键,如果操作的表没有主键导入时会报错。
splite-by对非数字类型的字段支持不好,一般用于主键及数字类型的字段
(对于非数字类型有可能会导致数据量丢失。如:a,b,c,d,e,a,a,v,f,g)。
在实例测试中,要导入的Oracle一张表(200多万条数据)中没有关键字,
若以数据表的最后一列(NUMBER类型,值存在null,存在重复值)为splite-by对象,
则最终检验导入的数据只有100多万条。
3、Sqoop默认从数据库导入到HDFS的分隔符是逗号,可用—field –terminated-by
来指定输出文件中的行字段分隔符。如果导入数据的字段内容中存在分隔符,
可以另外指定父、字段包围符和转转义字符。
4、空列的值使用null。Sqoop默认导入的数据格式为文本文件。
另可导入其他几种文件格式,如SequenceFile、Avro格式。
文本文件不能保存二进制字段(如数据库中类型为VARBINARY的列),
且在区分null值和null字符串时可能出现问题。
Avro和SequenceFile格式的文件能够为导入的数据提供最精确的表示方式,
同时还允许对数据进行压缩,并支持MapReduce并行处理同一文件的不同部分。
(不过目前版本还不能将Avro或Sequence文件加载到Hive中,尽管可以手动地将Avro数据文件加载到Hive中)。
SequenceFile文件格式的最后一个缺点是它只支持Java语言,而Avro数据文件却可以被很多语言支持。
5、Sqoop中的map数设置原则:一个表的数据抽取不超过3分钟,否则就增加map数。
7.辅助操作:
查看路径下文件:hadoop fs -ls /user/operate/
打开指定文件:hadoop fs –cat/user/operate/tabe_name
统计文件中行数:hadoop fs –cat /路径/文件名 |wc –l
sudo su -
su - hadoop 才能看到jps下的进程
hadoop dfs -ls 路径文件
hadoop fs -cat 路径文件
hadoop dfs -ls /buryPointsDataBackup/2020-07/2020-07-23/bury-points
hadoop fs -cat /buryPointsDataBackup/2020-07/2020-07-23/bury-points/prefix-2-204.ext
把 hdfs 文件 下载到 linux本地路径
hadoop dfs -get <本地文件>
hdfs dfs -get /buryPointsDataBackup/2020-07/2020-07-23/bury-points/prefix-2-204.ext ./
8.hdfs命令行
(1)查看帮助
hdfs dfs -help
(2)查看当前目录信息
hdfs dfs -ls /
(3)上传文件
hdfs dfs -put /本地路径 /hdfs路径
(4)剪切文件
hdfs dfs -moveFromLocal a.txt /aa.txt
(5)下载文件到本地
hdfs dfs -get /hdfs路径 /本地路径
(6)合并下载
hdfs dfs -getmerge /hdfs路径文件夹 /合并后的文件
(7)创建文件夹
hdfs dfs -mkdir /hello
(8)创建多级文件夹
hdfs dfs -mkdir -p /hello/world
(9)移动hdfs文件
hdfs dfs -mv /hdfs路径 /hdfs路径
(10)复制hdfs文件
hdfs dfs -cp /hdfs路径 /hdfs路径
(11)删除hdfs文件
hdfs dfs -rm /aa.txt
(12)删除hdfs文件夹
hdfs dfs -rm -r /hello
(13)查看hdfs中的文件
hdfs dfs -cat /文件
hdfs dfs -tail -f /文件
(14)查看文件夹中有多少个文件
hdfs dfs -count /文件夹
(15)查看hdfs的总空间
hdfs dfs -df /
hdfs dfs -df -h /
(16)修改副本数
hdfs dfs -setrep 1 /a.txt