Linux单独安装oracle客户端

linux单独安装oracle客户端及exp/imp工具配置
这个链接的文章讲的非常好。其中有一些需要注意的我写下来以便查阅。

下边的配置最好不要,因为可能会引起乱码。如果已经出现了乱码,把它删掉,然后关闭连接服务器的窗口,重新打开打开一个窗口连接服务器。

1
export NLS_LANG='simplified chinese_china.ZHS16GBK'

tnsnames.ora文件的位置不要放错了,是在network/admin目录下。还有里面的内容一定要顶格写,不能有缩进,否则会报错ORA-12154: TNS:could not resolve the connect identifier specified。这个文件中有四个参数需要改,第一行的名字DESCRIPTION,还有服务器名,端口号,还有SERVICE_NAME,其中DESCRIPTION和SERVICE_NAME最好一致。配置如下:

1
2
3
4
5
6
7
8
orac1 =  
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = www.hohode.com)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orac1)
)
)

下边的配置是错误的,因为有缩进,导致连不上oracle服务。

1
2
3
4
5
6
7
8
orac1 =  
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = www.hohode.com)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orac1)
)
)

登录oracle

1
2
sqlplus /nolog
conn username/password@service_name

There Was a Problem Confirming the Ssl Certificate: [SSL: TLSV1_ALERT_PROTOCOL_VERSION] Tlsv1 Alert Protocol Version (_ssl.c:590) - Skipping

参考 http://www.qingpingshan.com/m/view.php?aid=384613

在mac上使用pip安装软件包scrapy,报ssl错误:

1
2
3
4
Collecting scrapy
Could not fetch URL https://pypi.python.org/simple/scrapy/: There was a problem confirming the ssl certificate: [SSL: TLSV1_ALERT_PROTOCOL_VERSION] tlsv1 alert protocol version (_ssl.c:661) - skipping
Could not find a version that satisfies the requirement scrapy (from versions: )
No matching distribution found for scrapy

相关软件版本
python:2.7
pip:9.0.1
OSX Sierra 10.12.6
解决方法:

升级pip到最新版本(至少9.0.3)

1
curl https://bootstrap.pypa.io/get-pip.py | python

原因是 Python.org sites 终止支持TLS1.0和1.1,TLS需要>=1.2

参考:https://stackoverflow.com/questions/49768770/not-able-to-install-python-packages-ssl-tlsv1-alert-protocol-version

Spark-Shell执行spark 文件

Spark file example, a.scala

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import org.apache.hadoop.fs.FileSystem
import org.apache.hadoop.fs.Path
import org.apache.spark.sql.{Dataset, SaveMode, SparkSession}

val argArray = spark.sparkContext.getConf.get("spark.driver.args").split("\\s+")
print(argArray)
val logs = spark.read.json(argArray(0)).select("cats")
logs.cache()
logs.createOrReplaceTempView("tracker")

val sql1 = "select count(1) from tracker where cats.cat='store' and cats.act='aa'"
spark.sql(sql1).show(false)

val sql2 = "select count(1) from (select explode(cats) cats from tracker ) where cats.cat='store' and cats.act='bb'"
spark.sql(sql1).show(false)
spark.close()

run script example test.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash

TaskName="mianfei"
cd `dirname $0`
/data/work/spark2.0/bin/spark-shell \
-i mianfei.scala \
--name ${TaskName} \
--master yarn \
--deploy-mode client \
--executor-memory 1G \
--num-executors 15 \
--executor-cores 2 \
--conf spark.driver.args="/data/logs/20180609/* helloworld"
exit 0

Python操作oracle,日期比较和查询表中所有字段

Python访问远程oracle,需要安装一些软件,而这个过程简直就像shit
cx_Oracle 是一个 Python访问oracle的扩展模块。
1.安装cx_Oracle

1
2
yum install python-pip
pip install cx_Oracle

2.下载两个访问oracle需要用到的rpm
下载地址
下载过程就像shit,又强制注册,又多次弹出没有同意条款的,多试几次,看你运气了。
3.安装软件

1
rpm -ivh  oracle-instantclient12.2-basic-12.2.0.1.0-1.x86_64.rpm

4.加入环境变量

1
2
3
vim /etc/profile
export LD_LIBRARY_PATH=/usr/lib/oracle/12.2/client64/lib:$LD_LIBRARY_PATH
source /etc/profile

5.创建一个a.py文件

1
2
3
import cx_Oracle
con = cx_Oracle.connect('eqxiu_dev/keqs123@test.db.hohode.cn/oragbk')
print con.version

6.测试是否成功

1
python a.py

如果出现类似如下的版本号,说明成功了。

1
10.2.0.4.0

日期比较和查询表中所有字段

1
2
3
4
5
6
7
8
9
10
11
12
13
import cx_Oracle
con = cx_Oracle.connect('username/password@host/server')
print con.version
cur = con.cursor()
cur.execute("select * from base_user where REG_TIME >= to_date('2018-08-08 00:00:00','yyyy-mm-dd hh24:mi:ss') and rownum<20 ")
for result in cur:
print result

columnsnames = cur.execute("select COLUMN_NAME from user_tab_columns where TABLE_NAME='BASE_USER'").fetchall()
for name in columnsnames:
print name
cur.close()
con.close()

