Hadoop

From MetaCentrum
Jump to navigation Jump to search

(English version)

Základní informace

Hadoop je software usnadňující paralelní zpracování velkého množství dat za použití algoritmu MapReduce.

Hadoop zajišťuje distribuci výpočtů zpracovávajících data na mnoho výpočetních uzlů a následné sesbírání výsledků. Není vhodný pro všechny druhy výpočtů, jen pro takové výpočty, v nichž je možné paralelně zpracovat velké množství nezávislých kousků dat a sesbírat výsledky, například hledání jehly v kupce sena.

V současné době je Hadoop provozován jako virtuální klastr v rámci cloudové infrastruktury.

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

2.3.6 - data warehouse software facilitates

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 init
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 \
  ...