Hadoop

From MetaCentrum
Jump to navigation Jump to search

(English version)

Základní informace

Hadoop je možné pustit v cloudu.

  • dokumentace ke cloudu: https://cloud.gitlab-pages.ics.muni.cz/documentation/
  • image (public):
    • id: 6e0bcd58-a1fc-4d57-a6a0-850837bcf9e5
    • název: debian-9-x86_64_hadoop
  • testovací image (community):
    • id: (viz openstack image list --community, vlastník 85c8a74440e94d4b91d0dc067308cb64)
    • název: debian-9-x86_64_hadoop_rc

Instalovaný SW

Distribuce BigTop 1.5.0.

Hadoop 2.10.1 - distributed storage and processing of very large data sets

HBase 1.5.0 - distributed, scalable, big data store

Hive 2.3.6 - data warehouse software facilitates

Spark 2.4.5 - fast and general engine for large-scale data processing

Vyrobení Hadoopu v cloudu

All-in-one single machine Hadoop vyžaduje > 4GB RAM (např. flavour standard.large).

Poznámky (více viz dokumentace k OpenStack):

  • security groups: ve výchozím nastavení se používá defaults
  • ssh key: vyrobit nebo uploadovat veřejnou část do OpenStack

OpenStack CLI - jednostrojový

Spuštění stroje:

# příklad parametrů
image=debian-9-x86_64_hadoop
network=auto_allocated_network
sshkey=openstack
public_network=public-muni-147-251-124-GROUP
name=hadoop

# stroj
openstack server create --image="$image" --flavor standard.large --network "$network" --key-name "$sshkey" "$name"

# veřejná IP
ip=$(openstack floating ip create -c floating_ip_address -f value "$public_network")
openstack server add floating ip "$name" "$ip"

Přihlášení na stroj:

ssh debian@$ip

Spustit instalaci (běží cca 5 minut):

sudo /usr/local/sbin/hadoop-single-setup.sh

OpenStack GUI (Horizon) - jednostrojový

Compute -> Images -> "debian-9-x86_64_hadoop" -> Launch

  • Details -> Instance Name: název
  • Flavor: minimálně standard.large (> 4GB RAM)
  • Networks: auto_allocated_network
  • Security Groups: minimálně port 22 (ssh), lze mít i plně otevřené (autentizace je zapnuta)
  • Key Pair: pro přístup na konzoli je potřeba
  • Launch instance

Compute -> Instances -> (stroj) -> Associate floating IP

Přihlášení na stroj:

ssh debian@$ip

Spustit instalaci (běží cca 5 minut):

sudo /usr/local/sbin/hadoop-single-setup.sh

Terraform - clusterový

Vyžaduje nástroj Terraform.

Stažení terraform předpisů:

git clone https://gitlab.cesnet.cz/702/HADOOP/terraform

Vyrobení souboru mycluster.auto.tfvars (nahradit mydomain, PUBLIC_IP a SSH_KEYPAIR_NAME za skutečné hodnoty):

domain = 'mydomain'
floating_ip = 'PUBLIC_IP'
n = 3
security_trusted_cidr = [
    "0.0.0.0/0",
    "::/0",
]
ssh = 'SSH_KEYPAIR_NAME'
# local_network = 'auto_allocated_network'

Spuštění terraform:

terraform apply

Viz také terraform#build-cluster.

Použití

Kterak se přihlásit

  1. ssh na použitou veřejnou floating IP pomocí ssh klíče (kde $ip je veřejná IP):
    ssh debian@$ip
  2. získání lístku
    kinit < password.txt

V rámci clusteru běží lokální Kerberos server:

  • realm: HADOOP
  • principal: debian@HADOOP
  • heslo: v souboru /home/debian/password.txt
  • lokální doména: terra
  • konfigurace: /etc/krb5.conf.d/hadoop

Základní test instalace

Vypsání HDFS:

hdfs dfs -ls /

Testovací sada:

/opt/hadoop-tests/run-tests.sh

Vzdálený přístup

Kerberos klient

