移除数字千分位的逗号

从国外下载的人口数据,其人口数量使用了千分位逗号,在进行数据入库时需要将逗号移除,找了几个办法,最终使用了这个方法进行处理:

cat town.csv | perl -pe 's/(?<=\d),(?=\d)//g' > town-new.csv

这样就可以直接移除任意多个千分位逗号了。

升级gitlab自9.4.5到12.1.3版本

gitlab所在服务器进行了操作系统升级,从ubuntu 14.04升级到18.04,而且gitlab自身很久未进行升级,导致与现有版本有较大差距,升级过程有一定周折,所幸最终还是成功升级。

首先参考此网站进行升级:How to upgrade to latest Gitlab from version less then 10.8

但操作升级的不顺利,版本升级时全提示版本不对,不能升级。

使用apt list -a gitlab-ce*命令时发现其最小版本为10.7.0,于是尝试从这个版本进行升级,发现可以操作:

sudo apt-get install gitlab-ce=10.7.0-ce.0

然后再这个版本基础上再进行大版本升级,最终顺利升级至最新版本。

基于多个SSH服务器构建SSH代理

前一篇文章使用了scp跨两个内网进行文件传输,其实还可以有一种更简单的办法进行处理,就是构建SSH代理。

编辑.ssh目录下的config文件

nano ~/.ssh/config

然后指定不同的服务器,注意其中的ProxyCommand指令:

Host bridge1
  HostName alias1.example.com

Host private1
  ProxyCommand ssh -q bridge1 nc -q0 private1 22

Host private2
  ProxyCommand ssh -q private1 nc -q0 private2 22

这样,就构建了private1、bridge1两个ssh代理,访问private2服务器可以将其当做一个本地服务器直接使用,也可以直接scp进行数据的上传和下载。

参考:http://sshmenu.sourceforge.net/articles/transparent-mulithop.html

QGIS3.6在MAC中打开文件夹速度奇慢

忘记从QGIS3哪个版本开始,在MAC中打开目录对话框就速度奇慢,导致我一开始都是直接将文件的绝对路径直接键入进来,避免打开文件对话框。搜索发现,此bug已有用户汇报了,且给出了一个解决方法:

在系统偏好设置->安全性与隐私->隐私->辅助功能中,将QGIS3.6的选项给去掉即可。

参考:https://gis.stackexchange.com/questions/310280/qgis-very-slow-when-browsing-files-on-macos

升级greenplum 5.x到6.0beta3

之前的老集群,使用的是ubuntu 16.04下的greenplum 5.8,后来随系统升级到5.19版本。最近发现运行速度变慢(慢得过分,可以一个sql喝几杯茶的程度),而且经过和在另个一个新集群上的相同数据对比测试,发现速度差别至少有2个量级。

首先尝试将数据库备份,删除再恢复,发现速度改善很小。有了上个集群的安装经验,于是决定将操作系统升级,并且将greenplum也升级6.0版本(其master版本是7.0,但稳定性还是有问题,发现有几个sql查询异常)。

在升级过程中,遇到一个小坑:机器名不要命名为host01-1的形式,会导致greenplum将其判别为一类特殊的host。这个问题还是通过浏览gpinitsystem的代码才找出来的。

另外也再记录一下postgis的安装过程。由于libxerces-c-dev和gp-xerces的冲突,postgis安装时需要将raster功能禁止,在greenplum安装完成后执行:

source /usr/local/gdbp/greenplum_path.sh
git clone https://github.com/greenplum-db/geosptial.git
cd geospatial/postgis/build/postgis-2.1.5
./configure --with-pgconfig=$GPHOME/bin/pg_config --without-raster --without-topology --prefix=$GPHOME
make USE_PGXS=1 clean all
sudo make USE_PGXS=1 install 

这样在所有节点安装完成后即可开始greenplum的初始化脚本。

全国县市边界数据的处理(1M2017版)