Oracle日期类型的比较
其它查询http://www.oracle.com/technetwork/articles/dsl/python-091105.html
参考 https://www.linuxidc.com/Linux/2010-10/29187.htm

Sqoop学习笔记

将数据库中的数据导入hive中

列出数据库中所有的表

1
2
sqoop list-tables --connect 
jdbc:oracle:thin:@192.168.1.22:1521:oragbk --username 'dev' --password '123'

任务重命名,使用多个mapper

1
sqoop import -D mapred.job.name=sqoop_import_base_user$i --append --connect jdbc:oracle:thin:@2.1.8.10:1521:aaa --username 'bbb' --password 'r6' --target-dir /data/db/ -m 10 --fields-terminated-by '\001' --split-by es.id  --query "$q" -hive-drop-import-delims

如果不制定 -m 参数,导入的时候数据可能会被分成多个split,可能会导致导入后的数据少或者重复

1
2
3
4
5
18/06/28 11:37:35 INFO db.DataDrivenDBInputFormat: BoundingValsQuery: SELECT MIN(`id`), MAX(`id`) FROM `base_user`
18/06/28 11:37:35 WARN db.TextSplitter: Generating splits for a textual index column.
18/06/28 11:37:35 WARN db.TextSplitter: If your database sorts in a case-insensitive order, this may result in a partial import or duplicate records.
18/06/28 11:37:35 WARN db.TextSplitter: You are strongly encouraged to choose an integral split column.
18/06/28 11:37:35 INFO mapreduce.JobSubmitter: number of splits:6

自动创建表结构
自定义任务名
oracle数据的表名和列名都需要大写

1
sqoop import -D mapred.job.name=sqoop_import_EQS_ORDER_INVOICE --connect jdbc:oracle:thin:@hohode.cn:1521:hello --username 'root' --password '123' --table INVOICE --hive-import -m 1 --hive-table default.invoice2 --hive-overwrite --map-column-hive ID=string,INVOICE_TYPE=string

–map-column-java ID=String 完全不起作用,还是使用–map-column-hive ID=string

WARN

如果一个oracle或者mysql数据表的一个字段中含有\n换行符,这会导致导入hive中的数据比之前数据表中的数据要多,这个时候要使用–hive-drop-import-delims将换行符等去掉。

导入hive终极语句

1
/bin/sqoop import -D mapred.job.name=sqoop_import_student --connect jdbc:oracle:thin:@hohode.com:1521:w --username 'root' --password '123456' --table student --hive-import -m 1  --hive-drop-import-delims --hive-table test.student --hive-overwrite --map-column-hive ID=string,INVOICE_TYPE=string

mapper为20,并且指定了split-by参数

1
/bin/sqoop import -D mapred.job.name=sqoop_import_base_user --connect jdbc:oracle:thin:@2.3.8.10:1521:qx --username 'qx' --password 'e$q3s#hr6' --table BASE_USER --hive-import -m 20  --hive-drop-import-delims --hive-table qxdb.base_user --hive-overwrite --map-column-hive TYPE=string,STATUS=string,CHECK_EMAIL=string,CHECK_PHONE=string,SECURITY_LEVEL=string --split-by REG_TIME

指定map-column-hive的decimal类型

1
/bin/sqoop import -D mapred.job.name=sqoop_import_orders --connect jdbc:mysql://101.0.2.2:3306/print --username 'root' --password 'hello' --table orders --hive-import -m 1  --hive-drop-import-delims --hive-table db.orders --hive-overwrite  --map-column-hive 'total_fee=decimal(15%2C2)'

常见问题

1.出现 org.apache.sqoop.Sqoop 找不到主类

解决 : 把 sqoop 目录下的 sqoop-1.4.4.jar 拷贝到 hadoop 的 lib 目录下
cd /opt/cloudera/parcels/CDH/lib/hadoop
sudo ln -s ../../jars/sqoop-1.4.5-cdh5.3.3.jar ./

2.mysql 类加载不到

解决 : 下载 mysql JDBC 放到 hadoop 目录下即可
cd /opt/cloudera/parcels/CDH/lib/hadoop
sudo ln -s ../../jars/mysql-connector-java-5.1.31.jar ./

3.HADOOP_MAPRED_HOME is /usr/lib/hadoop-mapreduce 找不到
ERROR tool.ImportTool: Imported Failed: Parameter ‘directory’ is not a directory

解决 : sudo ln -s /opt/cloudera/parcels/CDH/lib/hadoop-mapreduce /usr/lib/hadoop-mapreduce

Python快速实现文件上传下载

使用Python下载文件

首先安装 Pyftpdlib 模块

1
pip install pyftpdlib

启动ftp服务器

1
python -m pyftpdlib -p 21  -w -d /data/transfer/ -u test -P suibian

在linux上安装ftp客户端

1
yum instal -y ftp

在linux下载ftp服务器上的数据

一直出现 227 Entering passive mode (192,168,85,81,143,77)
很可能是外网访问内网
在其他的机器上访问可能就没问题。

pip: 未找到命令
使用which python找到python的路径
在Python路径中一般有pip或者pip3

参考 https://www.hi-linux.com/posts/10247.html