Postup nastavení lokálního klienta pro přístup:

  1. zkontrolovat/přidat řádek includedir /etc/krb5.conf.d/ v /etc/krb5.conf
  2. skript (kde $ip je veřejná floating ip, nebo jméno serveru, pokud zadané v /etc/hosts - viz #Webový přístup):
    cat > /tmp/hadoop <<EOF
    [realms]
        HADOOP = {
            kdc = $ip
            admin_server = $ip
            default_domain = terra
        }
    
    [domain_realm]
        .terra = HADOOP
        terra = HADOOP
    EOF
    sudo mv /tmp/hadoop /etc/krb5.conf.d/

Webový přístup

Přes web lze přistupovat k datům (WebHDFS, read-only) nebo jsou k dispozici servisní informace clusteru. Pro webový přístup k Hadoop clusteru je nutný protokol SPNEGO (Kerberos přes HTTP(S)).

K Hadoopu musí být přistupováno přes DNS jméno odpovídající lokálně použitému jménu (např. hadoop.terra). Je potřeba přidat záznam do /etc/hosts (kde $ip je veřejná IP adresa):

echo "$ip hadoop.terra" >> /etc/hosts

Dále povolení protokolu SPNEGO v prohlížeči:

  • firefox [1]:
    1. about:config
    2. nastavit network.negotiate-auth.trusted-uris=terra ("terra" je použitá doména)
    3. pro Windows:
      1. nainstalovat Kerberos
      2. nastavit také network.auth.use-sspi=false
  • chrome: [2]
    • parametr --auth-server-whitelist=terra ("terra" je použitá doména)
    • trvalé nastavení: vyrobit soubor /etc/opt/chrome/policies/managed/hadoop-metacentrum.json ("terra" je použitá doména):
      {
        "AuthServerWhitelist": "terra",
        "AuthNegotiateDelegateWhitelist": "terra"
      }
    • Windows: SPNEGO a Kerberos zřejmě není podporováno

Získání lístku (heslo na stroji v cloudu v ~debian/password.txt):

kinit debian@HADOOP

Poznámka: pozor na sítích za NAT, tam nutno použít address-less lístek, volba -A

Výsledek (nahradit "hadoop.terra" za skutečné jméno serveru):

curl

Přístup přes SPNEGO pomocí parametrů: --negotiate -u :

Nejprve je nutno získat lístek:

kinit debian@HADOOP

Poznámka: pozor na sítích za NAT, tam nutno použít address-less lístek, volba -A

Informace o souboru (kde $HDFS_PATH je cesta na HDFS):

curl -i --negotiate -u : "http://hadoop.terra:50070/webhdfs/v1/$HDFS_PATH?op=LISTSTATUS"

Stažení souboru (kde $HDFS_PATH je cesta na HDFS):

curl -L --negotiate -u : "http://hadoop.terra:50070/webhdfs/v1/$HDFS_PATH?op=OPEN" -o file

Upload souboru dvoukrokově (kde $HDFS_PATH je cesta na HDFS, $LOCAL_FILE je lokální soubor):

# 1) vytvoří soubor a vrátí odkaz na datový uzel v 'Location'
curl --negotiate -u : -i -X PUT "http://hadoop.terra:50070/webhdfs/v1${HDFS_PATH}?op=CREATE" | tee curl.log
# URL z headru 'Location'
data_url="`grep ^Location: curl.log | cut -c11- | tr -d '\r'`"

# 2) upload dat
curl -i -T ${LOCAL_FILE} ${data_url}

Hadoop

Informace

  • max. délka úlohy omezena:
    • max. refresh time uživatelského Kerberos ticketu
    • max. lifetime uživatelských tokenů Hadoopu, 7 dní
  • zabezpečení dat: řešen přístup k datům, konzistence dat, ale lokálně se nešifruje

Příklady

Na frontendu (viz #Základní informace), přístup přes Kerberos:

hadoop jar /usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar pi 2 10

hdfs dfs -put /etc/hadoop/conf input
hadoop jar /usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar grep input output 'dfs[a-z.]+'
hdfs dfs -cat output/*

hadoop jar /usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar randomwriter out/

hadoop jar /usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar teragen 100 gendata
hadoop jar /usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar terasort gendata sorted
hadoop jar /usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar teravalidate gendata reportdata

Získání logů

yarn application -list
yarn logs -applicationId APPLICATION_ID

HBase

Viz Hadoop HBase.

Hive

Informace

Správa přístupů:

  • řešena na úrovni HDFS ==> po vytvoření databáze je možno řídit práva na HDFS adresáři /user/hive/warehouse/${DATABASE}
  • výchozí práva na databázi po vytvoření jsou včetně čtení a zápisu pro všechny uživatele Hadoopu

Připojení

  • beeline klient ("$HIVE_DB" nahradit za název databáze):
 beeline -u "jdbc:hive2://`hostname -f`:10000/$HIVE_DB;principal=hive/`hostname -f`@HADOOP"
  • beeline klient - připojení přes příkaz '!connect' ("HIVE_DB" nahradit za název databáze, "hadoop.terra" je použitý hostname):
 beeline
   !connect jdbc:hive2://hadoop.terra:10000/HIVE_DB;principal=hive/hadoop.terra@HADOOP  
  • java kód:
String url = "jdbc:hive2://hadoop.terra:10000/HIVE_DB;principal=hive/hadoop.terra@HADOOP";
Connection con = DriverManager.getConnection(url);
  • hive klient (deprecated, podporovaný je beeline klient):
hive

Detaily viz hive cli --help.

Integrace s HBase

https://cwiki.apache.org/confluence/display/Hive/HBaseIntegration

Integrace se Spark

Viz. #Příklady 3.

Příklady

HIVE_DB="`id -un`_test"
JDBC_URL="jdbc:hive2://`hostname -f`:10000/$HIVE_DB;principal=hive/`hostname -f`@HADOOP"

# vyrobení databáze <USER>_test
beeline -u $JDBC_URL -e "CREATE DATABASE $HIVE_DB"

# použití <USER>_test
beeline -u $JDBC_URL
  CREATE TABLE pokes (foo INT, bar STRING);
  CREATE TABLE invites (foo INT, bar STRING) PARTITIONED BY (ds STRING);
  SHOW TABLES;
  SELECT a.foo FROM invites a WHERE a.ds='2008-08-15';
  DESCRIBE invites;
  
  INSERT INTO pokes VALUES (1, 'A'), (2, 'B');
  INSERT INTO invites PARTITION (ds='2015-01-01') SELECT * FROM pokes;
  INSERT INTO invites PARTITION (ds='2015-12-11') SELECT * FROM pokes;

Spark

Informace

Podporovány režimy:

  • Spark přes YARN (cluster): --master yarn --deploy-mode cluster
  • Spark přes YARN (client): --master yarn --deploy-mode client
  • lokální Spark: --master local

Příklady

  • výpočet pí
spark-submit --class org.apache.spark.examples.SparkPi --deploy-mode cluster --master yarn `ls /usr/lib/spark/examples/jars/spark-examples*.jar | head -n 1` 10
# (nahradit APPLICATION_ID za skutečné ID)
yarn logs --applicationId APPLICATION_ID
  • volání map/reduce
    (nahradit LOGIN za uživatelské jméno)
hdfs dfs -put /etc/passwd

spark-shell --master yarn
  val file = sc.textFile("hdfs:///user/LOGIN/passwd")
  val counts = file.flatMap(line => line.split(" ")).map(word => (word, 1)).reduceByKey(_ + _)
  counts.saveAsTextFile("hdfs:///user/LOGIN/spark-output")

hdfs dfs -cat ./spark-output/\*
hdfs dfs -rm -r ./spark-output ./passwd
  • použití Hive metastore
    (nahradit LOGIN za uživatelské jméno, předpokládá databázi vyrobenou v #Příklady_2)
spark-shell
  sql("FROM LOGIN_test.pokes SELECT *").collect().foreach(println)
  sql("FROM LOGIN_test.pokes SELECT *").show()
  • puštění vlastní aplikace

Je potřeba zkopírovat /usr/lib/spark/lib/spark-assembly.jar, přibalit tam své knihovny, nakopírovat na HDFS a předhodit Sparku:

# (nahradit /user/hawking/lib/spark-assembly.jar za skutečnou cestu na HDFS)
spark-submit --master yarn --deploy-mode cluster \
  --conf spark.yarn.jar=hdfs:///user/hawking/lib/spark-assembly.jar \
  ...