全国地理信息资源目录服务系统上可以下载最新版本(2017年,1:1百万比例尺)的全国各要素基础数据,具体包括:

  • 共77幅DLG数据集,包括全国陆地范围以及台湾岛、海南岛、钓鱼岛、南海诸岛在内的主要岛屿及其临近海域。
  • 包括水系、居民地及设施、公路铁路、行政边界、地名等5个数据集12个数据层。

我们现在就需要其中的行政边界数据,本来以为下载后可以很方便的使用(有点想当然了),经过一番艰苦的处理后,数据终于是可用状态了。

在mac系统下进行了数据处理,使用了gdal/ogr、QGIS3,主要处理过程记录如下。

  1. 将下载下来的77副gdb数据,全部解压到一个目录中,比如1M2017目录,并在其中建立一个shp子目录。
  2. 在shell下,使用ogr2ogr命令,将所有gdb文件转换为一个大的shape文件,注意需要将其中的NAME字段编码转换为UTF8编码(官方是GBK编码)。
  3. 使用ogr2ogr,对合并后的BOUA(面状边界数据)文件根据PAC字段进行再次图形合并(因为默认的分幅会保留大量的正方形),生成output1.shp文件。
  4. output1.shp文件包含了大量了国外数据、海洋数据,这些数据可以通过ogr2ogr再次剔除,即设置PAC字段>100000且不等于250100,然后生成output2.shp文件。
  5. 仔细观察output2.shp文件,发现其中存在大量的拓扑错误(分幅边线的交叉遗留),在QGIS3中使用v.clean工具进行错误检查和处理,生成output3.shp文件。
  6. 对output3.shp文件进行人工错误检查(可借助QGIS3的图形检查工具check validity辅助检查),使用编辑工具(以及高级数字化工具)进行错误修复,主要使用节点编辑工具(删除节点)、多边形合并工具、多边形part删除工具等,最终生成全国(含港澳台)的县级边界数据集boua_cnty.shp。
  7. 使用QGIS3在boua_cnty数据中添加一个虚拟字段pac_city,并将其值定义为floor(PAC/100),然后对其执行dissolve操作,若需要将直辖市也当做一个独立城市边界,则需要单独处理一下四个直辖市的属性(将县区进行合并,主要是天津和重庆),形成全国市级边界数据集boua_city.shp文件。
for i in `ls -d *.gdb`;do ogr2ogr -f "ESRI Shapefile" -lco ENCODING=UTF-8  -append  shp $i;done
ogr2ogr -f "ESRI Shapefile" output1.shp -lco ENCODING=UTF-8 -dialect sqlite -sql "select st_union(geometry) as geometry,PAC,NAME from 'BOUA' group by PAC,NAME order by PAC,NAME" shp/BOUA.shp
ogr2ogr -f "ESRI Shapefile" output2.shp -lco ENCODING=UTF-8 -where "PAC>100000 and PAC<>250100" output1.shp

但这样生成的城市边界仅包括陆地边界,对于内陆型城市,在使用中问题不大,但对于沿海城市,则很多人类活动轨迹可能会超出陆地边界(比如舟山),因此还需要一个融合近海边界的城市边界。手头上有一个2012年版本的含海洋边界的城市边界数据,需要将其海洋边界数据融合到新的全国边界数据集中。

处理过程为:

  1. 对含有海洋边界的数据集bou2012,和最新全国城市边界数据集boua_city,执行difference操作,在QGIS3进行编辑,删除内陆边界中有差异的部分,在沿海边界删除海洋中的小岛(内多边形),同时添加一个虚拟字段pac_city(和boua_city中的字段相同),最终生成海洋城市边界数据集。
  2. 将boua_city数据集和上一步中生成的海洋城市边界数据集执行union操作。
  3. 对union后的数据集,根据pac_city字段执行dissolve操作。
  4. 人工检查最终生成的数据集。

因数据问题,此数据集中不含港澳台的海洋边界。

使用grep查找符合条件文本的前后几行

