利用dockerfile构建spark镜像

目的

需要构建一个开箱即可用的spark集群镜像,便于做一些实验性的测试验证程序

镜像树(我自己的叫法)

1
2
3
java:8jre
|__spark131-jre8 # jre8 + spark1.3.1
|__ spark131-jre8-all # spark131-jre8 + 启动一个master和一个slave节点, spark集群为standalone模式

Dockerfile

spark131-jre8

1
2
3
4
5
6
FROM java:8-jre
MAINTAINER Louz
RUN curl -s http://d3kbcqa49mib13.cloudfront.net/spark-1.3.1-bin-hadoop2.6.tgz | tar -xz -C /usr/local/
RUN cd /usr/local && ln -s spark-1.3.1-bin-hadoop2.6 spark
ENV SPARK_HOME /usr/local/spark

spark131-jre8-all

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
FROM louz/spark131-jre8
MAINTAINER Louz
## install ssh
RUN apt-get update && apt-get install -y ssh
RUN ssh-keygen -q -N "" -t rsa -f /root/.ssh/id_rsa
RUN cp /root/.ssh/id_rsa.pub /root/.ssh/authorized_keys
ENV SPARK_HOME /usr/local/spark
## config local slave node
RUN cp $SPARK_HOME/conf/slaves.template $SPARK_HOME/conf/slaves
RUN cp $SPARK_HOME/conf/spark-defaults.conf.template $SPARK_HOME/conf/spark-defaults.conf
#RUN sed -i "5c spark.master spark://localhost:7077" $SPARK_HOME/conf/spark-defaults.conf
RUN echo "spark.master spark://localhost:7077" $SPARK_HOME/conf/spark-defaults.conf
## start master and slave when the container init
ENTRYPOINT ["/bin/bash","-c","service ssh start && /usr/local/spark/sbin/start-all.sh && tail -f /usr/local/spark/logs/spark*.out"]
#ENTRYPOINT ["service ssh start && /usr/local/spark/sbin/start-all.sh"]

通过

1
docker build -f <path/to/Dockerfile> -t <image tag> .

命令分别构建出louz/spark131-jre8louz/spark131-jre8-all两个镜像

运行

1
docker run -d -p 8080:8080 -p 7077:7077 -h sparkall louz/spark131-jre8-all

即可启动一个spark集群,访问http://<dockerIP>:8080可以看到spark master的管理页面。

上面运行命令有个要注意的地方是需要加-h参数执行启动的容器的hostname,否则容器的名字会是一个随机生成的名字,导致spark master节点的地址spark://<masterName>:7077中的masterName也是随机的名字,后续spark-shell或spark-submit要指定master地址时会比较麻烦

spark客户端访问

最简单的访问方式是通过spark-shell访问,在客户端机器输入以下命令

1
2
cd $SPARK_HOME
bin/spark-shell --master spark://sparkall:7077

注意,需要在客户端机器先配置sparkall的ip映射

Docker常用命令及常见问题

一、Docker命令

##1. docker run命令
官方文档:https://docs.docker.com/engine/reference/run/
命令语法:

1
$ docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]

###[OPTIONS]

[-i -t或缩写成-it]
用于启动交互式进程,如

1
docker run -i -t ubuntu /bin/bash

[-p]
将容器的端口映射到宿主机的端口,如

1
docker run -d -p 80:80 my_image service nginx start

[-h]
指定容器的hostname

[--link]
连接到另外一个容器,如

1
2
# 运行一个redis容器,启动redis-cli并连接另一个名为redis-master的容器
docker run -it --link redis-master:redis-master --rm redis:3.0.7 redis-cli -h redis-master -p 6379

[其他]
在Docker daemon模式下,最后的命令,一定要是当前进程需要一直运行的,才能够防容器退出。如果在image的dockerfile最后没有使用ENTRYPOINT或者CMD,那在docker run的时候要保证最后一句命令是可以在让容器一直运行的,例如:

