您正在查看: 软件开发 分类下的文章

IntelliJ IDEA中创建Spark项目

Overview

之前项目的人遗留的数据被接管后进行了改造,现在处理数据都用Spark来做了。这里记录一下如何在Mac本地的IntelliJ IDEA中搭建一个简单的Spark项目。这里不涉及HDFS这些相关的内容,只记录Spark
在此之前,我们默认已经安装好了最新版的IntelliJ IDEA以及配置好了JDK

1. IDEA中安装Scala插件

在IDEA的启动页面,点击Configure,在下拉列表中选择Plugins。

1572421037325.jpg

在左边输入框内搜索Scala,点击安装即可。这样我们就安装好了Scala。
接着回到刚刚的启动页面,选择Create New Project,选择Scala,右边的4个选项需要选IDEA,点击Next,项目名字我们就叫做hellospark吧,选好JDK后,选择Scala SDK,点击Create,我喜欢新的,所以选择了最新版本的scala-sdk-2.12.7(这一步导致了后面的异常),点击Finish。

1572421838866.jpg

2. 安装Spark2.4.4

登录到Spark官网,下载最新的稳定版本Spark2.4.4的压缩包。

1572420350442.jpg

在本地解压缩下载的压缩包,记住解压地址。
点击File -> Project Structure,弹出的窗口点击Libraries,点击Java

1573040365622.jpg

然后选择从解压的Spark压缩包里面找jars文件夹,

1573040567239.jpg

点击OK之后,会弹出来让选择模块的对话框,选择hellospark即可。

3.编写Scala程序

下面来试试是不是我们的环境是不是可行。
src文件夹上右击,新建一个Scala Class,选择Object,名字叫HelloWorldHelloWorld.scala内容如下:

import org.apache.spark.{SparkConf, SparkContext}
object HelloWorld {
    def main(args: Array[String]): Unit={
        val conf = new SparkConf()
            .setAppName("first spark")
            .setMaster("local[1]");

        new SparkContext(conf)
            .parallelize(List(1,2,3,4,5,6,7,8,9,10)) //传入可迭代对象
            .map(x => x*x) // 平方运算
            .filter(_%9 == 0) //只要可以被9整除的
            .collect()
            .foreach(println);
    }
}

在文件内右击选择Run 'HelloWorld',抛出如下异常:

