/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.hadoop.hive.llap;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import org.apache.hadoop.io.DataInputBuffer;
import org.apache.hadoop.io.DataOutputBuffer;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.Writable;
import org.apache.hadoop.security.token.Token;
import org.apache.hadoop.yarn.api.records.ApplicationId;
import org.apache.tez.common.security.JobTokenIdentifier;
import org.apache.tez.common.security.JobTokenSecretManager;
public class SubmitWorkInfo implements Writable {
private ApplicationId fakeAppId;
private long creationTime;
private byte[] vertexSpec, vertexSpecSignature;
// This is used to communicate over the LlapUmbilicalProtocol. Not related to tokens used to
// talk to LLAP daemons itself via the securit work.
private Token<JobTokenIdentifier> token;
private int vertexParallelism;
public SubmitWorkInfo(ApplicationId fakeAppId, long creationTime,
int vertexParallelism, byte[] vertexSpec, byte[] vertexSpecSignature) {
this.fakeAppId = fakeAppId;
this.token = createJobToken();
this.creationTime = creationTime;
this.vertexSpec = vertexSpec;
this.vertexSpecSignature = vertexSpecSignature;
this.vertexParallelism = vertexParallelism;
}
// Empty constructor for writable etc.
public SubmitWorkInfo() {
}
public ApplicationId getFakeAppId() {
return fakeAppId;
}
public String getTokenIdentifier() {
return fakeAppId.toString();
}
public Token<JobTokenIdentifier> getToken() {
return token;
}
public long getCreationTime() {
return creationTime;
}
@Override
public void write(DataOutput out) throws IOException {
out.writeLong(fakeAppId.getClusterTimestamp());
out.writeInt(fakeAppId.getId());
token.write(out);
out.writeLong(creationTime);
out.writeInt(vertexParallelism);
if (vertexSpec != null) {
out.writeInt(vertexSpec.length);
out.write(vertexSpec);
} else {
out.writeInt(0);
}
if (vertexSpecSignature != null) {
out.writeInt(vertexSpecSignature.length);
out.write(vertexSpecSignature);
} else {
out.writeInt(0);
}
}
@Override
public void readFields(DataInput in) throws IOException {
long appIdTs = in.readLong();
int appIdId = in.readInt();
fakeAppId = ApplicationId.newInstance(appIdTs, appIdId);
token = new Token<>();
token.readFields(in);
creationTime = in.readLong();
vertexParallelism = in.readInt();
int vertexSpecBytes = in.readInt();
if (vertexSpecBytes > 0) {
vertexSpec = new byte[vertexSpecBytes];
in.readFully(vertexSpec);
}
int vertexSpecSignBytes = in.readInt();
if (vertexSpecSignBytes > 0) {
vertexSpecSignature = new byte[vertexSpecSignBytes];
in.readFully(vertexSpecSignature);
}
}
public static byte[] toBytes(SubmitWorkInfo submitWorkInfo) throws IOException {
DataOutputBuffer dob = new DataOutputBuffer();
submitWorkInfo.write(dob);
return dob.getData();
}
public static SubmitWorkInfo fromBytes(byte[] submitWorkInfoBytes) throws IOException {
DataInputBuffer dib = new DataInputBuffer();
dib.reset(submitWorkInfoBytes, 0, submitWorkInfoBytes.length);
SubmitWorkInfo submitWorkInfo = new SubmitWorkInfo();
submitWorkInfo.readFields(dib);
return submitWorkInfo;
}
private Token<JobTokenIdentifier> createJobToken() {
String tokenIdentifier = fakeAppId.toString();
JobTokenIdentifier identifier = new JobTokenIdentifier(new Text(
tokenIdentifier));
Token<JobTokenIdentifier> sessionToken = new Token<JobTokenIdentifier>(identifier,
new JobTokenSecretManager());
sessionToken.setService(identifier.getJobId());
return sessionToken;
}
public byte[] getVertexBinary() {
return vertexSpec;
}
public byte[] getVertexSignature() {
return vertexSpecSignature;
}
public int getVertexParallelism() {
return vertexParallelism;
}
}