1
$ docker run -d -p 8080:8080 louz/spark131-jre8 /bin/bash "/usr/local/spark/sbin/start-master.sh && tail -f /usr/local/spark/logs/spark*.out"

##2. 停止守护式容器命令

1
docker stop <CONTAINER ID or NAME>

##3. 查看容器ip

1
docker inspect --format='{{.NetworkSettings.IPAddress}}' <CONTAINER ID or NAME>

##4. 移除容器

1
docker stop <CONTAINER ID or NAME>

##5. 进入已启动容器

1
docker exec -it <CONTAINER ID or NAME> bash

二、加速docker镜像下载

DaoCloud注册并登录后,可以看到你专属的加速器地址:类似http://xxxxxx.m.daocloud.io
访问:

http://docs.daocloud.io/faq/what-is-daocloud-accelerator#docker-toolbox,执行如下命令:

1
2
3
4
docker-machine ssh default
sudo sed -i "s|EXTRA_ARGS='|EXTRA_ARGS='--registry-mirror=加速地址 |g" /var/lib/boot2docker/profile
exit
docker-machine restart default

如何制作windows to go镜像

以下以创建windows10的wtg镜像为例

  1. 首先创建一个win10.vhdx文件,加载并格式化,以下假设加载后为H盘
  2. 加载win10的iso文件(用虚拟光驱/如果OS是win8以上的话,可以直接加载),以下假设虚拟光驱为G盘
  3. 以管理员身份运行命令行工具,运行以下命令,将安装文件中的install.wim快速安装到刚创建的vhdx文件中

    1
    Dism /Apply-Image /ImageFile:G:\sources\install.wim /Index:1 /ApplyDir:H:\
  4. 上述命令结束后就可以,弹出H盘,这样就可以拿到win10的WTG文件了

  5. 利用BCDBOOT工具,编辑系统BCD文件

windows激活工具

http://kmspico.org

hadoop常见问题

###1. 向HDFS写文件时报没有权限
错误信息类似如下:

1
2
3
4
5
6
7
8
9
10
11
12
Exception in thread "main" org.apache.hadoop.security.AccessControlException: Permission denied: user=Louz, access=WRITE, inode="/test":hduser:supergroup:drwxr-xr-x
at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.check(FSPermissionChecker.java:234)
at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.check(FSPermissionChecker.java:214)
at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermission(FSPermissionChecker.java:158)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.checkPermission(FSNamesystem.java:5185)
......
Caused by: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.AccessControlException): Permission denied: user=Louz, access=WRITE, inode="/test":hduser:supergroup:drwxr-xr-x
at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.check(FSPermissionChecker.java:234)
at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.check(FSPermissionChecker.java:214)
at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermission(FSPermissionChecker.java:158)
......

原因:
这是由于写文件时是以客户端的用户名往hdfs里写的,如果客户端的用户在服务器上不存在或者没有对应目录的权限,所以会报以上的错

解决方法1:
在服务器端给对应的目录赋权,使用hdfs dfs -chmod命令,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
[hduser@hadoop2 ~]$ hdfs dfs -ls -R /
drwxr-xr-x - hduser supergroup 0 2014-05-19 16:39 /abc
drwxr-xr-x - hduser supergroup 0 2014-05-20 09:29 /pc-demo
drwxr-xr-x - hduser supergroup 0 2014-05-19 16:38 /test
drwxr-xr-x - hduser supergroup 0 2014-05-19 16:38 /test/folder1
drwxr-xr-x - hduser supergroup 0 2014-05-19 16:38 /test/folder2
[hduser@hadoop2 ~]$ hdfs dfs -chmod -R 777 /pc-demo
[hduser@hadoop2 ~]$ hdfs dfs -ls -R /
drwxr-xr-x - hduser supergroup 0 2014-05-19 16:39 /abc
drwxrwxrwx - hduser supergroup 0 2014-05-20 09:29 /pc-demo
drwxr-xr-x - hduser supergroup 0 2014-05-19 16:38 /test
drwxr-xr-x - hduser supergroup 0 2014-05-19 16:38 /test/folder1
drwxr-xr-x - hduser supergroup 0 2014-05-19 16:38 /test/folder2