Exception in thread "main" java.lang.NoSuchMethodError: scala.Predef$.refArrayOps([Ljava/lang/Object;)Lscala/collection/mutable/ArrayOps;
    at org.apache.spark.util.Utils$.stringToSeq(Utils.scala:2664)
    at org.apache.spark.internal.config.ConfigHelpers$.stringToSeq(ConfigBuilder.scala:49)
    at org.apache.spark.internal.config.TypedConfigBuilder$$anonfun$toSequence$1.apply(ConfigBuilder.scala:125)
    at org.apache.spark.internal.config.TypedConfigBuilder$$anonfun$toSequence$1.apply(ConfigBuilder.scala:125)
    at org.apache.spark.internal.config.TypedConfigBuilder.createWithDefault(ConfigBuilder.scala:143)
    at org.apache.spark.internal.config.package$.<init>(package.scala:172)
    at org.apache.spark.internal.config.package$.<clinit>(package.scala)
    at org.apache.spark.SparkConf$.<init>(SparkConf.scala:716)
    at org.apache.spark.SparkConf$.<clinit>(SparkConf.scala)
    at org.apache.spark.SparkConf.set(SparkConf.scala:95)
    at org.apache.spark.SparkConf.set(SparkConf.scala:84)
    at org.apache.spark.SparkConf.setAppName(SparkConf.scala:121)
    at HelloWorld$.main(HelloWorld.scala:5)
    at HelloWorld.main(HelloWorld.scala)

Scala SDK版本太新了,我们需要更换版本。

点击File -> Project Structure,弹出的窗口点击Global Libraries,点击Scala SDK,点击-号,把2.12.7版本删掉;接着点击+号,点击点击Scala SDK,选择2.11.12版本。配置好以后,右击hellospark项目,选择Rebuild Module 'hellospark'。再运行程序,虽然也会出来很多红字(因为完整的大数据环境并没有搭建,只安装了Spark),但是程序还是正确产生结果9,36,81了。

Python3连接PostgreSQL数据库

Overview

之前项目的人遗留的数据散落在多种数据库中,既有MySQLMongoDB,也有CassandraPostgreSQL。在Python3版本的jupyter中连接PostgreSQL需要安装psycopg2,而psycopg2Python2中则是已经集成好的。

1. 安装python3-psycopg2libpq-dev

先在Linux上安装好这两个包,

sudo apt-get install python3-psycopg2
sudo apt-get install libpq-dev

再安装psycopg2,

pip3 install psycopg2

否则就会报错如下:

ERROR: Command errored out with exit status 1:
     command: /home/yangbingjiao/anaconda3/bin/python -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-wxj7s4lx/psycopg2/setup.py'"'"'; __file__='"'"'/tmp/pip-install-wxj7s4lx/psycopg2/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' egg_info --egg-base pip-egg-info
         cwd: /tmp/pip-install-wxj7s4lx/psycopg2/
    Complete output (23 lines):
    running egg_info
    creating pip-egg-info/psycopg2.egg-info
    writing pip-egg-info/psycopg2.egg-info/PKG-INFO
    writing dependency_links to pip-egg-info/psycopg2.egg-info/dependency_links.txt
    writing top-level names to pip-egg-info/psycopg2.egg-info/top_level.txt
    writing manifest file 'pip-egg-info/psycopg2.egg-info/SOURCES.txt'

    Error: pg_config executable not found.

    pg_config is required to build psycopg2 from source.  Please add the directory
    containing pg_config to the $PATH or specify the full executable path with the
    option:

        python setup.py build_ext --pg-config /path/to/pg_config build ...

    or with the pg_config option in 'setup.cfg'.

    If you prefer to avoid building psycopg2 from source, please install the PyPI
    'psycopg2-binary' package instead.

    For further information please check the 'doc/src/install.rst' file (also at
    <http://initd.org/psycopg/docs/install.html>).

    ----------------------------------------
ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.

2.连接PostgreSQL数据库

import psycopg2
import pandas as pd

conn = psycopg2.connect(database="database", user="user", password="password", host="192.168.1.230", port="5432")
cur = conn.cursor()
pql = """
SELECT * 
FROM database.table
WHERE  create_time >= '2019-09-23' AND create_time < '2019-09-30'
order by create_time
limit 10
"""
cur.execute(pql)
rows = cur.fetchall()
df = pd.DataFrame(rows)
conn.close()

本文主要参考了以下文章:
Python3连接PostgreSQL(10.5)数据库

Diffuser单一节点所需软件的安装

Overview

Diffuser是一个基于分布式的生物序列特征生成网站,因此需要在每个单一节点安装所需的软件:ViennaRNA-2.4.8VSL2psipredspineX。本文以deepamp节点为例,分别安装和配置以上4个软件。

1. 安装ViennaRNA-2.4.8

该软件用于预测RNA序列结构,安装步骤如下:

wget https://www.tbi.univie.ac.at/RNA/download/sourcecode/2_4_x/ViennaRNA-2.4.8.tar.gz
tar -zxvf ViennaRNA-2.4.8.tar.gz
cd ViennaRNA-2.4.8
./configure
make
sudo make install

2. 安装VSL2

该软件用于生成预测的蛋白质序列的disorder information,只需下载后解压,无需安装:

wget http://www.dabi.temple.edu/disprot/download/VSL2.tar.gz
tar -xvf VSL2.tar.gz

3. 安装psipred

该软件用于预测Protein序列的二级结构,安装步骤如下:

wget http://bioinfadmin.cs.ucl.ac.uk/downloads/psipred/psipred.4.02.tar.gz
tar -xvf psipred.4.02.tar.gz

在解压成功后,还需进行简单的配置。首先,由于该软件部分代码需要tcsh支持,因此我们需要先进行安装:

sudo apt-get install tcsh

其次,该软件当中调用了blast,因此我们需要指定blast的安装路径和数据库路径,这里blast的我们用的是2.2.26版本而数据库我们使用的是uniref50。配置如下:

cd psipred
vim runpsipred

将下面的代码:

# The name of the BLAST data bank
set dbname = uniref90

# Where the NCBI programs have been installed
set ncbidir = /usr/local/bin

# Where the PSIPRED V4 programs have been installed
set execdir = ./bin

# Where the PSIPRED V4 data files have been installed
set datadir = ./data

改为:

# The name of the BLAST data bank
set dbname = /feagen/uniref/uniref50/uniref50

# Where the NCBI programs have been installed
set ncbidir = /var/www/cgi-bin/blast-2.2.26/bin

# Where the PSIPRED V4 programs have been installed
set execdir = /var/www/cgi-bin/psipred/bin

# Where the PSIPRED V4 data files have been installed
set datadir = /var/www/cgi-bin/psipred/data

4. 安装spineX

spineX的压缩包可以到http://sparks.informatics.iupui.edu/上下载,下载完成后,解压并进行如下配置:

tar -zxvf spineXpublic.tgz
cd spineXpublic
vim spX.pl

到指定行修改脚本文件,89行,指定blast安装路径:

$blastdir = '/var/www/cgi-bin-diffuser/blast-2.2.26';

108行,修改数据库路径:

system("$blastdir/bin/blastpgp -d /feagen/uniref/uniref50/uniref50 -j 3 -i $infl -Q $tmprf -a 4 > $workdir/_tmp2.$irnd")==0 or die " Aborting(spineX): Can't do psiblast\n";

128行,删除缓存文件:

system("rm -r $workdir")==0 or print "Couldn't remove temp. dir. $workdir\n";

php页面不能被解析成网页,而是直接显示了页面代码

Overview

之前安装过很多次的phpMyAdmin,但最近一次安装时,出现了一个之前从来没遇到的问题:访问phpMyAdmin时,主页的php页面会被不能被解析成网页,而是直接显示了页面代码。

问题描述

文字描述已经比较清楚了,就不截图了。如果想看截图,参考 phpmyadmin showing php script [duplicate]

对比之前的安装流程,发现这次安装Apache2时,php还没装(这个一般装Ubuntu系统时都会自动装上,这次居然没装,所以才会碰到这么少见的错误),所以php是在Apache2后面安装的。这样的问题在于,当Apache2安装时,没有检测到系统有php,所以就以为用户安装Apache2不是为了运行php网站(尽管Apache2最常见的应用就是做php网站容器,但实际上可以用作多种语言网站的容器,比如perlCGI程序,但需要手动配置添加专门的模块,使Apache2支持perlCGI程序,不然你通过Apache2访问你的perl页面,也会被直接显示为代码,而不是页面,参见配置Apache2服务器以CGI方式运行Perl程序),也就没有安装配置支持php的模块。

解决方案

  • 先安装php,再安装Apache2,这样Apache2安装时,会检测到php,然后自动安装配置好支持php网站的模块。

  • 如果不幸顺序反了(后面又发现,好像跟顺序无关,还是有可能报这个错误 =。=),那使用下面的命令手动给Apache2安装支持php的模块

    先用下面的命令看看你装的php版本:

    php --version
    

    出现下面的信息:

    PHP 7.0.32-0ubuntu0.16.04.1 (cli) ( NTS )
    Copyright (c) 1997-2017 The PHP Group
    Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies
        with Zend OPcache v7.0.32-0ubuntu0.16.04.1, Copyright (c) 1999-2017, by Zend    Technologies
    

    如果你装的是php 7.0,那通过下面的命令

    sudo apt-get install libapache2-mod-php7.0
    

    然后重启Apache2

    sudo service apache2 restart
    

    就可以了。

参考文献

Python包管理软件pip更新后报错

Overview

今天在服务器(Ubuntu 16.04)使用pip安装深度学习包Keras的时候,发现安装结束之后下面有一行提示小字,大约就是pip有新版本可以更新,使用XXX命令更新,就顺带更新了一下,更新完了pip就不能用了...

问题描述

及时是查看下pip的版本

sudo pip --version

也会报下面的错误:

Traceback (most recent call last):
  File "/usr/bin/pip", line 9, in <module>
    from pip import main
ImportError: cannot import name main

解决方案

差了很多资料,发现是pip新版本的一个bug,跟平台无关,Windows下也会出现这个问题(可以查看这里ImportError: cannot import name main when running pip --version command in windows7 32 bit)。

有3个解决办法:

  1. 直接修复这个bug,算是临时的解决方案。
    vim编辑/usr/bin/pip文件

     sudo vim /usr/bin/pip
    

    可以看到下面的内容

     from pip import main
     if __name__ == '__main__':
         sys.exit(main())
    

    把这部分内容注释掉,换成下面的内容:

    from pip import __main__
    if __name__ == '__main__':
        sys.exit(__main__._main())
    

    重新运行pip,不在报错了。

  2. Windows下的pip安装位置不太熟悉,所以不知道应该在哪里修改这个文件。如果不知道在哪里修改,也可以考虑用python命令讲pip降级到没有bug的版本:

    python -m pip uninstall pip
    python -m pip install pip==9.0.3
    

    这个没试过,不知道行不行。

  3. 也有人说这个bug是由pip的调用方式引起的,在调用pip时,别用:

    pip install <package>
    

    而是改用(python2):

    python -m pip install <package>
    

    或者(python3):

    python3 -m pip install <package>
    

参考文献