有的时候,需要在满足查询条件的情况,查询符合条件文本的前后几行。之前一直以为需要用python自行解决,没想到grep里有参数可以简单处理。

比如,在log记录,有的错误日志仅提供了错误内容,正在执行脚本的相关参数需要从上下文中进行推理,这时就可以采用此方法进行处理。

# 显示匹配行的前后3行
grep -3 'ERROR:' weibo.log
grep -C 3 'ERROR:' weibo.log

# 显示匹配行的后4行
grep -A 4 'ERROR:' weibo.log

# 显示匹配行的前2行
grep -B 2 'ERROR:' weibo.log

在ubuntu 18.04上安装最新版greenplum(7.0.alpha)

近期组建了一个新的大数据测试集群,由4个物理机器构成一个测试集群,分别命名为hadoop1-4号机器,想要进行MPP并行数据库的安装与测试工作。服务器物理机安装的操作系统为ubuntu server 18.04版本。开始以为可以采用lanchpad的官方库进行安装,发现greenplum官方目前并未支持ubuntu 18.04,需要从源码编译安装。在尝试编译的过程中遇到了几个错误,最终通过一个变通的方法进行了处理,在此记录一下过程。

简而言之,是greenplum所采用的xerces-c库与ubuntu官方库的版本不一致,导致调用时遇到了DSO missing错误。可以采用禁止gporca的查询优化器方法来避免此错误,同时安装postgis插件也需要禁止raster功能,或者移除官方的xerces-c库,使用greenplum自带的xerces-c库。

下面记录一下第二种方案的编译过程。

一、安装gp-xercesc

git clone https://github.com/greenplum-db/gp-xerces.git
cd gp-xerces
mkdir build
cd build
../configure --prefix=/usr/local
make
sudo make install

二、安装gporca

git clone https://github.com/greenplum-db/gporca.git
cd gporca
cmake -GNinja -H. -Bbuild
sudo ninja install -C build

三、安装gpdb

git clone https://github.com/greenplum-db/gpdb.git
cd gpdb
sudo ./README.ubuntu.bash

此时系统会默认安装libxerces-c-dev库,需要将此库移除以使其正确编译。

sudo apt remove libxerces-c-dev   ###此库会有冲突
./configure --enable-orca --with-perl --with-python --with-libxml --prefix=/usr/local/gpdb
make -j32
sudo make -j32 install
sudo ldconfig

这样可以确保编译通过,且可安装,但在初始化greenplum之前还需要确保:

1、master机器到其他机器可以ssh密钥登陆

2、limits.conf和sysctl.conf已修改,且修改后重新登陆过。

3、在其他各机器执行相同的操作。

上述操作执行完之后,在master节点,指定某一目录作为greenplum的数据目录,比如/data,然后在master节点上建立/data/master目录,在所有节点上建立/data/primary目录。然后:

source /usr/local/gpdb/greenplum_path.sh
cd /data/master
cp /usr/local/gpdb/docs/cli_help/gpconfigs/hostfile_gpinitsystem .
cp /usr/local/gpdb/docs/cli_help/gpconfigs/gpinitsystem_config .

修改这两个配置文件,hostfile记录了greenplum所有机器的hostname,一行一个机器名;gpinitsystem_config记录了greenplum的目录设置和segment设置参数,需进行相应的修改,完成后即可启动数据库。

gpinitsystem -c gpinitsystem_config -h hostfile_gpinitsystem 

删除launchpad中无法移除的图标

在Mac的launchpad中突然发现了几个没用过的图标,点开后发现是一些对应的网站地址,但在launchpad中无法删除,网上搜索后发现了一个对应的解决办法:

使用终端运行:

cd /private/var/folders/

find . | grep com.apple.dock.launchpad/db/db

根据找出的对应目录,进入到对应的目录,然后:

sqlite3 db

使用sql命令依据标题的title删除对应的图标:

delete from apps where title like ‘%标题%’;

退出后执行:

killall dock

这样图标就删除了。