可以看到现在/pc-demo目录权限已经修改成所有人可读写

成功写入的文件权限类似

1
2
3
4
5
6
7
[hduser@hadoop2 ~]$ hdfs dfs -ls -R /
drwxr-xr-x - hduser supergroup 0 2014-05-19 16:39 /abc
drwxrwxrwx - hduser supergroup 0 2014-05-20 09:34 /pc-demo
-rw-r--r-- 1 Louz supergroup 9 2014-05-20 09:34 /pc-demo/demo.txt
drwxr-xr-x - hduser supergroup 0 2014-05-19 16:38 /test
drwxr-xr-x - hduser supergroup 0 2014-05-19 16:38 /test/folder1
drwxr-xr-x - hduser supergroup 0 2014-05-19 16:38 /test/folder2

解决方法2:
在服务器端修改hdfs-site.xml文件

1
2
3
4
5
6
7
8
9
10
11
12
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
<description></description>
</property>
<property>
<name>dfs.permissions</name>
<!-- 设置成false就不会检验客户端用户是否有hdfs的权限 -->
<value>false</value>
</property>
</configuration>

重启Hadoop服务,再执行程序,讲文件demo.txt上传至/test目录

1
2
3
4
5
6
7
8
[hduser@hadoop2 ~]$ hdfs dfs -ls -R /
drwxr-xr-x - hduser supergroup 0 2014-05-19 16:39 /abc
drwxrwxrwx - hduser supergroup 0 2014-05-20 09:34 /pc-demo <- 该目录是通过chmod后,实现可上传文件,目录的权限为所有人可读写
-rw-r--r-- 1 Louz supergroup 9 2014-05-20 09:34 /pc-demo/demo.txt
drwxr-xr-x - hduser supergroup 0 2014-05-20 11:03 /test <- 该目录是通过修改hdfs-site.xml,实现可上传文件,目录权限为其他人只读
-rw-r--r-- 1 Louz supergroup 9 2014-05-20 11:03 /test/demo.txt
drwxr-xr-x - hduser supergroup 0 2014-05-19 16:38 /test/folder1
drwxr-xr-x - hduser supergroup 0 2014-05-19 16:38 /test/folder2

###2. windows运行客户端程序时报winutils not found
问题: 在windows运行MR测试程序时,报类似的错误:

1
2
3
4
5
2016-03-11 18:18:30,702 ERROR [main] util.Shell (Shell.java:getWinUtilsPath(374)) - Failed to locate the winutils binary in the hadoop binary path
java.io.IOException: Could not locate executable null\bin\winutils.exe in the Hadoop binaries.
at org.apache.hadoop.util.Shell.getQualifiedBinPath(Shell.java:356)
at org.apache.hadoop.util.Shell.getWinUtilsPath(Shell.java:371)
......

解决方法:
步骤一:首先要在环境变量里设置好HADOOP_HOME参数,值为hadoop解压包所在目录,例如我的是:D:\software\hadoop\hadoop-2.7.1

步骤二:需要把winutils.exe文件放到%HADOOP_HOME%\bin目录去,winutils.exe可以在 https://github.com/steveloughran/winutils 下载

步骤三:重启一下IDE


3. 在windows运行客户端的Job报UnsatisfiedLinkError错

问题: 报错信息如下:

1
2
3
4
5
java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z
at org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Native Method)
at org.apache.hadoop.io.nativeio.NativeIO$Windows.access(NativeIO.java:609)
at org.apache.hadoop.fs.FileUtil.canRead(FileUtil.java:977)

解决方法:将编译后hadoop的bin目录中的hadoop.dll文件拷贝到%HADOOP_HOME%\bin即可


4. MapReduce程序的Classpath

一般运行MR程序的命令都是

1
hadoop jar user.jar MainClass .......

这时候程序的classpath分别有:

  1. hadoop框架本身的*.jar
  2. user.jar里的class
  3. user.jar里lib目录下的*.jar

要注意的是: 如果user.jar是放在hadoop环境的classpath中,那么user.jar依赖的jar包也必须放到hadoop环境的classpath中,不能放在user.jar里的lib目录中;但如果不把user.jar放到hadoop环境的classpath中,则可以将依赖包打到user.jar的lib目录中,原因如下:

  1. 如果user.jar放在hadoop classpath,那么执行hadoop jar user.jar MainClass ......
    的时候,user.jar中的class由hadoop的classloader(下面称为parent classloader)从hadoop classpath中的jar包load进来

  2. 而user.jar中的lib目录下的jar包是在org.apache.hadoop.util.RunJar的main方法中将user.jar解压到一个临时目录,再创建一个classloader(下面称为child classloader),将解压后的lib/*.jar加载进来。

  3. 如果user.jar放在hadoop的classpath中,user.jar本身的class由parent classloader加载,其依赖的类则是由child classloader加载,根据JVM的加载模型,parent classloader是不知道child classloader加载的类的,所有此时会报ClassNotFoundException的错误;

  4. 如果user.jar不放在hadoop的classpath中,user.jar本身的class以及依赖的lib/*.jar都是有child classloader加载,自然能正常运行。

5. 如何设置只有Mapper的程序

参考文档:http://unmeshasreeveni.blogspot.com/2014/05/map-only-jobs-in-hadoop.html
需要在客户端程序中设置

1
job.setNumReduceTasks(0);

这样就不会有reduce阶段,否则会默认使用Identity Reducer进行处理,白白多了shuffle阶段

6. 如何编译hadoop

官方文档
编译后可得出前面提到的winutils.exehadoop.dll等文件

1
2
3
4
5
6
7
8
9
10
11
12
Requirements:
* Windows System
* JDK 1.6+
* Maven 3.0 or later
* Findbugs 1.3.9 (if running findbugs)
* ProtocolBuffer 2.5.0
* CMake 2.6 or newer
* Windows SDK or Visual Studio 2010 Professional
* Unix command-line tools from GnuWin32 or Cygwin: sh, mkdir, rm, cp, tar, gzip
* zlib headers (if building native code bindings for zlib)
* Internet connection for first build (to fetch all Maven and Hadoop dependencies)
  1. 利用VirtualBoxVMWare安装windows,我采用的是VirtualBox + Windows7 32位
  2. 安装Windows SDK
    建议下载完整包进行安装,完整包地址

  3. 安装CMake
    我安装的是3.6.2版本

  4. 安装JDK
    我安装的是JDK8 update 101,加上JAVA_HOME环境变量(路径中不能有空格)

  5. 设置Platform环境变量
    根据目标平台设置该环境变量

    1
    2
    set Platform=x64 (when building on a 64-bit system)
    set Platform=Win32 (when building on a 32-bit system)
  6. 安装Maven
    我安装的是3.3.9,设置M2_HOME环境变量,并将%M2_HOME%\bin加到PATH环境变量中

  7. 解压Hadoop源代码
    我使用的是2.7.1版本

  8. 安装Cygwin
    选择http://mirrors.sohu.com/cygwin这个源,速度比较快。假设安装路径为C:\cygwin,将C:\cygwin\bin加入到PATH环境变量中,以便可以在windows命令行执行sh等命令

  9. 安装protobuf
    官方地址,我使用的是protoc-2.5.0-win32,解压后将目录加入到PATH变量中

  10. 执行构建
    Windos SDK的命令行执行以下命令:

    1
    2
    cd %HADOOP_HOME%
    mvn package -Pdist -Dmaven.javadoc.skip=true -DskipTests

常见的内存泄漏及解决方法

JVM内存泄漏的原因

所谓JVM内存泄漏,就是在JVM做GC操作时,我们认为本来应该”没有用”的对象,没有被JVM回收掉,其主要原因是因为从JVM的GC ROOT出发,存在一条路径可以寻找到该对象。

常见的GC ROOT主要有以下几种:

  1. System Class - 由系统类加载器(system class loader)加载的对象
  2. Thread - 运行中的线程对象(经常导致内存泄漏的原因,由于Thread对象中持有一个加载该线程类的ClassLoader对象,如果该线程不终止–>ClassLoader对象无法释放–>方法区中该ClassLoader加载的类无法释放–>最终有可能导致方法区内存溢出)
  3. Busy Monitor - 用于监控的对象
  4. Native Stack - 本地方法栈引用的对象?

1. MySQL驱动

如果应用中使用了MySQL 5.1.24+的JDBC驱动的话,在不停止应用server,重新部署应用的时候,会发现JVM的Pergem区有很多内存不能回收,通过VisualVM等工具,可以看到有一个名为Abandoned connection cleanup thread的线程还在后台跑,导致应用的ClassLoader无法释放。

解决方法1: 创建一个类似以下代码的Listener

1
2
3
4
5
6
7
8
9
10
11
12
public class MysqlConnectionClearupListener implements ServletContextListener {
public void contextDestroyed(ServletContextEvent arg0) {
try {
AbandonedConnectionClearupThread.shutdown();
} catch (...) {
...
}
}
...
}

然后在web.xml里配置该Listener

1
2
3
<listener>
<listener-class>MysqlConnectionClearupListener</listener-class>
</listener>

缺点: 该方法需要在应用中引入jdbc的驱动包,不太优雅,而且由于JDBC驱动的注册是JVM级别的,如果该server上有其他应用也使用MySQL的话,有可能产生其他问题。

解决方法2: 由应用服务器负责加载MySQL的驱动

将MySQL的jdbc驱动包放到应用服务器的classpath,例如tomcat中的lib目录,由应用服务器的ClassLoader来加载,并启动Abandoned connection cleanup thread线程,这样应用的ClassLoader就无需对MySQL的类进行装载和卸载。

2. commons-pool

使用commons-pool组件,如果timeBetweenEvictionRunsMillis属性的值设为>0的值,则会在后台启动一个名为common-pool-EvictionTimer的线程,如果在应用卸载时(JVM没有重启),没有调用pool的close方法,则该线程不会停止,导致应用ClassLoader无法回收,从而导致方法区内存泄漏。

AWS入门

用户密钥

使用命令行工具,第一步要使用aws configue命令,输入Access Key IDAccess Key

DynamoDB

  1. 建索引时可以指定projected columns,这些列会加入到index里,按索引查询时可直接得到该列,默认情况下,会将除index外的所有列设为projected columns

  2. 索引不存空值,所以根据索引无法查询符合空值的记录

事件

  1. Kinesis可以做到几乎实时(1秒以内)的消息获取,SQS不行,只能做到10秒级别,消息有序

  2. SWF主要中心化协调工作流的各个工作步骤,提供任务流的总线

  3. SQS消息不保证顺序,消息不会自动删除,需要消费者显式删除

实验

https://china.qwiklab.com

数据收集

依据数据的时候方式,决定使用哪种收集方式:

  1. 实时使用:流式收集
  2. 批量使用:文件收集(存到S3)
  3. 随机读取:存到DynamoDB

S3

一个文件肯定是放在一个分区中,所以当MR读取S3文件时,文件大小(可分割的文件)最好控制在2-4G,否则可能达到S3的性能瓶颈

Redshift

  1. MPP架构
  2. 支持标准SQL
  3. 通常是高价值数据最终归属

EMR

  1. 提供出来的HDFS是通过本地磁盘提供的(虚拟机重启,会在另一台物理机起动,所以实例存储上的资料会丢失)

Redshift

  1. 载入数据时,用copy命令,且要切分文件,以使用计算节点的并发量;不要用insert命令,会经过leader节点

Java访问资源

从classpath中读取文件

个人觉得使用Class.getResourceAsStream(path)较为靠谱,Class.getResource(path)在JBoss中使用,获取到的路径会有问题

1
2
3
InputStream in = ResourceDemo.class.getResourceAsStream("aa.properties");
Properties prop = new Properties();
prop.load(in);

对文件(目录)操作(JDK7以后)

使用java.nio.file.Filesjava.nio.file.Pathsjava.nio.file.Path结合比较好

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Path path = Paths.get("/");
Files.walkFileTree(path, new FileVisitor<Path>() {
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
System.out.println("dir:" + dir);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
System.out.println("file:" + file);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
return FileVisitResult.CONTINUE;
}
});

本地(内嵌式)DNS服务

参考资料:
Java DNS查询内部实现
Local Managed DNS (Java)
InetAddress类之创建新的InetAddress对象

问题:应用中通过域名或hostname访问外部应用,但dns服务器上又没有它们的ip映射关系
目的:开发一个内嵌式的DNS服务,可通过配置注册hostname和ip的映射关系
步骤:

  1. 在源代码的META-INF/services目录增加一个sun.net.spi.nameservice.NameServiceDescriptor文件,内容为

    1
    io.jasonlu.learning.dnslookup.LocalManagedNameServiceDescriptor
  2. LocalManagedNameServiceDescriptor的内容如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    public class LocalManagedNameServiceDescriptor implements NameServiceDescriptor {
    @Override
    public NameService createNameService() throws Exception {
    return new LocalManagedNameService();
    }
    @Override
    public String getProviderName() {
    return "dnsljh";
    }
    @Override
    public String getType() {
    return "dns";
    }
    public LocalManagedNameServiceDescriptor() {
    System.out.println("hello, you're in LocalManagedNameServiceDescriptor");
    }
    }

LocalManagedNameService主要代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/**
* Created by louz on 2016/12/15.
*/
public class LocalManagedNameService implements NameService {
private Map<String, InetAddress> managedAddresses = new HashMap<>();
public LocalManagedNameService() {
try {
// 此处可通过其他方式初始化managedAddresses
InetAddress address = InetAddress.getByName("10.1.1.1");
managedAddresses.put("mockhost", address);
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
@Override
public InetAddress[] lookupAllHostAddr(String s) throws UnknownHostException {
InetAddress inetAddress = managedAddresses.get(s);
if (inetAddress == null) {
throw new UnknownHostException();
}
return new InetAddress[]{inetAddress};
}
@Override
public String getHostByAddr(byte[] bytes) throws UnknownHostException {
throw new UnknownHostException("method not implement yet");
}
}

  1. 在程序的启动参数上增加:

    1
    -Dsun.net.spi.nameservice.provider.1=dns,dnsljh -Dsun.net.spi.nameservice.provider.2=default
  2. 客户端示例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class DnsLookUpTest {
    @Test
    public void testLookup() throws UnknownHostException {
    String googleHost = InetAddress.getByName("www.google.com").getHostAddress();
    System.out.println(googleHost); // www.google.com没有在managedAddress中,因此按默认方式通过外部DNS获取其对应ip
    String mockhost = InetAddress.getByName("mockhost").getHostAddress();
    // mockhost在managedAddress中,因此获取到其ip为10.1.1.1
    assertThat(mockhost, is("10.1.1.1"));
    }
    }

JDK解析XML

转 Java 语言的 XPath API

DB2常见问题

DB2如何在命令行做catalog

catalog的作用: 把远程DB2数据库信息加载到本地,以便可以使用本地DB2客户端访问远程数据库。

步骤:
第一步:将远程数据库所在服务器的node信息catalog到本地,命令如下:

1
db2 catalog tcpip node <alias node-name> remote <remote hostname or ip> server <remote port>

第二步:将远程数据库信息catalog到本地,命令如下:

1
db2 catalog database <remote database name> as <alias name> at node <alias node-name>

其中<alias node-name>与第一步中的名字保持一致;<alias name>是数据库在本地的别名

第三步:使用如下命令就可以连上远程数据库:

1
db2 connect to <alias name>